QQuickWindow子类,visibilityChanged和关闭信号

时间:2017-12-05 08:57:25

标签: c++ qt qml

我正在尝试创建自己的窗口类并在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");

仍然没有成功。

1 个答案:

答案 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在评论中。