首页 > 解决方案 > 无法处理未注册的数据类型“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();
    }
}

标签: c++qtqml

解决方案


推荐阅读