qt5-入门-ModelView架构1

参考:
Qt model-view 架构_w3cschool
https://www.w3cschool.cn/learnroadqt/vtxz1j4y.html

QListWidget_w3cschool
https://www.w3cschool.cn/learnroadqt/yb2k1j51.html

C++ GUI Programming with Qt 4, Second Edition

本地环境:
win10专业版,64位,Qt 5.12


目录

  • item view
    • QListWidget
      • 效果:
      • 实现
    • QTableWidget
  • model view
    • QStringListModel
    • 效果
      • 实现

MVC在Qt中的实现是ModelView。其中model类似MVC中的model,但是view是view+delegate,就是对每种视图,Qt都提供了一个默认的代理。代理其实类似controller,负责渲染item和同步。

可以给一个model注册多个view,让这些view以不同的显示方式显示同一组数据,当model修改时,Qt自动同步这些view。如果数据很少,可以不用model,只用item view类,也就是QListWidget,QTableWidget,QTreeWidget,这些可以直接对item进行操作。如果数据很大,需要使用view类,如QListView,QTableView和QTreeView,同时需要提供一个model(可以是预制的也可以是自定义的)。

item view

是Qt封装好了的一些model-view类。易于使用但功能简单,同时缺少实时性支持。包括QListWidget,QTableWidget,QTreeWidget。前两个会给出实例,最后一个等用到了我再补。

QListWidget

效果:

在这里插入图片描述

实现

创建一个没有底部按钮的对话框,包含一个QListWidget类型的私有变量:

QListWidget *faqListWidget;

然后修改构造函数即可:

FAQDialog::FAQDialog(QWidget *parent) :QDialog(parent),ui(new Ui::FAQDialog)
{ui->setupUi(this);// 实例化faqListWidget = new QListWidget;// sourceQStringList faqList = {tr("xxxx收费吗?"),// 若干行内容tr("您可以联系在线客服。我们非常期待您的建议,希望能给您带来更好的产品和体验。")};int listWidgetRows = faqList.length();for (int i = 0; i < listWidgetRows; i++) {if (i % 2 == 1) {// 自定义的格式,省略} else {// 如果省略第一个参数,就没有前面的icon啦QListWidgetItem* item = new QListWidgetItem(QIcon("://resources/icon/help.png"), faqList[i]);item->setTextColor(QColor("#xxxxxx"));// 如果要指定字体,使用这种方式//item->setFont(QFont("Arial", 10));QFont myfont;myfont.setBold(false);// 如果不希望修改字体,只想修改字号myfont.setPointSize(10);item->setFont(myfont);// 添加faqListWidget->addItem(item);}}// 自动换行faqListWidget->setWordWrap(true);QHBoxLayout *layout = new QHBoxLayout;layout->addWidget(faqListWidget);setLayout(layout);
}

QTableWidget

这里写过:
qt5-入门-QTableWidget简单使用-CSDN博客
https://blog.csdn.net/pxy7896/article/details/136727852

model view

  • model更新的时候会自动更新view
  • model一般是数据集合,可以为不同的业务建立不同的model
  • Qt预定义了一些model,如QStringListModelQDirModelQSOrtFilterProxyModel
  • view大致有list、tree和table

QStringListModel

效果

有三个按钮,点击新增:
在这里插入图片描述
增加一个e:
在这里插入图片描述
删除Letter C:
在这里插入图片描述
点击Show展示所有数据:
在这里插入图片描述

实现

头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QStringListModel>
#include <QListView>
#include <QWidget>namespace Ui {
class MainWindow;
}class MainWindow : public QWidget
{Q_OBJECTpublic:MainWindow();~MainWindow();private slots:void insertData();void delData();void showData();private:QStringListModel *model;QListView *listView;
};#endif // MAINWINDOW_H

源文件说明:

  • listView->currentIndex()是获取QListView当前行,但是返回值是QModelIndex类型,这个类型保存了行、列和属于哪个model。
  • insertRows(row, 1)是在哪行(row),插入几次(1)
  • model->setData(index, text);第一个参数是QModelIndex类型
  • 插入流程:先在Model中插入空白行(insertRows(row, 1)),然后给空白行设置内容(model->setData(index, text);),再设置当前的index,最后设置这行是可以编辑的(listView->edit(index);
  • 如果model是空的,那么listView->currentIndex()的行列都是-1
#include "mainwindow.h"
//#include "ui_mainwindow.h"#include <QHBoxLayout>
#include <QPushButton>
#include <QInputDialog>
#include <QMessageBox>MainWindow::MainWindow()
{model = new QStringListModel(this);QStringList data;data << "Letter A" << "Letter B" << "Letter C";model->setStringList(data);listView = new QListView(this);listView->setModel(model);// 布局QHBoxLayout *btnLayout = new QHBoxLayout;QPushButton *insertBtn = new QPushButton(tr("insert"), this);QPushButton *delBtn = new QPushButton(tr("Delete"), this);QPushButton *showBtn = new QPushButton(tr("Show"), this);btnLayout->addWidget(insertBtn);btnLayout->addWidget(delBtn);btnLayout->addWidget(showBtn);QVBoxLayout *mainLayout = new QVBoxLayout(this);mainLayout->addWidget(listView);mainLayout->addLayout(btnLayout);this->setLayout(mainLayout);// 连接connect(insertBtn, SIGNAL(clicked()), this, SLOT(insertData()));connect(delBtn, SIGNAL(clicked()), this, SLOT(delData()));connect(showBtn, SIGNAL(clicked()), this, SLOT(showData()));
}MainWindow::~MainWindow()
{
}void MainWindow::insertData() {bool isOK;QString text = QInputDialog::getText(NULL, "Insert", "Please input new data:",QLineEdit::Normal, "You are inserting new data.",&isOK);if(isOK) { // 如果用户点击了ok按钮// 获取行int row = listView->currentIndex().row();// 第二个参数是count,1表示插入1次model->insertRows(row, 1);QModelIndex index = model->index(row);model->setData(index, text);listView->setCurrentIndex(index);// 表示可以被编辑listView->edit(index); }
}void MainWindow::delData() {if(model->rowCount() > 1) {model->removeRows(listView->currentIndex().row(), 1);}
}void MainWindow::showData() {QStringList data = model->stringList();QString str;foreach(QString s, data) {str += s + "\n";}QMessageBox::information(this, "Data", str);
}

上述的代码,如果model是空的,那么无法做插入操作,因为: listView->currentIndex().row()此时为-1,那么model->insertRows(row, 1)会报错。这个显然不符合逻辑。。因此注释掉data << "Letter A" << "Letter B" << "Letter C";,修改插入和删除函数:

void MainWindow::insertData() {bool isOK;QString text = QInputDialog::getText(NULL, "Insert", "Please input new data:",QLineEdit::Normal, "You are inserting new data.",&isOK);if(isOK) {int row = listView->currentIndex().row();//qDebug() << row;QModelIndex index;// 此时model其实是空的if (row == -1) {model->insertRows(0, 1);index = model->index(0);} else {model->insertRows(row, 1);index = model->index(row);}model->setData(index, text);listView->setCurrentIndex(index);listView->edit(index);}
}void MainWindow::delData() {model->removeRows(listView->currentIndex().row(), 1);
}

done.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/568565.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SqlServer期末复习(数据库原理及应用)持续更新中

一、SQL语句 1.1 SQL语句知识引入 1.DDL语言(数据定义语言&#xff09;主要是进行定义/改变表的结构、数据类型、表之间的链接等操作&#xff0c;关键字CREATE、DROP、ALTER CREATE TABLE 表面( 列名1 数据类型&#xff0c; 列名2 数据类型&#xff0c; ) ALTER TABLE 表名&a…

[Android]模拟器登录Google Play失败

问题&#xff1a; 模拟器登录Google Play失败&#xff0c;提示couldnt sign in there was a problem communicating with google servers. try again later. 原因&#xff1a; 原因是模拟器没有连接到互联网&#xff0c;打开模拟器中Google浏览器进行搜索一样不行。 解决&am…

2.9、创建网格(Grid/GridItem)

概述 网格布局是由“行”和“列”分割的单元格所组成,通过指定“项目”所在的单元格做出各种各样的布局。网格布局具有较强的页面均分能力,子组件占比控制能力,是一种重要自适应布局,其使用场景有九宫格图片展示、日历、计算器等。 ArkUI提供了Grid容器组件和子组件GridI…

JDBC基础编程练习

目录​​​​​​​ 第1关&#xff1a;JDBC更新员工密码 任务描述 实验一代码&#xff1a; 第2关&#xff1a;JDBC查询员工信息 任务描述 实验二代码&#xff1a; 第1关&#xff1a;JDBC更新员工密码 任务描述 本关任务&#xff1a;借助JDBC在库名tsgc中完成对数据表emp…

Python:基础语法

一、import与from.....import 有时候我们需要使用一些第三方库或包时&#xff0c;我们就需要通过import或from.....import导入模块。 # 导入库 import sys print("hello,world") 当我们自己写了些函数&#xff0c;在其他py文件&#xff0c;我们也可以通过from.....im…

SQL练习【个人练习】

SQL练习&#xff0c; 去除了过于简单的SQL语句 常用函数的使用concat&substringlike&left切割&正则比较&时间函数(date_format/year/month)时间函数匹配 group by子查询Union 前几天做笔试的时候狠狠拷打了SQL&#xff0c;并不是很难的题目&#xff0c;现在想起…

leetcode 225.用队列实现栈 JAVA

题目 思路 1.一种是用双端队列&#xff08;Deque&#xff09;&#xff0c;直接就可以调用很多现成的方法&#xff0c;非常方便。 2.另一种是用普通的队列&#xff08;Queue&#xff09;,要实现栈的先入后出&#xff0c;可以将最后一个元素的前面所有元素出队&#xff0c;然后…

机器学习基础——模型评估与选择(部分)

为了实现对模型指导&#xff0c;实现自主建模&#xff0c;我们会对模型进行选择和评估&#xff0c;主要有以下几个问题&#xff1a; 一、前言&#xff1a;误差与拟合 &#xff08;一&#xff09;经验误差 使用上述流程理解&#xff0c;其中 a 为预测错误的个数&#xff0c;m为…

【Rust】——提取函数消除重复代码和泛型

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

工时表软件:项目管理的效率利器

在当今的项目管理实践中&#xff0c;时间是最宝贵的资产之一。精准地追踪和管理项目工时对于项目的成功至关重要。工时表软件作为一种现代管理工具&#xff0c;其应用不仅简化了项目管理流程&#xff0c;还提高了工作效率&#xff0c;已成为现代企业管理不可或缺的一项利器。 …

深入解析ECC(椭圆曲线密码学)加解密算法

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 本文将详细介绍ECC&#xff08;椭圆曲线密码学&#xff09;加解密算法的原理、特点及应用。ECC作为一种新型的公钥密码体制&#…

FL Studio21.2.3最新中文编曲音乐制作软件新版本功能介绍

一、前言 随着科技的发展&#xff0c;越来越多的人开始尝试自己创作音乐。然而&#xff0c;传统的音乐制作过程复杂繁琐&#xff0c;需要昂贵的硬件设备和专业的知识技能。那么&#xff0c;有没有一款软件可以让普通人也能轻松地制作出专业级别的音乐作品呢&#xff1f;答案就…