IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> QML学习十六:ListView的简单使用(使用C++ Model) -> 正文阅读

[C++知识库]QML学习十六:ListView的简单使用(使用C++ Model)

若该文为原创文章,转载请注明原文出处

一、如何使用C++自定义Model

ListView可以使用C++语言定义的Model,可以从QAbstractItemModel或者QAbstractListModel继承来实现自己的Model类。

具体如何实现?

其实只需要重写rowCount()、data()、rowNames()这三个方法。
对于Qt Quick中的ListView,Delegate通过role-name来访问Model中的数据,当我们在QML中写下Text{text:desc;}这样的Delegate时,意味着将名字为desc的role对应的数据赋值给Text对象的text属性。

如何从desc找到实际的数据

这就要依赖rowNames()函数,QHash<int,QBythArray> roleNames() const 返回一个哈希表,将role与rolename关联起来,当QML中提供role-name时,那么就可以反查到role,进而以查到的role来调用data()方法,就可以获取到实际的数据。

二、例子

工程所使用的是第一个qml工程。

一、创建C++ Model

1、创建文件

?类名:QListModel,继承QAbstractListModel.

?创建完成后,文件会自动生成headerData()、rowCount()、data()等函数。

而我们要做的就是修改这些函数。headerData()函数没什么用,可以删除。

二、修改QlistModel文件

1、创建数据

在QListModel.h中创建?QHash和QList。

在QListModel.cpp中创建数据

2、重写rowCount()、data()、rowNames()

返回QHash数据:

?返回数据长度:

?

?获取数据:

三、C++Model注册

注册相对简单,直接注册就好。

四、QML调用model

?在qml下直接访问

?

?三、完整代码

?1、main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "myobject.h"

#include "QListModel.h"

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

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    QListModel listModel;
    engine.rootContext()->setContextProperty("QListModel", &listModel);

    engine.load(QUrl(QLatin1String("qrc:/main.qml")));

    return app.exec();
}

2、QListModel.h

#ifndef QLISTMODEL_H
#define QLISTMODEL_H

#include <QAbstractListModel>
#include <QObject>

struct LIST_ITEM_INFO {
    QString qsAnimeName;
    QString qsAnimeLead;
};


class QListModel : public QAbstractListModel
{
    Q_OBJECT

public:
    explicit QListModel(QObject *parent = nullptr);

    // Basic functionality:
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;

    QHash<int,QByteArray> roleNames() const override;

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;

    Q_INVOKABLE QAbstractItemModel* model();

public:
    enum LIST_ITEM_ROLE
    {
        animeNameRole = Qt::UserRole+1,
        animeLeadRole,
    };

private:
    QList<LIST_ITEM_INFO>           m_date;
    QHash<int,QByteArray>           m_roleName;

};

#endif // QLISTMODEL_H

3、QListModel.cpp

#include "QListModel.h"

QListModel::QListModel(QObject *parent)
    : QAbstractListModel(parent)
{
    m_roleName.insert(animeNameRole, "animeName");
    m_roleName.insert(animeLeadRole, "animeLead");

    m_date = {
        { "vivo", "1200"},
        { "meizu", "1300"},
        { "apple", "1400"},
        { "huawei", "1500"},
    };

}

QHash<int, QByteArray> QListModel::roleNames() const
{
   return m_roleName;
}

int QListModel::rowCount(const QModelIndex &parent) const
{
    if (parent.isValid())
        return 0;

    return m_date.size();
}

QVariant QListModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    switch(role)
    {
    case animeNameRole:
        return m_date.value(index.row()).qsAnimeName;
    case animeLeadRole:
        return m_date.value(index.row()).qsAnimeLead;
    default:
        break;
    }

    return QVariant();
}

QAbstractItemModel *QListModel::model()
{
    return this;
}

4、MyListView.qml

import QtQuick 2.7
import QtQml.Models 2.12



Rectangle {
    id: listViewRct

    width: 400
    height: 300

    ListView {
        id: listView

        anchors.fill: parent
        model: QListModel
        delegate: listViewDelegate
        highlight: Rectangle {
            color: "yellow"
        }
    }

    Component {
        id: listViewDelegate

        Item {
            id: listItem

            width: parent.width
            height: 30
            Text {
                anchors.verticalCenter: parent.verticalCenter
                anchors.left: parent.left
                anchors.leftMargin: 5

                text: qsTr(animeName + ":" + animeLead)
                font.family: "微软雅黑"
                font.pointSize: 12
                color: "#46A4BB"
            }

            MouseArea {
                anchors.fill: parent

                onClicked: {
                    listItem.ListView.view.currentIndex = index;
                }
            }
        }
    }
}

5、main.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12

Window {
    id: window
    visible: true
    width: 600
    height: 480
    title: qsTr("QML自定义组件")

    Rectangle {
        id: baseRct

        anchors.fill: parent
        color: "lightblue"

        MyListView {
            anchors.centerIn: parent
        }
    }
}

编译结果:

四、总结

自定义model主要是要重写data()等函数,QTableModel、QTableModel调用方法也类似。

如有侵权,请及时联系博主删除,VX:18750903063

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-25 17:54:42  更:2022-06-25 17:56:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 11:40:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码