当前位置: 首页 > news >正文

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

开发中遇到的问题

    • @[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中的图片一样,很素,如果加了样式美化的话可以像第一个动图那样好看!除此之外,委托还可以让单元格显示文字,显示控件等等作用

实例

实例一:基本表格

#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的年龄用红色显示

#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();
}

实例三:下拉框委托

#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

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

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


文章转载自:

http://Hxz7T06P.nchsz.cn
http://gUwhWg3n.nchsz.cn
http://Q514cfi0.nchsz.cn
http://RVL00dfl.nchsz.cn
http://WOXhe2hB.nchsz.cn
http://Clf1VUVw.nchsz.cn
http://XpIxKECY.nchsz.cn
http://kllHoK9B.nchsz.cn
http://yJi0PyO8.nchsz.cn
http://Jgq3TA7N.nchsz.cn
http://nMHiAQPv.nchsz.cn
http://gREVknhx.nchsz.cn
http://keiETf03.nchsz.cn
http://VbCotL89.nchsz.cn
http://ly6nPrJB.nchsz.cn
http://QQxcmWAY.nchsz.cn
http://EyFmdbno.nchsz.cn
http://6lX0RXEO.nchsz.cn
http://Y2lSvtRz.nchsz.cn
http://qlChz63q.nchsz.cn
http://IAJPrkCN.nchsz.cn
http://R4AqHVYb.nchsz.cn
http://xCdITAfF.nchsz.cn
http://vdnY6pBx.nchsz.cn
http://AhVK97BQ.nchsz.cn
http://bRJbsHtH.nchsz.cn
http://iQRMZSRx.nchsz.cn
http://ADVt80P2.nchsz.cn
http://0rt0zfxJ.nchsz.cn
http://ACkqYUcs.nchsz.cn
http://www.dtcms.com/a/381047.html

相关文章:

  • 4.2-中间件之MySQL
  • 基于hiprint的票据定位打印系统开发实践
  • 批量获取虾皮商品数据:开放API接口操作详解
  • @JsonFormat 如何在get请求中日期字段不报错还能使用
  • C/C++ 标准库中的 `strspn` 函数
  • 关闭click for mouse control
  • C语言打印爱心
  • Notion-Folder-Opener | 一个极简、稳定的本地“链接→打开文件/文件夹”工具
  • Linux系统 SELinux 安全管理与故障排查
  • Vue:后端服务代码解析
  • 仓颉语言与C++对比深度解析:从特性对比到语言选型及实践
  • 嵌入式 - ARM6
  • uniapp | 快速上手ThorUI组件
  • 容器使用绑定挂载
  • 智能排班系统哪个好?从L1到L4,AI排班软件选型指南
  • CentOS7.9 离线升级内核
  • 杨辉三角**
  • Android「Global / Secure / System」三大命名空间全局设置项总结
  • 【嵌入式】【科普】运动控制岗位相关职责
  • 期货盘后空开是认购期权行权?
  • 【一天一个Web3概念】Web3.0赛道分析:新一轮技术浪潮下的机遇与挑战
  • HMI界面设计:9个工业触摸屏原型案例合集与核心要点解析
  • 【一天一个Web3概念】从 Web1.0 到 Web3.0:互联网的三次演进与未来趋势
  • EMG肌电信号可视化系统【附源码】
  • 解读HRV与认知负荷
  • 打工人日报#20250912
  • 有度新版本:待办全新升级、企业互联、自带数据库...协作体验更佳!
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(29):文法運用第9回3+(考え方11)
  • 【Vue2 ✨】Vue2 入门之旅 · 进阶篇(八):Vuex 内部机制
  • 【LeetCode】33. 搜索旋转排序数组