首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QMetaProperty::read:无法处理未注册的数据类型*属性*

QMetaProperty::read:无法处理未注册的数据类型*属性*
EN

Stack Overflow用户
提问于 2022-09-01 09:19:47
回答 1查看 76关注 0票数 0

我希望在QML中使用嵌套的QObject结构,因为嵌套对象应该从第一级对象接收必要的参数。结构如下。

该解决方案构建,但当我试图运行它时,我收到了错误:

代码语言:javascript
复制
QMetaProperty::read: Unable to handle unregistered datatype 'Projector' for property 'Backend::projector'

main.cpp

代码语言:javascript
复制
#include "backend.h"

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

int main(int argc, char** argv) {
  QApplication app(argc, argv);
  QQmlApplicationEngine engine;

  qmlRegisterType<Backend>("com.company.backend", 1, 0, "Backend");

  engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

  return app.exec();
}

main.qml

代码语言:javascript
复制
import QtQuick 2.11
import QtQuick.Window 2.0
import QtQuick.Controls 2.4
import com.company.backend 1.0


Window
{

....

ComboBox {
        id: projector
        currentIndex: 2
        model: backend.projector.list
        width: 180
        anchors.left: parent.left
        anchors.top: projectorListLabel.bottom
        anchors.leftMargin: 15
        anchors.topMargin: 5
    }

...

}

backend.h

代码语言:javascript
复制
...

#include "projector.h"

class Backend : public QObject {
  Q_OBJECT
  Q_PROPERTY(Projector projector READ getProjector NOTIFY projectorChanged)

public:
  Projector* getProjector() const;

signals:
  void projectorChanged();

backend.cpp

代码语言:javascript
复制
...

#include "backend.h"

Backend::Backend(QObject* parent) {

  _projector = new Projector();
  emit(projectorChanged());
}

Projector* Backend::getProjector() const {
  return _projector;
}

projector.h

代码语言:javascript
复制
...

class Projector : public QObject {
  Q_OBJECT

  Q_PROPERTY(QStringList list READ getList WRITE setList NOTIFY listChanged)

 public:
  explicit Projector(QObject* parent = nullptr);

 QStringList getList() const;

 public slots:
  void setList(QStringList list);

 signals:
  void listChanged();

 private:
  QStringList _list;
};

projector.cpp

代码语言:javascript
复制
...

#include "projector.h"

#include <iostream>

Projector::Projector(QObject* parent) {}

QStringList Projector::getList() const {
  return _list;
}

void Projector::setList(QStringList list) {
  std::cout << "Updating list" << std::endl;
  _list = list;
  listChanged();
}

我读过一些关于注册元类型和使用宏的文章,但是我没有找到任何彻底解释这一点的来源。

EN

回答 1

Stack Overflow用户

发布于 2022-09-01 09:55:03

QT需要知道用于信号/插槽等的类型的定义。

可以使用Q_DECLARE_METATYPE宏在编译时声明类型。

但是,您可能还需要在运行时注册它,以便能够创建新实例。这是通过qRegisterMetatype()方法完成的。

有关完整的文档,请参见此链接,它很好地解释了这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73566985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档