在 Qt 中,槽函数是通过连接 (connect) 语句与信号进行关联的。默认情况下,槽函数是在信号被触发时立即执行的,不会阻塞程序的运行。

如果你希望槽函数的执行能够阻塞程序的运行,可以考虑使用 Qt 的事件循环机制。通过使用 QEventLoop 类,可以创建一个事件循环,然后在槽函数中调用 exec() 函数来启动该事件循环。这样,槽函数将阻塞程序的运行,直到事件循环被退出。

以下是一个示例代码:

#include <QCoreApplication>
#include <QEventLoop>
#include <QDebug>

class MyClass : public QObject
{
    Q_OBJECT
public slots:
    void mySlot()
    {
        qDebug() << 'Start blocking...';
        QEventLoop loop;
        QTimer::singleShot(5000, &loop, SLOT(quit())); // 5秒后退出事件循环
        loop.exec(); // 启动事件循环,阻塞程序运行
        qDebug() << 'Blocking finished.';
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    MyClass myObject;
    QObject::connect(&myObject, SIGNAL(mySignal()), &myObject, SLOT(mySlot()));
    
    emit myObject.mySignal(); // 触发信号,执行槽函数
    
    return a.exec();
}

在上述示例中,mySlot() 函数通过调用 QEventLoop 的 exec() 函数启动了一个事件循环,然后通过 QTimer::singleShot() 函数设置了 5 秒后退出事件循环。因此,在执行到 loop.exec() 之后,程序将被阻塞 5 秒钟,直到事件循环被退出。

Qt C++ 槽函数阻塞执行:事件循环实现

原文地址: https://www.cveoy.top/t/topic/qoI4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录