QApplication::processEvents()的循环调用问题

在Qt程序的信号槽(事件处理)函数中调用QApplication::processEvents()时需特别注意,因为这可能导致对当前信号槽函数的无限循环调用,尤其是重负载的情况。

可以考虑引入一个bIsRunning变量,避免槽函数的循环调用:

void SignalSlot(){
    static volatile bool bIsRunning = false;
 
    if (bIsRunning) {
        return;
    }
    else{
        bIsRunning = true;
    }
 
    //Handle event
 
    //Process events
    QApplication::processEvents();
 
    bIsRunning = false;
    return;
}

若该槽函数用于响应另一个对象(通常可能是一个位于子线程的类的实例,或其控制器对象)发射的事件,且该对象不会发射其他类型的事件,则可以考虑使用QObject::blockSignals()方法:

void SignalSlot(){
    //Block signal source
    if (QObject::sender()) {
        QObject::sender()->blockSignals(true);
    }
 
    //Handle event
 
    //Process events
    QApplication::processEvents();
 
    //Unblock signal source
    if (QObject::sender()) {
        QObject::sender()->blockSignals(false);
    }
    return;
}

参考资料库:https://forum.qt.io/topic/22434/issue-with-qapplication-processevents

it
除非特别注明,本页内容采用以下授权方式: Creative Commons Attribution-ShareAlike 3.0 License