做个产品网站要多少钱,网络管理系统平台有哪些,天津建设工程网站,网站建设分金手指排名十二文章目录 QLCDNumber核心属性倒计时小程序倒计时小程序相关问题 QLCDNumber核心属性
QLCDNumber是专门用来显示数字的控件#xff0c;类似于这样#xff1a; 属性说明intValue获取的数字值(int).value获取的数字值(double)和intValue是联动的例如value设为1.5#xff0c;in… 文章目录 QLCDNumber核心属性倒计时小程序倒计时小程序相关问题 QLCDNumber核心属性
QLCDNumber是专门用来显示数字的控件类似于这样 属性说明intValue获取的数字值(int).value获取的数字值(double)和intValue是联动的例如value设为1.5intValue值就是2设置value和intValue的方法名为displaydigitCount显示几位数字mode数字显示形式QLCDNumber::Dec显示十进制只有十进制才能显示小数点后的内容QLCDNumber::Hex显示十六进制QLCDNumber::Bin显示二进制QLCDNumber::Oct显示八进制segmentStyle设置显示风格QLCDNumber::Flat平面显示风格数字呈现在平坦的表面QLCDNumber::Outline轮廓风格显示数字有清晰的轮廓和阴影效果QLCDNumber::Filled填充显示风格数字被填充颜色与背景区分smallDecimalPoint设置较小的小数点
倒计时小程序
使用QLCDNumber显示一个初始值每隔一秒数字减一一直到0
不同显示风格 设置起始10秒
ui-lcdNumber-display(10);接下来的关键就是“每秒钟-1”这个效果。
这个属于——周期性执行某个逻辑这类组件叫做“定时器”。
在C标准库并没有提供定时器实现Boost里面实现了。
另外Qt里面也封装了对应的计算器而且封装了信号槽机制 QTimer类 通过这个类创建出的对象就会产生一个timeout这样的信号可以通过start方法来开启定时器并且设定参数触发timeout信号的周期。 然后这样就可以结合connect把这个timeout信号绑定到需要的槽函数当中就可以修改执行逻辑修改LCDNumber中的数字了 widget.h
#ifndef WIDGET_H
#define WIDGET_H#include QWidgetQT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();void handle();
private:Ui::Widget *ui;QTimer *timer;
};
#endif // WIDGET_H
widget.cpp
#include widget.h
#include ui_widget.h
#includeQTimer
#includeQDebug
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);ui-lcdNumber-display(10);//创建QTimer实例timer new QTimer(this);//QTimer的timeout信号和槽函数链接connect(timer, QTimer::timeout, this, Widget::handle);//启动计时器 参数为触发周期 单位是 mstimer-start(1000);
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{//获取lcdNumber数字int val ui-lcdNumber-intValue();if(val 0){timer-stop();return;}ui-lcdNumber-display(val - 1);
}倒计时小程序相关问题
上面是借助QTimer完成的倒计时功能也可以使用while循环每一秒减一来实现 Tips Windows提供了Sleep的接口只能在Visual Studio里面使用 而目前Qt采用的是mingwwindows版本的gcc是无法使用Sleep的 C11标准库引入了sleep操作sleep_for #include widget.h
#include ui_widget.h
#includethread
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);int val ui-lcdNumber-intValue();while(true){std::this_thread::sleep_for(std::chrono::seconds(1));if(val 0){break;}ui-lcdNumber-display(--val);}
}Widget::~Widget()
{delete ui;
}运行程序之后发现并没有显示窗口而是运行完毕之后才显示计算完毕的窗口 这是因为这段逻辑都是在构造函数当中完成的构造完毕之后才会显示
#include widget.h#include QApplicationint main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}如果构造函数当中创建一个线程然线程去执行这段逻辑是否可以
#include widget.h
#include ui_widget.h
#includethread
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);// int val ui-lcdNumber-intValue();
// while(true)
// {
// std::this_thread::sleep_for(std::chrono::seconds(1));
// if(val 0)
// {
// break;
// }
// ui-lcdNumber-display(--val);
// }std::thread t([this](){int val this-ui-lcdNumber-intValue();while(true){std::this_thread::sleep_for(std::chrono::seconds(1));if(val 0){break;}ui-lcdNumber-display(--val);}});
}Widget::~Widget()
{delete ui;
}运行程序之后报错了 这是因为Qt里面界面有一个专门的线程去负责维护更新的主线程main函数所在线程 对于GUI来说内部包含了很多隐藏状态Qt为了保证修改界面的工程中线程安全不会受到影响Qt禁止了其他线程直接修改界面。 上面的操作就是修改界面的操作。 因此Qt为了保证线程的按照直接要求所有对界面的修改操作必须在主线程当中完成。
对于Qt的槽函数来说默认情况下槽函数都是由主线程调用的在槽函数当中修改界面没有任何问题。
主线程当中有一个事件循环在main函数当中
#include widget.h#include QApplicationint main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec(); //事件循环
}a.exec会使主线程进入事件循环每执行一次循环就会有固定的事情要做
综上所述使用定时器实现倒计时是较为合理的方案后续如果有周期性修改界面状态的操作优先考虑定时器