QT M/V架构开发实战:M/V架构的初步认识

### 开发中遇到的问题

  • [@[TOC](开发中遇到的问题)](#开发中遇到的问题 @TOC 初步介绍 模型类 视图类 委托 实例)
  • [初步介绍](#开发中遇到的问题 @TOC 初步介绍 模型类 视图类 委托 实例)
  • [模型类](#开发中遇到的问题 @TOC 初步介绍 模型类 视图类 委托 实例)
  • [视图类](#开发中遇到的问题 @TOC 初步介绍 模型类 视图类 委托 实例)
  • [委托](#开发中遇到的问题 @TOC 初步介绍 模型类 视图类 委托 实例)
  • [实例](#开发中遇到的问题 @TOC 初步介绍 模型类 视图类 委托 实例)

基于版本QT5.14.0

在用了这么久的QT后,在以前做导航栏的控件时,经常使用QPushbutton去做里面的Tab标签(如下图),但是后面用多了之后发现这样的实现方式太麻烦了,而且Tab标签一多就会很卡顿;然后就了解到了QT的MV框架;QT的MV框架其实就是指的是模型-视图框架,模型负责数据,视图负责界面,这样的作法就很好的把数据管理和用户界面展示分离,这样我们进行开发和后期维护都会比较顺利;

初步介绍

在QT中模型和视图都有现成的类供我们去使用,首先是模型的类有:QStandardItemModelQStringListModelQFileSystemModelQSqlQueryModelQSqlTableModelQSqlRelationalTableModel等,而这几个都是基于QAbstractItemModel这个抽象基类去实现的;

对应的视图的基类是QAbstractItemView ,其子类有QListViewQTableViewQTreeViewQColumnView等,在这篇文章中我将简单介绍这些模型和视图具体的一个应用场景,每一个类的详细介绍正在推进日程中。。。。

除此以外,其实MV模型还有一个强大的部分,那就是委托,委托可以帮你处理一些项样式,比如你想让这个项变红,那个项变绿,这个项点击变颜色等等操作,这些委托都可以帮你完成!委托的基类为QAbstractItemDelegate ,其子类有QStyledItemDelegate等,常用的就是这个样式委托

模型类

QAbstractItemModel

基类提供最基本的方法,所有子类共用的方法,比如说添加行\列,删除行\列,移动行\列,获取当前的行数\列数等等操作

QStandardItemModel

通用模型,可以存储树形或表格数据(每个单元格是一个 QStandardItem)。非常适合初学者和结构不太复杂的数据。


QStringListModel

专门用于存储简单的字符串列表(如:一列文件名)。类似于QStringList,可以存储所有项的文本


QFileSystemModel

提供本地文件系统的模型(目录和文件)。


QSqlQueryModel || QSqlTableModel || QSqlRelationalTableModel

用于连接和展示数据库数据。使用模型中的方法直接执行Sql语句,将数据拿出来

视图类

QAbstractItemView

一般创建了一个视图对象,就是使用QAbstractItemView中的setModel()方法将视图和模型连接起来

QListView

列表视图,显示一列数据项。参考最开始的图

QTableView

表格视图,显示二维表格数据。参考表格。

QTreeView

树形视图,显示层次结构(树状)数据。参考多级菜单,树形菜单。


QColumnView

列视图(类似 macOS Finder 的列视图)。可以发现QColumnView与QTreeView不同的是,QColumnView可以跨越多列,实际用到的场景的话不是很多。

委托

QStyledItemDelegate

提供单元项的美化和显示操作,如果没有美化效果的话就如QStringListModel中的图片一样,很素,如果加了样式美化的话可以像第一个动图那样好看!除此之外,委托还可以让单元格显示文字,显示控件等等作用

实例

实例一:基本表格

cpp 复制代码
#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QHeaderView>

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

    // 创建视图
    QTableView tableView;

    // 创建模型并设置数据
    QStandardItemModel model(4, 2); // 4行2列
    model.setHeaderData(0, Qt::Horizontal, "Name");
    model.setHeaderData(1, Qt::Horizontal, "Age");

    model.setData(model.index(0, 0), "Alice");
    model.setData(model.index(0, 1), 25);
    model.setData(model.index(1, 0), "Bob");
    model.setData(model.index(1, 1), 31);
    model.setData(model.index(2, 0), "Carol");
    model.setData(model.index(2, 1), 29);
    model.setData(model.index(3, 0), "Dave");
    model.setData(model.index(3, 1), 40);

    // 将模型设置给视图
    tableView.setModel(&model);
    
    // 调整列宽以适应内容
    tableView.horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
    
    tableView.resize(400, 300);
    tableView.show();

    return app.exec();
}

实例二:自定义委托,大于30的年龄用红色显示

cpp 复制代码
#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QHeaderView>
#include "AgeColorDelegate.h"

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

    QTableView tableView;

    QStandardItemModel model(4, 2);
    model.setHeaderData(0, Qt::Horizontal, "Name");
    model.setHeaderData(1, Qt::Horizontal, "Age");

    model.setData(model.index(0, 0), "Alice");
    model.setData(model.index(0, 1), 25);
    model.setData(model.index(1, 0), "Bob");
    model.setData(model.index(1, 1), 31);
    model.setData(model.index(2, 0), "Carol");
    model.setData(model.index(2, 1), 29);
    model.setData(model.index(3, 0), "Dave");
    model.setData(model.index(3, 1), 40);

    tableView.setModel(&model);
    
    // 设置委托到第二列(年龄列)
    AgeColorDelegate *delegate = new AgeColorDelegate(&tableView);
    tableView.setItemDelegateForColumn(1, delegate);
    
    tableView.horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
    tableView.resize(400, 300);
    tableView.show();

    return app.exec();
}

实例三:下拉框委托

cpp 复制代码
#ifndef COMBOBOXDELEGATE_H
#define COMBOBOXDELEGATE_H

#include <QStyledItemDelegate>

class ComboBoxDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit ComboBoxDelegate(QObject *parent = nullptr);
    
    QWidget *createEditor(QWidget *parent,
                          const QStyleOptionViewItem &option,
                          const QModelIndex &index) const override;
                          
    void setEditorData(QWidget *editor, const QModelIndex &index) const override;
    
    void setModelData(QWidget *editor,
                      QAbstractItemModel *model,
                      const QModelIndex &index) const override;
                      
    void updateEditorGeometry(QWidget *editor,
                              const QStyleOptionViewItem &option,
                              const QModelIndex &index) const override;
};

#endif // COMBOBOXDELEGATE_H

自己动手看一下效果,冲冲冲!!!!!

以上的话就是本文的全部内容,如果有什么错误或者建议请指正,感谢!共同进步!

相关推荐
Starshime2 小时前
【C语言】变量和常量
c语言·开发语言
Dontla2 小时前
Docker Compose healthcheck介绍(监控容器中服务的实际健康状态)数据库健康检查pg_isready
数据库·docker·容器
晨非辰2 小时前
#C语言——刷题攻略:牛客编程入门训练(十):攻克 循环控制(二),轻松拿捏!
c语言·开发语言·经验分享·学习·visual studio
semantist@语校2 小时前
第十九篇|东京世界日本语学校的结构数据建模:制度函数、能力矩阵与升学图谱
数据库·人工智能·线性代数·矩阵·prompt·github·数据集
数巨小码人2 小时前
Oracle SQL调优技巧实战指南
数据库·sql·oracle
noravinsc2 小时前
在银河麒麟v10上安装达梦8数据库
服务器·数据库·oracle
fdc20172 小时前
Avalonia 基础导航实现:从页面切换到响应式交互全指南
开发语言·javascript·ecmascript
没有bug.的程序员2 小时前
Redis 内存优化与压缩:从原理到实战的完整指南
java·数据库·redis·内存优化·压缩内存
肃清12 小时前
《Redis核心机制解析》
数据库·redis·缓存