我正在尝试创建自己的窗口类并在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注释。

08-16 11:59