微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将通过 C++ 中的另一个类添加到 ListView、QML 的数据显示出来?

如何解决如何将通过 C++ 中的另一个类添加到 ListView、QML 的数据显示出来?

我需要呈现 QLinkedList 容器中的所有数据(这是由任务给出的)。我创建了两个类,DataObject 用于 ListView 中的委托,Glav 用于带有 DataObject 对象的容器。我有一个按钮,用于向容器添加数据(Glav 类中的 addItem 函数)。数据已添加但未显示在 ListView 中。如何显示它们?我通过信号试过了,没用。 这是项目的完整代码

main.cpp

#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)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QGuiApplication app(argc,argv);
    QQmlApplicationEngine engine;
    qmlRegisteruncreatableType<tile::Glav>( "Tile",1,"DataItem","interface" );

    qmlRegisterType<tile::Glav>( "Tile","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

applicationwindow {
    width: 640
    height: 480
    visible: true
    title: qsTr("Scroll")

//    Container {
//        id: container
//    }

    Glav {
        id: glav
    }


    Row {
        id: buttons
        spacing: 20
        padding: 10
        anchors.horizontalCenter: parent.horizontalCenter

        RoundButton {
            padding: 20
            text: "add item"
            onClicked: {

                glav.addItem()
                listView.currentIndex = -1
            }

    }

    Connections{
    target: myModelObjectWhichWasSetAsContextProperty
    onRowsInserted: console.log("rows were inserted")
    }

    ScrollView {
        anchors.fill: parent
        anchors.topMargin: buttons.implicitHeight + 10
        ListView {
            id: listView
            width: parent.width
            model: glav.list
            //required model
            delegate: Text {
                property var d
                d: model.modelData.id
                text: model.modelData.name
            }
            removedisplaced: Transition {
                NumberAnimation { properties: "x,y"; duration: 100; easing.type: Easing.InOutQuad }
            }
}
}
}

数据对象.h

#ifndef DATAOBJECT_H
#define DATAOBJECT_H

#include <QObject>
namespace tile {
class DataObject : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString name READ name WRITE setName NOTIFY changed)
    Q_PROPERTY(QString color READ color WRITE setColor NOTIFY changed)
    Q_PROPERTY(int id READ id WRITE setId NOTIFY changed)

public:
    explicit DataObject(QString name = "Wana",QString color = "red",int id = 1,QObject *parent = nullptr);

    QString name();
    void setName(const QString &name);

    QString color();
    void setColor(const QString &color);

    int id() const;
    void setId(int id);

signals:

    void changed();

private:

    QString m_name;
    QString m_color;
    int m_id;

};
}
#endif // DATAOBJECT_H

dataobject.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)
{
    //new DataObject();
    qDebug() << m_name;
    //emit changed();
}

QString DataObject::name()
{
    return m_name;
}

void DataObject::setName(const QString &name)
{
    m_name = name;
    qDebug() << m_name;
    emit changed();
}

QString DataObject::color()
{
    return m_color;
}

void DataObject::setColor(const QString &color)
{
    m_color = color;
    emit changed();
}

int DataObject::id() const
{
    return m_id;
}

void DataObject::setId(int id)
{
    m_id = id;
    emit changed();
}
}

glav.h

#ifndef GLAV_H
#define GLAV_H

#include <QObject>
#include <QLinkedList>

namespace tile {
class Glav : public QObject
{
    Q_OBJECT

    Q_PROPERTY( QLinkedList<QObject *> list READ list CONSTANT )
public:
    explicit Glav(QObject *parent = nullptr);

    //QLinkedList<QObject *> list();
    //void setList(const QLinkedList<QObject *> &list);

    Q_INVOKABLE QLinkedList<QObject *> pollist();
    Q_INVOKABLE void addItem();
//    Q_INVOKABLE QVariant pol();


signals:
    void changed();

private:
    QLinkedList<QObject *> m_list;
    QLinkedList<QObject *> list();

};
}
#endif // GLAV_H

glav.cpp

#include "glav.h"
#include "dataobject.h"

#include <QDebug>
#include <QAbstractListModel>

namespace tile {
Glav::Glav(QObject *parent) : QObject(parent)
{
    QLinkedList<QObject *> dataList = {
            new DataObject("Item 1","red"),new DataObject("Item 2","green"),new DataObject("Item 3","blue"),new DataObject("Item 9","yellow")
        };
    m_list << dataList;
    QVariant::fromValue(m_list);

}

QLinkedList<QObject *> Glav::list()
{
    return m_list;
}

//void Glav::setList(const QLinkedList<QObject *> &list)
//{
//    m_list = list;
//}


//QVariant Glav::pol(){

//     QVariant re = QVariant::fromValue(m_list);
//    return re;
//}


QLinkedList<QObject *> Glav::pollist()
{
    //qDebug() << QVariant::fromValue(m_list);
    //QLinkedList<QObject *> f = m_list;
    //QVariant::fromValue(m_list);
    //qDebug() <<m_list;
    return m_list;
}

void Glav::addItem()
{
    qDebug() << m_list.count();
    m_list << new DataObject();
    qDebug() << m_list.count();
    emit changed();
}
}

解决方法

您的 Glav 类有一个 namespace App\Models; use Illuminate\Database\Eloquent\Model; class Media extends Model { protected $table = 'media'; public $timestamps = false; protected $primaryKey = 'Media_ID'; } 信号,但它没有做任何事情,因为您的列表属性是常量 (changed())

你应该把它改成这样:

Q_PROPERTY( QLinkedList<QObject *> list READ list CONSTANT )

这样您就可以通过发出 Q_PROPERTY(QLinkedList<QObject*> list READ list NOTIFY changed) 信号让 ListView 知道列表刚刚被更改。

另外,最好根据信号对应的属性来命名信号:changed()

官方文档中关于 Q_PROPERTY 工作原理的更多信息:https://doc.qt.io/qt-5/properties.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。