“开始”与“暂停”状态切换实现思路

有这样一个需求,界面上有1个按钮,点击之后在“开始”和“暂停”间切换,分别执行对应的逻辑。

可能会有人这样写:

 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QToolBar>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QMenu* menu = menuBar()->addMenu("Menu");
    QToolBar* toolBar = addToolBar("ToolBar");

    QAction* startAction = menu->addAction("start");
    toolBar->addAction(startAction);

    connect(startAction, &QAction::triggered, this, &MainWindow::onStartActionClicked);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onStartActionClicked()
{
    QAction* startAction = (QAction*)sender();
    if (startAction->text() == "start")
    {
        qDebug() << "start play...";
        startAction->setText("pause");
    }
    else
    {
        qDebug() << "pause play";
        startAction->setText("start");
    }
}

有没有赶脚很low。。。

自己去处理开始、暂停的状态转换,感觉很麻烦,为什么不在界面上进行限制呢,让界面只能输入复合要求的状态(只能点击开始或者暂停,而不能2个一起点击)。

同时将开始与暂停的逻辑完全分开处理,像上面那样2个功能糅合到一块了。

于是乎,有了这样一个小改进。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QToolBar>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QMenu* menu = menuBar()->addMenu("Menu");
    QToolBar* toolBar = addToolBar("ToolBar");

    QAction* startAction = menu->addAction("start");
    QAction* pauseAction = menu->addAction("pause");
    pauseAction->setVisible(false);

    toolBar->addAction(startAction);
    toolBar->addAction(pauseAction);

    // 实现自动反转action
    connect(startAction, &QAction::triggered, [=] {
        startAction->setVisible(false);
        pauseAction->setVisible(true);
    });
    connect(pauseAction, &QAction::triggered, [=] {
        pauseAction->setVisible(false);
        startAction->setVisible(true);
    });

    // 正常信号处理
    connect(startAction, &QAction::triggered, this, &MainWindow::onStartActionClicked);
    connect(pauseAction, &QAction::triggered, this, &MainWindow::onPauseActionClicked);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onStartActionClicked()
{
    qDebug() << "start play...";
}

void MainWindow::onPauseActionClicked()
{
    qDebug() << "pause play";
}

效果:

是否感觉状态切换什么的跟自己没关系了。

这只是一个小栗子,引出的思考是:

条条大路通罗马,不过有的罗马路要先去太阳,然后再折回来,有的可以从地心打个洞,直接从地底跳出来。哈哈

思路不同,实现的方法就不一样,然鹅软件的设计是一门艺术。深有体会,好的设计思路可能会让你事半功倍。

 


若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

本文涉及工程代码,公众号回复:30StartPauseButton,即可下载

在这里插入图片描述

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百里杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值