每个线程都处理自己的事件循环,通常您不需要担心这一点——它已经为您处理了,除非您有特定的原因需要干预。
QThread是Qt提供的一个类,用于控制线程的操作。将对象“放入”该线程的方法是使用moveToThread()函数。
为了在线程内运行一些代码(使用moveToThread函数),您不应继承QThread类,唯一继承QThread类的原因是如果您想更改线程控制的行为。
以下是使对象在线程中运行的基本步骤:
MyObj *myObj = new MyObj(0); // 0 = no parent if your object inherits QObject
QThread* thread = new QThread;
myObj->moveToThread(thread);
QObject::connect(thread, SIGNAL(started()), myObj, SLOT(run()));
thread->start();
一旦调用start()函数,线程将启动并发出started信号,您的对象将接收到该信号并在其槽函数run()中进行处理。
注意:当您对象内的函数/槽run()结束时,您的线程并不会结束(因此您不需要进行“forever”循环)。只有当您告诉线程退出(或销毁它)时,线程才会停止,这意味着您的线程可能处于空闲状态,直到它接收到一个信号或事件 - 这就是事件循环所起的作用 - QThread类内部的事件循环处理传入的事件。
注意:此代码也是片段 - 它不涉及线程关闭,还有其他“模板”代码可供使用。
编辑:
因此,事件由事件队列处理(例如,所有基本类型为QEvent的鼠标单击事件) - 系统更多地使用其中一些事件可能会触发信号(例如onClicked)。信号和槽是一种不同的机制,用户更多地使用其中您可以使用connect()函数在您的槽中处理这些信号。以下是比我能想出的更好的解释:
请在此处查看。