【发布时间】:2021-08-25 20:40:03
【问题描述】:
我有一个基本的 qml 应用程序 QWindow,它已经定义了属性 flags。我想从main.cpp 更改/更新属性flags,使其不是无框的。我知道我可以直接在 QML 中完成,但我想动态更改它而不重新编译。我找到了许多示例,但没有一个示例显示使用 QQmlApplicationEngine::load() 方法后如何执行此操作。我在下面发布了我的代码,我可以看到当前标志十进制值2048 或十六进制值0x800。根据documentation,0x800 的十六进制值指的是当前设置的Qt::FramelessWindowHint。我尝试修改flags 属性,但窗口没有更新。
// Main.qml
import QtQuick 2.9
import QtQuick.Window 2.2
Window {
id: window
objectName: "window"
...
flags: Qt.FramelessWindowHint
...
}
// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QWindow>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.addImportPath("qrc:/");
QObject::connect(&engine, &QQmlApplicationEngine::quit, &app,
&QGuiApplication::quit);
const QUrl url(QStringLiteral("qrc:/Main.qml"));
QObject::connect(
&engine, &QQmlApplicationEngine::objectCreated, &app,
[url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl) QCoreApplication::exit(-1);
QVariant obj2 = obj->property("flags");
if (obj2.isValid()) {
Qt::WindowFlags flags = qvariant_cast<Qt::WindowFlags>(obj2);
flags &= ~Qt::FramelessWindowHint;
auto *tmp = dynamic_cast<QWindow*>(obj);
tmp->setFlags(flags);
tmp->show();
}
},
Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
【问题讨论】:
-
您的代码实际上对我来说很好。我在 Linux 上使用 Qt 5.15.0。
-
为什么要创建 obj2?您可以轻松地从 c++ 中设置属性。
-
@JarMan 嗯。我在 Qt 5.15.2 MSVC 2019 64 位。它绝对行不通。我什至尝试过
obj->setProperty("flags", 0);将标志清零,但也不起作用。 -
好的,当我想覆盖
Qt.FramelessWindowHint标志时,看起来我必须使用obj->setProperty("flags", Qt::Window);。