当前位置: 首页 > 知识库问答 >
问题:

在C++定义的QML类型中使用连接时出错

冀望
2023-03-14

在C++定义的QML类型上使用connections时,我得到以下错误:无法分配给不存在的默认属性。

以下代码会产生错误:

main.qml

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
import QtQml 2.15
import myextension 1.0

Window {
    id:root
    width: 640
    height: 480
    visible: true

    Custom
    {
        Connections{
            //target:root
            //function onWidthChanged(){console.debug("received")}
        }
    }
}

CustomCPPClass.h

#ifndef CUSTOMCPPCL_H
#define CUSTOMCPPCLASS_H

#include <QObject>
class Message : public QObject
{
    Q_OBJECT
public:

};
#endif // CUSTOMCPPCLASS_H 

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "customcppclass.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    qmlRegisterType<Message>("myextension", 1, 0, "Custom");

    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

在qml扩展中,是否有一种不同的方法来接收属性的变化信号?

共有1个答案

呼延震博
2023-03-14

您的错误与Connections对象或自定义C++类无关。如果您这样做,您将得到相同的错误:

    QtObject {
        Item { }
    }

QML对象中的所有内容都必须存储在属性中,包括子对象。但它通常看起来不像一个属性,因为它们使用一个默认属性,该属性自动将对象移动到子列表中。

    Item {
        QtObject { }
    }

实际上与:

    Item {
        data: QtObject {}
    }

其中dataitem用于保存其子对象的默认属性的名称。

您的代码的问题在于,您的对象是一个简单的QObject,没有默认属性,也没有用于管理子级的内置方法。解决问题的简单方法是将Connections对象创建为自己的属性。

Custom {
    property Connections myConnections: Connections {
        target: root
        function onWidthChanged() { console.debug("received") }
    }
}

如果您想让它更像item管理其子级的方式,那么您必须修改C++类来维护列表并添加默认属性。不过,这对你的需求来说很可能是过度的。

 类似资料:
  • 我正在使用一个接口来定义一个新类型。这是正确的做法吗?我做如下: 然后,为了实例化它,我必须这样做: 它实际上创建了一个空对象,这不是我想要的;但是如果没有这个,它会引发一个错误,例如,“无法读取未定义的属性‘问题’”。我定义新类型的方法是错误的吗? ====EDIT====以下是我根据你的评论所做的: 然后我说: 然后我仍然得到这个错误:无法读取未定义的属性“push”。我不想在定义接口的地方启

  • 我正在尝试使用mySQL c连接器。我已经按照mysql指南https://dev . MySQL . com/doc/connector-CPP/8.0/en/connector-CPP-installation-binary . html下载并解压了二进制文件 当我包括 xdevapi 像这样 我得到以下错误 /tmp/cc6dzD4k.o:在函数` mysqlx::string::opera

  • 问题内容: 两者之间有什么区别,哪个更好使用?为什么? 问题答案: 是interface,哪里是class,并且此类实现接口。 我希望使用第二种形式,这种形式更通用,即如果您不使用特定于方法的方法,则可以将其类型声明为接口类型。使用第二种形式,将实现从实现更改为实现接口的其他类将变得更加容易。 编辑: 由于许多SO用户都评论了这两种形式都可以是接受或的任何方法的参数。但是当我声明方法时,我更喜欢接

  • 我正在编写一个代码,它取两个点,确定两个点的大小,比较它们,并返回哪个更大。我有我的主类和方法来运行所有的东西,然后还有另一个类点来实现我的接口。但是,我无法使从接口调用的方法正常工作。我的代码是: 当我尝试运行它时,我得到错误“exception in thread”main“java.lang.nullPointerException:不能调用”point.getMetality()“,因为”

  • 以下代码不能按预期工作。显然,我不能在类定义中使用类自己的类型: 运行它的结果是: 此外,使用检查代码会返回: 如何将此代码更正为对Python和mypy有效?

  • 我的代码:- 导入组织。slf4j。记录器; 导入组织。slf4j。伐木厂; 记录器记录器=LoggerFactory.get记录器(MyService.class); 记录器。信息(“”); 我得到这个错误- 启动ApplicationContext时出错。要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2022-06-13 14:38:42.998错误12884-[主]o.s.b.d

  • 主要内容:typedef 与 #define 区别Objective-C编程语言提供了一个名称为的关键字,可以使用此关键字为类型指定新名称。 以下是为单字节数字定义术语的示例 - 在此类型定义之后,标识符可以用作类型的缩写(或别名),例如: 按照惯例,大写字母用于这些定义,以提醒用户类型名称实际上是符号缩写,但可以使用小写,如下所示 - 也可以使用为用户定义的数据类型指定名称。 例如,使用带结构的来定义新的数据类型,然后使用该数据类型直接定义结构