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
cpp
#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
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
cpp
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
}
}
}
}