我希望在QML中使用嵌套的QObject结构,因为嵌套对象应该从第一级对象接收必要的参数。结构如下。
该解决方案构建,但当我试图运行它时,我收到了错误:
QMetaProperty::read: Unable to handle unregistered datatype 'Projector' for property 'Backend::projector'main.cpp
#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
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
...
#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
...
#include "backend.h"
Backend::Backend(QObject* parent) {
_projector = new Projector();
emit(projectorChanged());
}
Projector* Backend::getProjector() const {
return _projector;
}projector.h
...
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
...
#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();
}我读过一些关于注册元类型和使用宏的文章,但是我没有找到任何彻底解释这一点的来源。
发布于 2022-09-01 09:55:03
QT需要知道用于信号/插槽等的类型的定义。
可以使用Q_DECLARE_METATYPE宏在编译时声明类型。
但是,您可能还需要在运行时注册它,以便能够创建新实例。这是通过qRegisterMetatype()方法完成的。
有关完整的文档,请参见此链接,它很好地解释了这一点。
https://stackoverflow.com/questions/73566985
复制相似问题