微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何子类化 QML 窗口?

如何解决如何子类化 QML 窗口?

我需要在 C++ 中添加一些功能。但是我很难如何正确创建我自己的 QML 窗口类型。 我试图继承 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,"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 类型进行子类化。除了主 applicationwindow 之外,我还使用它 当我在没有不透明度的情况下使用它时,它可以正常工作

解决方法

将此添加到您的 MyWindow 类声明中:

QML_FOREIGN(QQuickWindow)

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

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

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

QML_FOREIGN 文档说明:

声明任何 QML_ELEMENT、QML_NAMED_ELEMENT()、QML_ANONYMOUS、QML_INTERFACE、QML_UNCREATABLE()、QML_SINGLETON、QML_ADDED_IN_MINOR_VERSION()、QML_REMOVED_IN_MINOR_VERSION()、QML_REMOVED_IN_MINOR_VERSION()、QMLEXT_ATTED()、QMLEXT_ATTED()、QMLEXT_ATTED()、QMLEXT_END()、QMLEXT_END()、QMLEXT_END()、QMLEXT_END()、类型,而不是 FOREIGN_TYPE。封闭类型仍然需要使用 Q_GADGET 或 Q_OBJECT 宏在元对象系统中注册。

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。