当前位置: 首页 > news >正文

qml使用c++自定义listmodel数据

qml要使用c++中自定义的model,首先该model类需要继承QAbstractListModel类,然后需要重写其中的三个函数,分别是
int rowCount(const QModelIndex &parent);
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole);
QHash<int,QByteArray> roleNames();

代码如下:
DriverModel.h

#ifndef DRIVERMODEL_H
#define DRIVERMODEL_H


#include <QStringList>
#include <QObject>
#include <QtQml>


class DriverModel : public QAbstractListModel
{
    Q_OBJECT
public:

    typedef struct DriverData{
        QString type;
        QString desc;
        QString version;
    }DriverData;

    static DriverModel *instance(QObject *parent = nullptr) {
        static DriverModel *instance = nullptr;
        static std::mutex instance_mutex;
        if (instance == nullptr) {
            std::lock_guard<std::mutex> guard(instance_mutex);
            if (instance == nullptr) {
                instance = new DriverModel(parent);
            }
        }
        return instance;
    }

    explicit DriverModel(QObject *parent = nullptr){
        appendItem(QString::fromLocal8Bit("显卡"),"Raden RX220","1.25.0.1");
    }

    enum LIST_ITEM_ROLE
    {
        type = Qt::UserRole+1,
        desc,
        version
    };


public:
    //必须重写三个函数
    int rowCount(const QModelIndex &parent) const override
    {
        Q_UNUSED(parent);
        return m_list.count();
    }
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
    {
        int row = index.row();
        if(row < 0 || row >= m_list.count()) {
            return QVariant();
        }

        switch(role)
        {
        case type:
            return m_list.value(row).type;
        case desc:
            return m_list.value(row).desc;
        case version:
            return m_list.value(row).version;
        default:
            break;
        }

        return QVariant();
    }
    QHash<int,QByteArray> roleNames() const override
    {
        QHash<int, QByteArray> roles;
        roles[desc] = "desc";
        roles[type] = "type";
        roles[version] = "version";
        return roles;
    }

public:
    //追加数据
    void appendItem(const QString& type,const QString& desc,const QString& version)
    {
        DriverData data;
        data.type = type;
        data.desc = desc;
        data.version = version;

        beginInsertRows(QModelIndex(), m_list.size(), m_list.size());
        m_list.append(data);
        endInsertRows();
    }
    //清空模型数据
    void clearModelData() {
        beginResetModel();
        m_list.clear();
        endResetModel();
    }



private:
    QList<DriverData> m_list;

};



#endif // DRIVERMODEL_H

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "DriverModel.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    engine.rootContext()->setContextProperty("driverModel",DriverModel::instance());

    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.Window 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ListView{
        width: parent.width
        height: parent.height
        visible: true
        model: driverModel
        delegate: Item{
            Text{
                id:text1
                text: type
            }
            Text{
                id:text2
                text: desc
                anchors.top: text1.bottom
            }
            Text{
                text: version
                anchors.top: text2.bottom
            }
        }
    }
}

相关文章:

  • Android学习之路(16) Android 数据库Litepal
  • 利用norm.ppfnorm.interval分别计算正态置信区间[实例]
  • 深度学习(1)---卷积神经网络(CNN)
  • Audacity 使用教程:轻松录制、编辑音频
  • OpenCV实现视频的追踪(meanshift、Camshift)
  • Ubuntu Zookeeper开机自启动服务
  • 快速选择排序
  • Spring的注解开发-注解方式整合MyBatis代码实现
  • 辅助驾驶功能开发-测试篇(2)-真值系统介绍
  • 宝塔反代openai官方API接口详细教程,502 Bad Gateway问题解决
  • 【IPC 通信】信号处理接口 Signal API(6)
  • 点击router-link时候会发生什么?
  • 分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测
  • 步力宝科技爆款产品定位,开创智能物联网新商业
  • 博客无限滚动加载(html、css、js)实现
  • 简化数据库操作:探索 Gorm 的约定优于配置原则
  • javaWeb学生信息管理
  • 读书笔记|《数据压缩入门》—— 柯尔特·麦克安利斯 亚历克斯·海奇
  • 网盘搜索引擎:点亮知识星空,畅享数字宝藏!
  • 【NLP的python库(03/4) 】: 全面概述
  • 影子调查丨义门陈遗址建筑被“没收”风波
  • 网络社群的早期历史及其启示
  • 上海地铁5G信号全覆盖后网速如何?记者亲测有这些发现
  • 欧洲央行再次宣布降息:三大关键利率分别下调25个基点
  • 广西吃了自然保护地划得过多的亏?自治区党委书记要求廓清模糊认识
  • 商务部:中方愿与欧方共同努力,维护多边贸易体制