我是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();
}
答案 0 :(得分:0)
在QThread
事件循环开始之前(通常为exec())没有QApplication
。因此,没有您期望的暂停。此外,我很确定QQmlApplicationEngine
在主应用程序循环启动之前不会显示任何内容。
您需要在main.qml
内(在QML代码中)进行属性更改,或创建某种持久性C ++对象,该对象在主事件循环开始后从循环内部进行更改。
还要注意,主线程中的QThread::msleep()
将冻结整个GUI。例如,如果您希望用户能够一直与应用程序进行交互或退出,则使用计时器可能更合适。