我正在尝试创建自己的窗口类并在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);
并使用定义的READ / WRITE和NOTIFY部分声明适当的Q_PROPERTY。我用“ 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");
仍然没有成功。
最佳答案
我找到了解决方案。
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注释。