我正在尝试创建自己的窗口类并在QML中使用它。在第一步中,我试图以这种方式继承QQuickWindow:
class TestWindow : public QQuickWindow {
Q_OBJECT
...
};
然后在main.cpp文件中:
qmlRegisterType<TestWindow>("test.components", 1, 0, "TestWindow");
现在在QML中我可以这样简单地使用它:
import test.components 1.0
TestWindow {
//onClosing: console.log("closing")
//onVisibilityChanged: console.log(visibility)
}
当我尝试取消注释其中一行时,会出现问题。 QML引擎说:“TestWindow.onVisibilityChanged”在test.components 1.0中不可用。“类似的事情发生在“onClosing”的情况下。我应该继承QWindow / QQuickWindow,但无论如何我都试图创造自己。
//connect(this, QQuickWindow::visibilityChanged, this, TestWindow::visibilityChanged);
并声明适当的Q_PROPERTY,同时定义了READ / WRITE和NOTIFY部分。我用“closingEvent”取代了结束信号并做了类似的事情:
//connect(this, SIGNAL(closing(QQuickCloseEvent*)), this, SIGNAL(closingEvent(QQuickCloseEvent*)));
当我尝试使用新的信号/插槽语法时,这也很奇怪,编译器抱怨不完整的QQuickCloseEvent,这在任何地方都没有描述,似乎是来自Qt内部的东西。所以我不得不坚持使用较旧的代码版本。
经过这些处理后,来自导入QtQuick.Window 2.2的另一个“Window”(不是TestWindow)表示“x”和“y”属性未定义。我将尝试修复的警告/错误越多,其他事情就越多停止正常工作。
有没有人有类似的问题?
编辑:我发现它与Q_REVISION宏有关,用于QWindow和QQuickWindow的某些信号/插槽/属性。我甚至尝试使用这些行:
//qmlRegisterType<TestWindow>("test.components", 1, 0, "TestWindow");
//qmlRegisterType<TestWindow, 1>("test.components", 1, 0, "TestWindow");
qmlRegisterType<TestWindow, 2>("test.components", 1, 0, "TestWindow");
仍然没有成功。
答案 0 :(得分:1)
我找到了解决方案。
qmlRegisterType<TestWindow>("test.components", 1, 0, "TestWindow");
qmlRegisterRevision<QWindow, 1>("test.components", 1, 0);
qmlRegisterRevision<QQuickWindow, 1>("test.components", 1, 0);
我还必须注册基类的修订版。这里描述的解释:https://bugreports.qt.io/browse/QTBUG-22688在评论中。