通过QML代码打开/显示和关闭/隐藏弹出窗口

时间:2020-10-21 12:00:51

标签: qt qml

我注册的C ++类中有一个Q_PROPERTY

// C++ Class
Q_PROPERTY(bool inProgress READ inProgress WRITE setInProgress NOTIFY inProgressChanged)

...基于此,我打算显示QML弹出窗口:

Popup {
    id: popup
    visible: cppClass.inProgress // Bind visibility to C++ Q_PROPERTY
}

但是没有弹出。如果将visible更改为true,则总是会显示弹出窗口。

到目前为止已尝试

试图使用信号/插槽连接来打开/显示弹出窗口,但不起作用:

Popup {
    id: popup
    visible: false

    Connections {
        target: cppClass
        onInProgressChanged: {
            if (cppClass.inProgress) {
                console.log("open ...")                   // This text is logged correctly
                popup.visible = Qt.binding(function(){return true}) // popup is NOT shown
                popup.open()                                        // popup is NOT opened
            } else {
                console.log("close ...")
                popup.visible = Qt.binding(function(){return false})
                popup.close()
            }
        }
    }
}

我想念什么?

1 个答案:

答案 0 :(得分:0)

通过触发C ++信号而不是CPU阻塞操作来工作的代码:

Popup {
    visible: cppClass.inProgress
}
QCoreApplication::processEvents();
cppClass->setInProgress(true);
QCoreApplication::processEvents();

// Dot not trigger signal immediately before heavy duty logic
//
// Do some less heavy statements 
// before CPU-blocking operation
// to make sure QML UI engine receives signals 
// and has time to show the GUI changes

// CPU-blocking operation
heavyDutyLogic.run();


QCoreApplication::processEvents();
cppClass->setInProgress(false);
QCoreApplication::processEvents();