QT开发中文网

QT子线程向qApp发0timer

在Qt中,子线程无法直接向qApp发送定时器事件。定时器事件是由主线程的事件循环处理的。但是,你可以通过信号和槽机制间接实现这个功能。

首先,在主线程中定义一个自定义信号:

class WorkerThread : public QObject
{
    Q_OBJECT

public:
    void doWork()
    {
        QTimer::singleShot(0, this, &WorkerThread::sendTimerSignal);
    }

signals:
    void timerSignal();

private slots:
    void sendTimerSignal()
    {
        emit timerSignal();
    }
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow()
        : m_workerThread(new WorkerThread)
    {
        connect(m_workerThread, &WorkerThread::timerSignal, this, &MainWindow::handleTimerSignal);
        m_workerThread->doWork();
    }

private slots:
    void handleTimerSignal()
    {
        // 在这里处理定时器信号,例如执行一些操作或弹出窗口
        QMessageBox::information(this, "Message", "Received timer signal");
        
        qApp->quit();  // 可以选择在收到定时器信号后退出应用程序
   }

private:
    WorkerThread* m_workerThread;
};

然后,在子线程中使用QTimer::singleShot()函数发射该信号:

class WorkerThread : public QThread
{
public:
     void run() override
     {
         // 子线程的处理逻辑

         QTimer::singleShot(0, this, SIGNAL(timerSignal()));
     }

signals:
     void timerSignal();
};

最后,在主函数中创建并启动子线程:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow mainWindow;
    mainWindow.show();

    WorkerThread workerThread;
    workerThread.start();

    return a.exec();
}

当子线程运行时,它会在主线程的事件循环中发射timerSignal()信号。然后该信号将被连接到主窗口对象的handleTimerSignal()槽函数上,在该槽函数中可以执行一些操作或弹出窗口。

需要注意的是,这里使用了定时器的0毫秒延迟来确保信号被放入主线程的事件队列中,以便由主线程进行处理。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://qt.0voice.com/?id=11055

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?