QQmlProperty :: write无法正常工作

时间:2019-06-20 11:42:38

标签: qt

我是Qt的新手。我试图以2秒的延迟从主窗口启用和禁用图像,但它始终采用我正在设置的最后一个属性。请在下面找到我的示例代码。我期望是启用->禁用->启用->禁用->启用。但只能延迟启用。

我尝试使用所有属性。

int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
    return -1;
QObject *object = engine.rootObjects().first();

QObject *test= object->findChild<QObject*>("image");

if(test)
{
    QThread::msleep(2000);

    QQmlProperty::write(test, "visible", "false");
    added delay;

    QQmlProperty::write(test, "visible", "true");
    added delay;

    QQmlProperty::write(test, "visible", "false");
    added delay;

    QQmlProperty::write(test, "visible", "true");
}
return app.exec();
}

1 个答案:

答案 0 :(得分:0)

QThread事件循环开始之前(通常为exec())没有QApplication。因此,没有您期望的暂停。此外,我很确定QQmlApplicationEngine在主应用程序循环启动之前不会显示任何内容。

您需要在main.qml内(在QML代码中)进行属性更改,或创建某种持久性C ++对象,该对象在主事件循环开始后从循环内部进行更改。

还要注意,主线程中的QThread::msleep()将冻结整个GUI。例如,如果您希望用户能够一直与应用程序进行交互或退出,则使用计时器可能更合适。