如何子类化 QML Window?

How to subclass QML Window?

我需要在 C++ 中添加一些功能。但是我在努力如何正确地创建我自己的 QML window 类型。 我尝试子类化 QQuickWindow 并注册我的新类型并在我的 QML 项目中使用它。但是启动时显示错误,我无法设置不透明度

mywindow.h

#include <QQuickItem>
#include <QQuickWindow>
#include <QWindow>
#include <QApplication>
#include <QObject> 
class MyWindow : public QQuickWindow {
   Q_OBJECT
public:
   MyWindow(QQuickWindow *parent=nullptr); 
public slots:
   Q_INVOKABLE void mycppFeature();

mywindow.cpp

#include "reminderwindow.h"
MyWindow::MyWindow(QQuickWindow *parent):QQuickWindow(parent){
}

main.cpp

qmlRegisterType<MyWindow>("com.organization.my", 1, 0, "MyWindow");

SplashWindow.qml

import QtQuick 2.0
import QtQuick.Controls 2.5
import QtQuick.Window 2.15
import com.organization.my 1.0
MyWindow{
   opacity: 0.8

MyWindow 已找到,但错误是“MyWindow.opacity”在 com.organizatino.my 1.0 中不可用。我相信我不知道如何正确地子类化 QML Window 类型。除了主应用程序 Window 之外,我还使用它 当我在没有不透明度的情况下使用它时,它可以正常工作

将此添加到您的 MyWindow class 声明:

QML_FOREIGN(QQuickWindow)

不透明度 属性 在 QWindow 上声明(由 QQuickWindow 继承)如下:

    Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity NOTIFY opacityChanged REVISION(2, 1))

意味着它是在 QtQuick.Window QML 模块的 2.1 版中添加的。

QML_FOREIGN 文档指出:

Declares that any QML_ELEMENT, QML_NAMED_ELEMENT(), QML_ANONYMOUS, QML_INTERFACE, QML_UNCREATABLE(), QML_SINGLETON, QML_ADDED_IN_MINOR_VERSION(), QML_REMOVED_IN_MINOR_VERSION(), QML_ATTACHED(), or QML_EXTENDED() macros in the enclosing C++ type do not apply to the enclosing type but instead to FOREIGN_TYPE. The enclosing type still needs to be registered with the meta object system using a Q_GADGET or Q_OBJECT macro.

这样就告诉 QML 机器不要针对您的模块验证版本限制,而是针对提供 QQuickWindow 的版本。

在这些与您类似的错误报告中进行更多讨论:

https://bugreports.qt.io/browse/QTBUG-91706

https://bugreports.qt.io/browse/QTBUG-72986