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

有这样一个需求,界面上有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 第一章 系统设计要求 2 第二章 硬件总体设计方案 3 第三章软件总体设计方案 10 第四章 课程设计结果分析 22 第五章 总结 23 参考文献 24 电子钟设计 摘要:单片机 即单片微型计算机。(Single-Chip Microcomputer ),是 集 CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。他体积小,成本低,功能强,广泛应用于工 业自动化上和智能产品。时钟,自从它被发明的那天起,就成为了人类的好朋友,但随 着时间的推移,科学技术的不断发展,时钟的应用越来越广范,人们对时间计量的精度 要求也越来越高。怎样让时钟更好的为人民服务,怎样让我们的老朋友再次焕发青春呢 ?这就要求我们不断设计出新型的时钟,来不断满足人们的日常生活需要。然而市场上 的时钟便宜的比较笨重,简单实用的又比较昂贵。那么,有没有一款既简单实用价格又 便宜的时钟呢? 我的毕业设计设想:可不可以利用单片机功能集成化高,价格又便宜的特点设计一 款结构既简单,价格又便宜的单片机电子时钟呢? 基于这种情况,我多方查阅资料,反复论证设计出了这款既简单实用,又价 格便宜的——多功能电子时钟 关键词:单片机 时钟 计时 第一章 系统设计要求 1.1 基本功能 (1)能够显示时分秒 (2)能够调整时分秒 1.2 扩展功能 (1)能够任意设置定时时间 (2)定时时间到闹铃能够报警 (3)实现了秒表功能 第二章 硬件总体设计方案 本次设计时钟电路,使用了AT89C51单片机芯片控制电路,单片机控制电路简单且 省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分 、秒,用一扬声器来进行定时提醒,同时使用C语言程序来控制整个时钟显示,使得编程 变得更容易,这样通过四个模块:键盘、芯片、扬声器、显示屏即可满足设计要求。 2.1系统功能实现总体设计思路 此设计原理框图如图2- 1所示,此电路包括以下四个部分:单片机,键盘,闹铃电路及显示电路。 图2-1 设计原理框图 2.2各部分功能实现 1. 单片机发送的信号通过程序控制最终在数码管上显示出来。 2. 单片机通过输出各种电脉冲信号来驱动控制各部分正常工作。 3. 为使时钟走时与标准时间一致,校时电路是必不可少的,键盘用来校正数码管上显示 的时间。 4. 单片机通过控制闹铃电路来完成 定时闹钟的功能。 2.3系统工作原理 设计的电路主要由四模块构成:单片机控制电路,显示电路、闹铃电路以及校正电 路。 详细电路功能图如图2-2: 图2-2 详细电路功能图 本设计采用C语言程序设计,使单片机控制数码管显示时、分、秒,当秒计数计满 60时就向分进位,分计数器计满60后向时计数器进位,小时计数器按"23翻0"规律计数。 时、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发生误差的时候可以 用校时电路进行校正。设计采用的是时、分、秒显示,单片机对数据进行处理同时在数 码管上显示。 2.4时钟各功能分析及图解 2.4.1电路各功能图解分析 (1) 时钟运行图 仿真开始运行时,或按下key4键时,时钟从12:00:00开始运行,其中key2键对分 进行调整,key3对小时进行调整,key6可以让时钟暂停。 时钟运行图如图 2-3 所示: 图2-3 时钟运行图 (2)秒表计时图 当按下key1键进入秒表计时状态,key6是秒表暂停键,可按key4键跳出秒表计时状 态。 如图2-4: 图2-4 秒表计时图 (3)闹铃设置图及运行图 当按下key5,开始定时,分别按key2调分,key3调时设置闹铃时间,然后按下key 4键恢复时钟运行状态(图2-5)当闹铃设置时间到时,蜂鸣器将发出10秒中蜂鸣声(图2- 6)。 图2-5 闹铃时间设置图 图2-6 闹铃运行图 该数字钟是用一片AT89C51单片机通过编程去驱动8个数码管实现的。通过6个开关控 制,从上到下6个开关KEY1- KEY6的功能分别为:KEY1,切换至秒表;KEY2,调节时间,每调一次时加1;KEY3, 调节时间,每调一次分加1;KEY4,从其它状态切换至时钟状态;KEY5,切换至闹钟设置 状态,也可以对秒表清零;KEY6,秒表暂停.控制键分别与P1.0~P1.5口连接.其中: A通过P2口和P3口去控制数码管的显示如图所示P2口接数码管的a——g端,是控制输出 编码,P3口接数码管的1——8端,是控制动态扫描输出. B从P0.0输出一个信号使二极管发光,二极管在设置的闹钟时间到了时候发光,若有 乐曲可以去驱动扬声器实现。 2.4.2电路功能使用说明 (1) 各个控制键的功能:可对时间进行校准调节(只能加1);按下设置键数字时钟进入闹 钟设置状态,设置闹钟的时间;时加1、分加1键是在校准时间时或设置闹钟时间对小 时数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

百里杨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值