QT------模型/视图

发布于:2025-02-11 ⋅ 阅读:(116) ⋅ 点赞:(0)

一、模型/视图结构概述

  • 基本原理
    • Qt 的模型/视图(Model/View)架构将数据的存储和显示分离,提高了代码的可维护性和复用性。
    • 模型(Model):负责存储和管理数据,提供数据的访问接口,如获取数据、插入数据、修改数据、删除数据等。
    • 视图(View):负责显示数据,不关心数据的存储和操作,只根据模型的数据进行显示。
    • 代理(Delegate):负责在视图中渲染和编辑数据项,提供了一种机制来定制数据的显示和编辑方式,例如使用自定义的部件进行数据的编辑。

二、QAbstractItemModel 类

  • 功能
    • 是所有项模型的抽象基类,定义了项模型必须实现的接口,如 rowCountcolumnCountdatasetData 等,用于提供数据的存储和操作接口。
    • 可以自定义继承自 QAbstractItemModel 的模型类,以满足不同的数据存储和操作需求。

三、QAbstractItemView 类

  • 功能
    • 是所有项视图的抽象基类,提供了显示数据的通用接口,如 setModel 用于关联一个模型,视图会根据模型的数据进行显示和更新。
    • 常见的派生类有 QListViewQTreeViewQTableView 等,分别用于列表、树状、表格形式的数据显示。

四、QStringListModel 类及示例程序功能实现

  • 功能
    • 存储一个字符串列表,方便地用于 QListViewQComboBox 等视图的数据显示。
#include <QApplication>
#include <QListView>
#include <QStringListModel>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);


    QStringListModel *model = new QStringListModel;
    QStringList stringList;
    stringList << "Item 1" << "Item 2" << "Item 3";
    model->setStringList(stringList);


    QListView *listView = new QListView;
    listView->setModel(model);


    listView->show();


    return app.exec();
}
  • 代码解释
    1. 创建一个 QStringListModel 并添加一些字符串元素。
    2. 创建一个 QListView 并将 QStringListModel 设置为其模型,QListView 将显示字符串列表中的元素。

五、自定义代理

  • 自定义代理功能
    • 允许用户自定义数据在视图中的显示和编辑方式,例如使用自定义的部件进行数据的编辑,或者添加一些特定的显示效果。
      在这里插入图片描述

六、QStyledItemDelegate 类及设计自定义代理类

  • 功能
    • 提供了默认的数据项显示和编辑功能,可作为自定义代理的基类。
#include <QApplication>
#include <QListView>
#include <QStyledItemDelegate>
#include <QPainter>
#include <QStyleOptionViewItem>


class CustomDelegate : public QStyledItemDelegate
{
protected:
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        QStyleOptionViewItem opt = option;
        initStyleOption(&opt, index);


        // 自定义绘制
        painter->save();
        painter->setPen(Qt::red);
        painter->drawText(opt.rect, Qt::AlignCenter, index.data().toString());
        painter->restore();
    }


    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        // 创建自定义编辑器
        QLineEdit *editor = new QLineEdit(parent);
        return editor;
    }


    void setEditorData(QWidget *editor, const QModelIndex &index) const override
    {
        QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);
        if (lineEdit) {
            lineEdit->setText(index.data().toString());
        }
    }


    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
    {
        QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);
        if (lineEdit) {
            model->setData(index, lineEdit->text());
        }
    }


    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        editor->setGeometry(option.rect);
    }
};


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);


    QStringListModel *model = new QStringListModel;
    QStringList stringList;
    stringList << "Item 1" << "Item 2" << "Item 3";
    model->setStringList(stringList);


    QListView *listView = new QListView;
    listView->setModel(model);


    CustomDelegate *delegate = new CustomDelegate;
    listView->setItemDelegate(delegate);


    listView->show();


    return app.exec();
}
  • 代码解释
    1. 自定义 CustomDelegate 类,继承自 QStyledItemDelegate
    2. paint 方法用于自定义数据项的绘制,这里将文本绘制为红色。
    3. createEditor 方法创建自定义的编辑部件(这里是 QLineEdit)。
    4. setEditorData 方法将模型数据设置到编辑器中。
    5. setModelData 方法将编辑器的数据更新到模型中。
    6. updateEditorGeometry 方法设置编辑器的位置和大小。

七、QFileSystemModel 和 QTreeView 类及示例程序功能实现

  • 功能
    • QFileSystemModel 提供了文件系统的数据模型,可以显示文件和目录。
    • QTreeView 可以用来显示 QFileSystemModel 提供的数据。
#include <QApplication>
#include <QTreeView>
#include <QFileSystemModel>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);


    QFileSystemModel *model = new QFileSystemModel;
    model->setRootPath(QDir::homePath());


    QTreeView *treeView = new QTreeView;
    treeView->setModel(model);
    treeView->setRootIndex(model->index(QDir::homePath()));


    treeView->show();


    return app.exec();
}
  • 代码解释
    1. 创建 QFileSystemModel 并设置根路径为用户的主目录。
    2. 创建 QTreeView 并将 QFileSystemModel 设置为其模型。
    3. QTreeView 的根索引设置为用户主目录,使其显示用户主目录下的文件和目录结构。
      在这里插入图片描述

网站公告

今日签到

点亮在社区的每一天
去签到