有这样一个需求,界面上有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,即可下载。