一、事件循环
在说明事件循环时,如下程序:
#include
#include
int main(int argc, char* argv[])
{
char input[1024]; //假设输入长度不超过1024
const char quitStr[] = "quit";
bool quit = false;
while (false == quit) {
scanf_s("%s", input, sizeof input);
printf("user input: %s\n", input);
if (0 == memcmp(input, quitStr, sizeof quitStr)) {
quit = true;
}
}
return 0;
}
程序将会进入一个条件退出的循环,循环内部不停的检测某个条件是否满足(退出条件),程序将会在这个程序循环,这个不断执行的操作,从键盘获取字符串的代码,其实就是一个事件、打印user input:
。
这个枚举类型描述了信号与槽的连接类型。具体的,这个枚举类型决定了信号是立即传输给槽还是放在一个队列在晚些时候传输。 Qt事件循环是什么意思? 答:Qt将系统产生的信号(软件中断)转换成Qt事件,并且将事件封装成类,所有的事件类都是由QEvent派生的,事件的产生和处理就是Qt程序的主轴,且伴随着整个程序的运行周期。因此我们说,Qt是事件驱动的。
一个信号将会产生一系列的事件,这些事件改变着程序的行为。 QObject::connect建立了发送者(QObject A)和接收者(QObject B)的关系,只要是QObject对象都有自己的事件循环,Direct还是Queued决定了将槽对应时间加入那个发送者还是接收者。
ConstantValueDescriptionQt::AutoConnection0(Default)发送者和接受者在同一线程,那么将会调用Qt::DirectiConnection;反之则为Qt::QueuedConnectionQt::DirectConnection1事件直接执行,无需进入事件队列等待Qt::QueuedConnection2事件需要进入事件队列,等待直到程序执行到自己所处的队列位置(异步)Qt::BlockingQueuedConnection3事件需要进入事件队列,等待直到程序执行到自己所处的队列位置,槽函数调用时调用线程会阻塞的。注意发送和接受者不能在一个线程内,否则产生死锁(同步)Qt::UniqueConnection0x80这个类型可以使用与与上述几种结合,表示这是一个独一无二的连接。任何尝试超过一次connect都将会失败。This flag was introduced in Qt 4.6.[1] https://stackoverflow.com/questions/15051553/qt-signals-queuedconnection-and-directconnection [2] https://zhuanlan.zhihu.com/p/72758194