我有 GUI 创建和管理 GUI 内容的线程。现在,当应用程序空闲时,即所有线程都空闲(或者即使只有 GUI 线程空闲),我希望我的 QMainWindow
继承类的对象发出一个 SIGNAL
。这样,只要应用程序空闲,我就会默默地创建下一阶段所需的 Widgets
。所以我想知道如何使该对象在 GUI 线程空闲时发出 SIGNAL
?我的应用程序是多线程并且有多个类,因此SIGNAL
不必仅在GUI 类中发出。
此外,不应在线程空闲时立即发出 SIGNAL
。我希望线程应该空闲足够长的时间,以便我确定用户实际上是空闲的。
谢谢!
最佳答案
QAbstractEventDispatcher 允许将自己的事件插入到 Qt's event loop 中.它还允许监视事件循环的工作量。
这是一个例子。该小部件正在监听 QAbstractEventDispatcher::awake() 和 QAbstractEventDispatcher::aboutToBlock() 信号以了解事件循环何时忙。
#include <QtGui>
class IdleAwareWidget : public QWidget
{
Q_OBJECT
public:
IdleAwareWidget(QWidget *parent = 0) : QWidget(parent) {
dispatcher = QAbstractEventDispatcher::instance();
connect(dispatcher, SIGNAL(awake()), SLOT(awake()));
connect(dispatcher, SIGNAL(aboutToBlock()), SLOT(aboutToBlock()));
}
private slots:
void awake() {
lastAwake = QTime::currentTime();
qDebug() << "Slept for " << lastBlock.msecsTo(lastAwake) << " msec";
}
void aboutToBlock() {
lastBlock = QTime::currentTime();
qDebug() << "Worked for " << lastAwake.msecsTo(lastBlock) << " msec";
}
private:
QAbstractEventDispatcher *dispatcher;
QTime lastAwake;
QTime lastBlock;
};
主要.cpp:
#include <QtGui>
#include "idle_widget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
IdleWidget widget;
widget.show();
return a.exec();
}
如果问题只是关于空闲处理,那么间隔为 0 的 QTimer 是一个选项:
QTimer::singleShot(0, this, SLOT(doWorkInIdle()));
一旦事件循环进入空闲状态,这将安排调用 doWorkInIdle()
槽。将工作分配给小卡盘不会阻塞循环,应用程序将保持响应。
关于c++ - 当 GUI 线程在 Qt 中空闲时发出信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14893059/