首页 > 解决方案 > 通过 QML 代码打开/显示和关闭/隐藏弹出窗口

问题描述

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

// 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
}

但是pop没有出现。当然,如果总是显示对弹出窗口的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()
            }
        }
    }
}

我错过了什么?

标签: qtqml

解决方案


该代码通过触发远离 CPU 阻塞操作的 C++ 信号来工作:

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();


推荐阅读