赞
踩
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 } } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。