c++ - 无法处理未注册的数据类型“QLinkedList”
问题描述
我有一个包含 DataObject 类对象的 QLinkedList 容器,我的任务是在 ListView 中显示来自 QLinkedList 容器的数据。当我尝试将数据输出到 ListView 时,出现错误:
QMetaProperty::read: Unable to handle unregistered datatype 'QLinkedList<DataObject*>' for property 'tile::Glav::list'
在此之前,而不是 QLinkedList < Data object * > 我使用 QLinkedList < QObject * > 并且它成功地工作,但我需要访问类函数,所以我改变了它。如何在ListView中显示链表<Data Object *>中的数据?这是我的代码:
主文件
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QStringListModel>
#include <QQmlContext>
#include <QLinkedList>
#include <QQuickView>
#include <container.h>
#include <dataobject.h>
#include "glav.h"
//#include <container.cpp>
int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterUncreatableType<tile::Glav>( "Tile", 1, 0, "Glav", "interface" );
qmlRegisterType<tile::Glav>( "Tile", 1, 0, "Glav");
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();
}
main.qml
import QtQuick 2.12
import QtQuick.Controls 2.5
//import App 1.0
import Tile 1.0
import QtQuick.Dialogs 1.3
import QtQuick.Layouts 1.1
ApplicationWindow {
width: 640
height: 480
visible: true
title: qsTr("Scroll")
background: Rectangle {
color: "#C0C6D3"
}
Glav {
id: glav
}
Row {
id: buttons
spacing: 20
padding: 10
anchors.horizontalCenter: parent.horizontalCenter
RoundButton {
padding: 20
radius: 5
text: "add item"
onClicked: {
glav.addItem()
listView.currentIndex = -1
}
}
RoundButton {
padding: 20
radius: 5
text: "add 3"
onClicked: glav.addItems3()
}
RoundButton {
padding: 20
radius: 5
text: "change center"
onClicked: glav.changeItem()
}
RoundButton {
padding: 20
radius: 5
text: "remove center"
onClicked: glav.removeItem()
}
}
ScrollView {
anchors.fill: parent
anchors.topMargin: buttons.implicitHeight
anchors.leftMargin: 30
anchors.rightMargin: 30
ListView {
id: listView
width: parent.width
model: glav.list
delegate: ItemDelegate {
text: model.modelData.id
}
}
}
}
数据对象.h
#ifndef DATAOBJECT_H
#define DATAOBJECT_H
#include <QObject>
namespace tile {
class DataObject : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ getName WRITE setName NOTIFY changedName)
Q_PROPERTY(QString color READ getColor WRITE setColor NOTIFY changedColor)
Q_PROPERTY(int id READ getId WRITE setId NOTIFY changed)
public:
explicit DataObject(QString name = "Wana", QString color = "red", int id = 1, QObject *parent = nullptr);
Q_INVOKABLE QString getName();
Q_INVOKABLE void setName(const QString &name);
Q_INVOKABLE QString getColor();
Q_INVOKABLE void setColor(const QString &color);
Q_INVOKABLE int getId() const;
Q_INVOKABLE void setId(int id);
signals:
void changed();
void changedName();
void changedColor();
private:
QString m_name;
QString m_color;
int m_id;
};
}
#endif // DATAOBJECT_H
数据对象.cpp
#include "dataobject.h"
#include <QDebug>
namespace tile {
DataObject::DataObject(QString name, QString color, int id, QObject* parent) :
QObject(parent)
, m_name (name)
, m_color (color)
, m_id (id)
{
qDebug() << m_name << m_color << m_id;
}
QString DataObject::getName(){
return m_name;
}
void DataObject::setName(const QString &name){
m_name = name;
qDebug() << m_name;
emit changedName();
}
QString DataObject::getColor(){
return m_color;
}
void DataObject::setColor(const QString &color){
m_color = color;
emit changedColor();
}
int DataObject::getId() const{
return m_id;
}
void DataObject::setId(int id){
m_id = id;
emit changed();
}
}
格拉夫.h
#ifndef GLAV_H
#define GLAV_H
#include <QObject>
#include <QLinkedList>
#include <dataobject.h>
namespace tile {
class Glav : public QObject{
Q_OBJECT
Q_PROPERTY(QLinkedList<DataObject *> list READ getList WRITE setList NOTIFY changedList)
public:
explicit Glav(QObject *parent = nullptr);
Q_INVOKABLE QLinkedList<DataObject *> getList() const;
Q_INVOKABLE void setList(const QLinkedList<DataObject *> &list);
Q_INVOKABLE void addItem();
signals:
void changedList();
private:
QLinkedList<DataObject *> m_list;
};
}
#endif // GLAV_H
格拉夫.cpp
#include "glav.h"
#include "dataobject.h"
#include <QDebug>
#include <QAbstractListModel>
namespace tile {
Glav::Glav(QObject *parent) : QObject(parent){
QLinkedList<DataObject *> dataList = {
new DataObject("Item 1", "red", 0),
new DataObject("Item 2", "green", 1),
new DataObject("Item 3", "blue", 2),
new DataObject("Item 9", "yellow", 3)
};
m_list << dataList;
QVariant::fromValue(m_list);
}
QLinkedList<DataObject *> Glav::getList() const{
return m_list;
}
void Glav::setList(const QLinkedList<DataObject *> &list){
m_list = list;
}
void Glav::addItem(){
qDebug() << m_list.count();
m_list << new DataObject("Wanish", "Selection", m_list.count());
qDebug() << m_list.count();
emit changedList();
}
}
解决方案
推荐阅读
- solr - 如何在 SOLR 中查询 fieldType LatLonPointSpatialField 的空字段
- java - 无法在我的项目中使用 @Slf4j 注释,因为无法解析为类型,但在另一个项目中运行良好
- sockets - Socket 包装器是 TCP/IP 的传输层吗?
- oracle - Oracle Rest Data Service Order by desc nulls last 不起作用
- sql - 如何从重叠日期中获取单独的间隔
- javascript - 如何导入默认导出的 const
- docker - ASP.NET Core 应用程序突然需要新的特定版本而无需更改
- javascript - 所见即所得不在组字段 wordpress codestar 框架中工作
- fancybox-3 - 当 iframe URL 无法加载时停止花哨的框 3 打开
- json - 如何在 Javafx 中将 JSON 表示为树视图