Qt中的Model与View 3:从样例出发理解QStringListModel和QListView

目录

Ui文件设计如下:

初始化窗口

这里,就是一经典的例子

你可以看到,我们的环境变量是一个经典的List列表,其中承载的就是我们的字符串。我们现在来仿照着搞一个:

Ui文件设计如下:

我们下面来逐一演示用法。

初始化窗口

首先我们说,Qt的Model View编程必须有Model和对应的显示的View。这里,我们的View已经在Ui设计文件的左下角的ListView出现了,Model呢?则需要我们自己存储住:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QStringListModel>
​
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
​
class MainWindow : public QMainWindow {Q_OBJECT
​
public:MainWindow(QWidget *parent = nullptr);~MainWindow();
private:static constexpr const char *LISTS_DATA_ORG[] = {"Apple", "Banana", "你好", "Shenzhen", "我也不知道写啥了,乐!"};
​QStringList                       original_stringlist;std::unique_ptr<QStringListModel> model;Ui::MainWindow                   *ui;
};
#endif  // MAINWINDOW_H
​

可以看到我们使用了QStringListModel作为存储,当然unique_ptr是一个智能指针,笔者这里习惯使用了,您可以直接使用new分配内存,也行!

MainWindow::MainWindow(QWidget* parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);
​// 初始化StringList列表for (const auto& each : MainWindow::LISTS_DATA_ORG)original_stringlist << each;
​// 初始化一下我们的modelmodel = std::make_unique<QStringListModel>(this);
​model->setStringList(original_stringlist);
​ui->listView->setModel(model.get());::setIfEnableEdit(ui->listView, true);
}

我们的Model的来源就是使用setStringList这接口来设置数据的。之后我们使用其他的例子也是一样,寻找这个Model的设置接口的函数。

不要忘记,我们的Model初始化完成数据之后要交给View显示里面的数据,这里,所有的View都存在接口setModel,请不要忘记调用!

最后的setIfEnableEdit是笔者自己封装的函数,结合上一篇博客所学,我们轻而易举的能写出:

static void setIfEnableEdit(QListView* view, bool is_editable) {is_editable ? view->setEditTriggers(QAbstractItemView::DoubleClicked |QAbstractItemView::SelectedClicked) /* is editable */: view->setEditTriggers(QAbstractItemView::NoEditTriggers); /* is not  editable*/
}

当然,static表达的是文件内部调用不暴露使用,当我们想要使用编辑功能的时候,需要设置view是:QAbstractItemView::DoubleClicked |QAbstractItemView::SelectedClicked(表达的是双击 或者是 点中项再点击选择的意思)。禁用编辑就是不分配触发点击的flag!

void MainWindow::on_btnResumeList_clicked() {model->setStringList(original_stringlist);
}
​
void MainWindow::on_btnListClear_clicked() {model->setStringList({});// model->removeRows(0,m_model->rowCount())
}
​
void MainWindow::on_chkEditable_clicked(bool checked) {::setIfEnableEdit(ui->listView, checked);
}

这三个接口:回复列表,清空列表和允许编辑很好理解,这里不展开

void MainWindow::on_btnListAppend_clicked() {model->insertRow(model->rowCount());auto modelIndex = model->index(model->rowCount() - 1);model->setData(modelIndex, "键入新值");ui->listView->setCurrentIndex(modelIndex);
}
​
void MainWindow::on_btnListInsert_clicked() {auto indexRow = ui->listView->currentIndex().row();if (indexRow == -1) {// 用户没选中, 可以做尾插,也可以提示(这个最好!)return on_btnListAppend_clicked();}model->insertRow(indexRow);auto modelIndex = model->index(indexRow);model->setData(modelIndex, "键入插入的新值!");ui->listView->setCurrentIndex(modelIndex);
}
​
void MainWindow::on_btnListDelete_clicked() {auto indexRow = ui->listView->currentIndex().row();// 当然最合适的还是做用户处理!if (indexRow == -1) return;
​model->removeRow(indexRow);
}

上面插入的和删除的我说一嘴:我们拿到modelIndex是一个索引不是数据本身,数据还是在背后存储的model里。所以我们需要绕个弯取model项!

void MainWindow::on_btnListMoveUp_clicked() {auto indexRow = ui->listView->currentIndex().row();auto index    = QModelIndex();  // ListModel没有父节点if (indexRow == -1) return;
​model->moveRow(index, indexRow, index, indexRow - 1);
}
​
void MainWindow::on_btnListMoveDown_clicked() {auto indexRow = ui->listView->currentIndex().row();auto index    = QModelIndex();  // ListModel没有父节点if (indexRow == -1) return;
​model->moveRow(index, indexRow, index, indexRow + 2);
}

上下移动使用moveRow函数,注意参数名称就告诉你第一个和第三个参数是modelIndex父节点,所以,对于ListView没有父节点的view是传ModelIndex()的默认构造。

void MainWindow::on_btnListSort_clicked() {model->sort(0);
}

sort是对内容的排序,默认是升序,你可以设置第二个参数!

void MainWindow::on_listView_clicked(const QModelIndex& index) {const QString gain_printed_string = QString::asprintf("row: %d, column: %d, data:", index.row(), index.column());const QString gain_data = ui->listView->currentIndex().data().toString();statusBar()->showMessage(gain_printed_string + gain_data);
}
​
​

上面是点击了ListView的项做出的反应,可以一览!

最后是两个显示:

void MainWindow::on_btn_clear_data_clicked() {ui->textEdit->clear();
}
​
void MainWindow::on_btn_fetch_data_clicked() {const QStringList display = model->stringList();for (const auto& each : display) {ui->textEdit->append(each);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【简信CRM-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

Python 三维图表绘制指南

Python 三维图表绘制指南 在数据可视化中&#xff0c;三维图表可以更直观地展示数据之间的关系&#xff0c;尤其是当数据具有多个维度时。Python 提供了多个库来绘制三维图表&#xff0c;其中最常用的就是 Matplotlib。本文将介绍如何使用 Matplotlib 绘制三维图表&#xff0c…

粒子群优化双向深度学习!PSO-BiTCN-BiGRU-Attention多输入单输出回归预测

粒子群优化双向深度学习&#xff01;PSO-BiTCN-BiGRU-Attention多输入单输出回归预测 目录 粒子群优化双向深度学习&#xff01;PSO-BiTCN-BiGRU-Attention多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现PSO-BiTCN-BiGRU-Attention粒子…

智能离线语音识别不灵敏?如何改善和提升识别率?

前言 有用户反馈离线语音识别不灵敏&#xff0c;跟着笔者一起分析原因吧。笔者知识能力有限&#xff0c;难免会误&#xff0c;还请大家批评指正。 1 影响离线语音识别的因素 笔者分析离线语音识别不灵敏的原因有以下几点 1.1 运行硬件的算力限制 由于离线语音识别在本地MCU…

7.qsqlquerymodel 与 qtableview使用

目录 qtableview 委托QStyledItemDelegateQAbstractItemDelegateCheckBoxItemDelegate使用qtableview控制列宽&#xff0c;行高&#xff0c;隐藏拖拽行列 qtableview 委托 //设置单元格委托 void setItemDelegate(QAbstractItemDelegate *delegate); QAbstractItemDelegate *it…

加入广告联盟有什么条件吗?

加入广告联盟往往并非是一件轻而易举的事情&#xff0c;而是需要满足一系列特定的条件。这些条件的确会因不同的广告联盟而存在显著的差异&#xff0c;然而&#xff0c;以下所列举的是一些在众多广告联盟中较为常见的加入条件。 首先&#xff0c;内容合规是至关重要的一点。发…

实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎

摘要&#xff1a;本文整理自阿里云智能集团研究员、开源大数据平台负责人王峰&#xff08;莫问&#xff09;老师在云栖大会的开源大数据专场上的分享。主要有以下几个内容&#xff1a; 1. Apache Flink 已经成为业界流计算事实标准 2. Flash 向量化流计算引擎核心技术解读 3. F…

springboot《计算机网络》在线考试系统-计算机设计毕业源码22248

摘要 计算机网络课程是计算机科学与技术、信息技术及相关专业的一门重要课程。然而&#xff0c;在传统的教育模式下&#xff0c;计算机网络课程的考核方式多以纸质试卷为主&#xff0c;这种方式存在诸多弊端。一方面&#xff0c;试卷的编制、印刷、分发、收缴等环节耗时耗力&am…

【K8S系列】Kubernetes 中 Service 更改未生效的故障排查与解决方案【已解决】

在 Kubernetes 中&#xff0c;Service 是实现 Pod 之间通信的核心组件。当您对 Service 进行更改&#xff08;如修改端口或选择器&#xff09;时&#xff0c;有时可能会发现这些更改未能生效&#xff0c;导致服务无法正常工作。本文将详细描述这一问题&#xff0c;并提供故障排…

【C++】AVL树

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;C从小白到高手 &#x1f339;往期回顾&#x1f339;&#xff1a;【C】STL----map和set &#x1f516; 流水不争&#xff0c;争的是滔滔不息 AVL树通过维护树的平衡来确…

用Puppeteer点击与数据爬取:实现动态网页交互

用Puppeteer与代理IP抓取51job招聘信息&#xff1a;动态网页交互与数据分析 引言 在数据采集领域&#xff0c;传统的静态网页爬虫方式难以应对动态加载的网页内容。动态网页通常依赖JavaScript加载数据&#xff0c;用户需要与页面交互才能触发内容显示。因此&#xff0c;我们…

砥砺十年风雨路,向新而行创新程丨怿星科技十周年庆典回顾

10月24日&#xff0c;是一年中的第256天&#xff0c;也是程序员节&#xff0c;同时也是怿星的生日。2014年到2024年&#xff0c;年华似水匆匆一瞥&#xff0c;多少岁月轻描淡写&#xff0c;怿星人欢聚一堂&#xff0c;共同为怿星科技的十周年庆生&#xff01; 01.回忆往昔&…

【vue-pdf】简单封装pdf预览组件

【vue-pdf】简单封装pdf预览组件 在Vue中使用vue-pdf来展示PDF文件&#xff0c;首先需要安装vue-pdf&#xff1a; npm i vue-pdf或者 yarn add vue-pdf然后在Vue组件中引入并使用vue-pdf&#xff1a; /** * 描述: pdf预览组件 * 作者: xingyue * 创建时间: 2024-11-05 14:27…

HTML 标签属性——id、class、style 等全局属性详解

文章目录 1. id属性2. class属性3. style属性4. title属性5. lang属性6. dir属性7. accesskey属性8. tabindex属性小结HTML全局属性是一组可以应用于几乎所有HTML元素的特殊属性。这些属性提供了额外的功能和信息,使得网页开发者能够更好地控制元素的行为、样式和可访问性。 …

Dubbo详解及其应用

Dubbo Dubbo是一个阿里巴巴开源的高性能Java RPC框架&#xff0c;专为解决大规模微服务架构中的服务治理、服务发现、负载均衡和远程通信等问题而设计。它允许服务提供者将业务功能封装成服务&#xff0c;而服务消费者则可以像调用本地方法一样调用这些远程服务&#xff0c;从而…

python爬取旅游攻略(1)

参考网址&#xff1a; https://blog.csdn.net/m0_61981943/article/details/131262987 导入相关库&#xff0c;用get请求方式请求网页方式&#xff1a; import requests import parsel import csv import time import random url fhttps://travel.qunar.com/travelbook/list.…

推荐一款便捷的图像处理工具:Photo Collage Maker

Photo Collage Maker是一款便捷的图像处理工具&#xff0c;能够对图像进行拼接和剪辑&#xff0c;帮助用户轻松实现各类图像效果的添加。该软件支持图片框的添加以及图片分享功能&#xff0c;适合用于制作照片拼贴、个性化相册、美丽的剪贴簿等创意项目。 软件特点 简单易用 …

yolo v5 开源项目

项目地址&#xff1a;https://gitcode.net/EricLee/yolo_v5

《化纤与纺织技术》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《化纤与纺织技术》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《化纤与纺织技术》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;广东粤能&#xff08;集团&#xf…

Python 爬取大量数据如何并发抓取与性能优化

Python 并发抓取与性能优化 在进行网络爬虫开发时&#xff0c;爬取大量数据可能非常耗时。尤其是在处理许多网页或 API 请求时&#xff0c;逐个请求速度会非常慢。为了解决这个问题&#xff0c;我们可以通过并发抓取提高爬取效率。同时&#xff0c;通过性能优化来进一步减少耗…