信号:当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用
槽:用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制
连接:信号和槽通过connect建立连接
连接信号与槽是connect()函数,原型如下:
bool QObject::connect ( const QObject * sender, const QMetaMethod & signal, const QObject * receiver, const QMetaMethod & method, Qt::ConnectionType type = Qt::AutoConnection ) [static] //组后一个参数一般不加,保持默认
它可以把一个对象(sender)发送的信号(signal)和接收者(receiver)的槽函数(method)关联起来,这样当信号产生时与之关联的槽函数就会被执行。在connect函数里面我们用到了Qt提供的两个宏SIGNAL()和SLOT();这是Qt要求的,要关联信号和槽必须借助于这两个宏,两个宏的定义如下:
#define SLOT(name) "1"#name
#define SIGNAL(name) "2"#name
通过这两个宏,就可以把我们传递进去的槽和信号的名字转化成字符串,并在这两个字符串前面加上附加的字符。
如:
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(myslots()));
经过moc处理后就变成:
connect(ui->pushButton, "2clicked()", this, "1myslots()");
槽可以被取消链接:
bool QObject::disconnect ( const QObject * sender, const QMetaMethod & signal, const QObject * receiver, const QMetaMethod & method ) [static]
这种情况并不经常出现,因为当一个对象delete之后,Qt自动取消所有连接到这个对象上面的槽。
要连接在一起的信号和槽,如果带了参数,那么这些参数的顺序和类型都要一致,并且信号带的参数的个数可以多于槽,信号在发射的时候可以把参数传递给槽函数接收,这也是不同对象交互数据的一个方法,信号可以发送多个类型的数据给槽函数,但是槽函数不一定需要全部接收处理,这样槽函数参数的个数可以少于或者等于信号参数的个数,但一定不能多于所连接信号的参数个数。为了正确的连接信号槽,信号和槽的参数类型以及出现的顺序必须相同。
参考博客:
https://blog.csdn.net/bzhxuexi/article/details/45483879
https://blog.csdn.net/guozirong123/article/details/73044742
QTimer类提供了重复和单次触发信号的定时器。
QTimer类为定时器提供了一个高级别的编程接口。很容易使用:首先,创建一个QTimer,连接timeout()信号到适当的槽函数,并调用start(),然后在恒定的时间间隔会发射timeout()信号。
注意:当QTimer的父对象被销毁时,它也会被自动销毁。
例如:start()之后,每秒都会调用update()。
1 QTimer *timer = new QTimer(this); 2 connect(timer, SIGNAL(timeout()), this, SLOT(update())); 3 timer->start(1000); //每1000ms触发一次
如果我们想让这个计时器只计时一次,那么必须使用void setSingleShot(bool singleShot)
函数。
1 QTimer *timer = new QTimer(this); 2 connect(timer, SIGNAL(timeout()), this, SLOT(update())); 3 timer->setsetSingleShot(true); //表示只计时一次 4 timer->start(60000);
成员函数:
(1) void start(int msec)
启动或重新启动一个超时时间间隔为毫秒的定时器。
如果定时器正在运行,它将被停止和重新启动。如果singleShot为true,定时器将只激活一次。
(2) void setSingleShot(bool singleShot)
设置定时器是否为单次触发。
单次触发定时器只触发一次,非单次的话,则每过一个时间间隔都会触发。
(3) void stop()
停止定时器。
(4) void timeout()
定时器超时后,这个信号被发射。
注意:这是一个私有的信号。它可以在信号连接使用,但不能由用户发出。
参考博客:
https://blog.csdn.net/zz2862625432/article/details/79550285
Qtime类构造函数
QTime() 构造一个时间为0的对象
QTime(int h, int m, int s = 0, int ms = 0) 构造一个具有初始时间的对象
#include <QDebug> #include <QTime> #pragma execution_character_set("utf-8")//Qt5 显示中文 //计算程序运行时间方法 QTime timedebuge;//声明一个时钟对象 timedebuge.start();//开始计时 /* 中间为你的程序 */ qDebug()<<"第一段程序耗时:"<<timedebuge.elapsed()/1000.0<<"s";//输出计时
成员函数
void start() 将当前系统时间记录为当前时间
int restart() 将当前系统时间记录为当前时间,并返回距离上次呼叫start()或者restart()函数间隔的毫秒数
QTime currentTime() 得到当前的系统时间
int elapsed() const 计算与最近一次呼叫start()或者restart()函数间隔的毫秒数,相当于计时器
获取当前时间,显示格式为:
1 QString Widget::getSystemTime() 2 { 3 QTime *time = new QTime(); 4 5 QString strTime; 6 7 strTime = time->currentTime().toString("hh:mm:ss"); 8 9 return strTime; 10 }
QString QTime::toString(const QString &format) const // format为要将时间格式化的格式,格式详情参照帮助文档, 以下是常用类型
hh:mm:ss.zzz 显示格式为:14:13:09.042
h:m:s ap 显示格式为:2:13:9 pm
H:m:s a 显示格式为:14:13:9 pm
hh::mm::s 显示格式为:14:13:9
https://blog.csdn.net/founderznd/article/details/51442629
Qt中一些基本类的介绍:https://www.cnblogs.com/billxyd/p/6773183.html
QT提供的默认基类只有QMainWindow、QWidget、和QDialog这三种,这三种窗体也是用的最多的,QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,而他们全部继承自QWidget。不仅如此,所以的窗口部件都继承自QWidget,继承关系如图所示。
https://blog.csdn.net/kilotwo/article/details/79238545
https://blog.csdn.net/tiydy/article/details/83409726
原文:https://www.cnblogs.com/YiYA-blog/p/11117001.html