QStandardItemModel 存放数据

QItemSelectionModel 选择项模型

例子:本例子中QListView 没有做任何处理,只是拖放至ui文件,设置了布局

mainwindow.h

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QItemSelectionModel>
  4. #include <QLabel>
  5. #include <QMainWindow>
  6. #include <QStandardItemModel>
  7. #define COL 6 //行数
  8. QT_BEGIN_NAMESPACE
  9. namespace Ui { class MainWindow; }
  10. QT_END_NAMESPACE
  11. class MainWindow : public QMainWindow
  12. {
  13. Q_OBJECT
  14. public:
  15. MainWindow(QWidget *parent = nullptr);
  16. ~MainWindow();
  17. private slots:
  18. void on_currentChanged(const QModelIndex &current, const QModelIndex &previous);
  19. void on_actOpen_triggered();
  20. void on_actSave_triggered();
  21. void on_actAppend_triggered();
  22. void on_actInsert_triggered();
  23. void on_actDelete_triggered();
  24. void on_actAlignLeft_triggered();
  25. void on_actAlignCenter_triggered();
  26. void on_actAlignRight_triggered();
  27. void on_actFontBold_triggered(bool checked);
  28. private:
  29. Ui::MainWindow *ui;
  30. QLabel *labelPath;//路径信息
  31. QLabel *labelCellPos;//单元格行列号
  32. QLabel *labelCellText;//单元格信息
  33. QStandardItemModel *model;//数据model
  34. QItemSelectionModel *selectModel;//选择model
  35. void initItemModel(QStringList list);//文本为model填充数据
  36. void setTextAlign(Qt::Alignment atextAlignment);//设置文本对齐方式
  37. };
  38. #endif // MAINWINDOW_H

mainwindow.cpp

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QAbstractItemView>
  4. #include <QFileDialog>
  5. #include <QFileDialog>
  6. #include <QTextStream>
  7. MainWindow::MainWindow(QWidget *parent)
  8. : QMainWindow(parent)
  9. , ui(new Ui::MainWindow)
  10. {
  11. ui->setupUi(this);
  12. labelPath = new QLabel("当前文件:", this);
  13. labelPath->setMinimumWidth(225);
  14. labelCellPos = new QLabel("当前位置:", this);
  15. labelCellPos->setMinimumWidth(75);
  16. labelCellText = new QLabel("当前内容:", this);
  17. labelCellText->setMinimumWidth(150);
  18. ui->statusbar->addWidget(labelPath);
  19. ui->statusbar->addWidget(labelCellPos);
  20. ui->statusbar->addWidget(labelCellText);
  21. model = new QStandardItemModel(10, COL, this);
  22. selectModel = new QItemSelectionModel(model);
  23. ui->tableView->setModel(model);//设置模型
  24. ui->tableView->setSelectionModel(selectModel);//选择模型
  25. ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);
  26. ui->tableView->setSelectionBehavior(QAbstractItemView::SelectItems);
  27. connect(selectModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(on_currentChanged(QModelIndex, QModelIndex)));
  28. }
  29. MainWindow::~MainWindow()
  30. {
  31. delete ui;
  32. }
  33. void MainWindow::on_currentChanged(const QModelIndex &current, const QModelIndex &previous)
  34. {
  35. Q_UNUSED(previous);
  36. if (!current.isValid()) {
  37. return;
  38. }
  39. labelCellPos->setText(QString("第 %1 行,第 %2 列").arg(current.row()).arg(current.column()));
  40. QStandardItem *item = model->itemFromIndex(current);//根据index获取到item
  41. labelCellText->setText("当前单元格内容:" + item->text());
  42. QFont font = item->font();
  43. ui->actFontBold->setChecked(font.bold());
  44. }
  45. void MainWindow::on_actOpen_triggered()//打开文件,并将文件数据加载进数据模型
  46. {
  47. QString curPath = QCoreApplication::applicationDirPath();
  48. QString name = QFileDialog::getOpenFileName(this, "打开文件", curPath, "文本文件(*.txt);;所有文件(*.*)");
  49. if (name.isEmpty()) {
  50. return;
  51. }
  52. QStringList list;//文本内容
  53. QFile file(name);
  54. if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
  55. ui->plainTextEdit->clear();
  56. QTextStream stream(&file);
  57. while (!stream.atEnd()) {
  58. QString lineText = stream.readLine();
  59. ui->plainTextEdit->appendPlainText(lineText);
  60. list.append(lineText);
  61. }
  62. this->labelPath->setText("当前文件:" + curPath);
  63. initItemModel(list);
  64. ui->tableView->resizeRowsToContents();
  65. ui->tableView->resizeColumnsToContents();
  66. ui->actSave->setEnabled(true);
  67. ui->actInsert->setEnabled(true);
  68. ui->actAppend->setEnabled(true);
  69. ui->actDelete->setEnabled(true);
  70. }
  71. }
  72. /**
  73. * @brief MainWindow::initItemModel 根据文本文件为Model填充数据
  74. * @param list
  75. */
  76. void MainWindow::initItemModel(QStringList list)
  77. {
  78. model->setRowCount(list.size() - 1);
  79. QString header = list.at(0);
  80. QStringList headerList = header.split(QRegExp("\\s+"), QString::SkipEmptyParts);
  81. model->setHorizontalHeaderLabels(headerList);//设置表头
  82. for (int i = 1; i < list.count(); i++) {
  83. int j = 0;
  84. QStringList contents = list.at(i).split(QRegExp("\\s+"), QString::SkipEmptyParts);
  85. for (; j < COL - 1; j++) {
  86. QStandardItem *item = new QStandardItem(contents.at(j));
  87. model->setItem(i - 1, j, item);
  88. }
  89. QStandardItem *checkItem = new QStandardItem();
  90. checkItem->setCheckState(contents.at(j) == "1" ? Qt::Checked : Qt::Unchecked);
  91. model->setItem(i - 1, j, checkItem);
  92. }
  93. }
  94. void MainWindow::on_actSave_triggered()//另存为
  95. {
  96. QString curPath = QCoreApplication::applicationDirPath();
  97. QString name = QFileDialog::getSaveFileName(this, "数据信息保存", curPath, "文本文件(*.txt)");
  98. if (name.isEmpty()) {
  99. return;
  100. }
  101. QFile file(name);
  102. if (file.open(QIODevice::ReadWrite | QIODevice::Text | QIODevice::Truncate)) {
  103. QTextStream stream(&file);
  104. stream.setCodec("UTF-8");
  105. ui->plainTextEdit->clear();
  106. QString str = "";
  107. for (int i = 0; i < model->columnCount(); i++) {//写表头
  108. QStandardItem *item = model->horizontalHeaderItem(i);
  109. str += (item->text() + "\t\t");
  110. }
  111. stream << str << "\n";
  112. ui->plainTextEdit->appendPlainText(str);
  113. QString text = "";
  114. for (int i = 0; i < model->rowCount(); i++) {
  115. int j = 0;
  116. for (; j < model->columnCount() - 1; j++) {
  117. text += model->item(i, j)->text() + "\t\t";
  118. }
  119. text += model->item(i, j)->checkState() == Qt::Checked ? "1\n" : "0\n";
  120. }
  121. stream << text;
  122. stream.flush();
  123. }
  124. }
  125. void MainWindow::on_actAppend_triggered()//添加一行
  126. {
  127. QList<QStandardItem *>itemList;
  128. for (int i = 0; i < model->columnCount() - 1; i++) {
  129. QStandardItem *item = new QStandardItem("0");
  130. itemList << item;
  131. }
  132. // QString data = model->headerData(model->columnCount() - 1, Qt::Horizontal).toString();//最后一列check列
  133. QStandardItem *item = new QStandardItem("1");
  134. item->setCheckState(Qt::Checked);
  135. itemList << item;
  136. model->appendRow(itemList);
  137. selectModel->clear();//设置选中当前行
  138. QModelIndex index = model->index(model->rowCount() - 1, 0);
  139. selectModel->setCurrentIndex(index, QItemSelectionModel::Rows);
  140. }
  141. void MainWindow::on_actInsert_triggered()//插入一行
  142. {
  143. QList<QStandardItem *>itemList;
  144. for (int i = 0; i < model->columnCount() - 1; i++) {
  145. QStandardItem *item = new QStandardItem("0");
  146. itemList << item;
  147. }
  148. QStandardItem *item = new QStandardItem("1");
  149. item->setCheckState(Qt::Checked);
  150. itemList << item;
  151. int row = selectModel->currentIndex().row();
  152. model->insertRow(row, itemList);
  153. selectModel->clear();//设置选中当前行
  154. QModelIndex index = model->index(row, 0);
  155. selectModel->setCurrentIndex(index, QItemSelectionModel::Select);
  156. }
  157. void MainWindow::on_actDelete_triggered()//删除一行
  158. {
  159. QModelIndex index = selectModel->currentIndex();
  160. model->removeRow(index.row());
  161. if (index.row() >= model->rowCount()) {
  162. index = model->index(model->rowCount() - 1, 0);
  163. }
  164. selectModel->setCurrentIndex(index, QItemSelectionModel::Select);
  165. }
  166. void MainWindow::setTextAlign(Qt::Alignment atextAlignment)//设置文本对齐方式
  167. {
  168. if (selectModel->hasSelection()) {
  169. QModelIndexList selectList = selectModel->selectedIndexes();
  170. for (int i = 0; i < selectList.count(); i++) {
  171. QModelIndex index = selectList[i];
  172. QStandardItem *item = model->itemFromIndex(index);
  173. item->setTextAlignment(atextAlignment);
  174. }
  175. }
  176. }
  177. void MainWindow::on_actAlignLeft_triggered()//文本左对齐
  178. {
  179. setTextAlign(Qt::AlignLeft);
  180. }
  181. void MainWindow::on_actAlignCenter_triggered()
  182. {
  183. setTextAlign(Qt::AlignCenter);
  184. }
  185. void MainWindow::on_actAlignRight_triggered()
  186. {
  187. setTextAlign(Qt::AlignRight);
  188. }
  189. void MainWindow::on_actFontBold_triggered(bool checked)//字体加粗
  190. {
  191. if (selectModel->hasSelection()) {
  192. QModelIndexList selectList = selectModel->selectedIndexes();
  193. for (int i = 0; i < selectList.count(); i++) {
  194. QModelIndex index = selectList[i];
  195. QStandardItem *item = model->itemFromIndex(index);
  196. QFont font = item->font();
  197. font.setBold(checked);
  198. item->setFont(font);
  199. }
  200. }
  201. }

界面

QT5笔记: 21. QStandardItemModel的更多相关文章

  1. Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation)

    Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation) 作为表单,字段验证当然是不能少的,今天我们来一起看看Ext.Net FormPanel的字段验证功能. ...

  2. SQL反模式学习笔记21 SQL注入

    目标:编写SQL动态查询,防止SQL注入 通常所说的“SQL动态查询”是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. 反模式:将未经验证的输入作为代码执行 当向SQL查询的字符串中插入别 ...

  3. JAVA自学笔记21

    JAVA自学笔记21 1.转换流 由于字节流操作中文不是非常方便,因此java提供了转换流 字符流=字节流+编码表 1)编码表 由字符及其对应的数值组成的一张表 图解: 2)String类的编码和解码 ...

  4. Linux实战教学笔记21:Rsync数据同步工具

    第二十一节 Rsync数据同步工具 标签(空格分隔): Linux实战教学笔记-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载,转载 ...

  5. struts2视频学习笔记 21(输入校验的流程)

    课时21 输入校验的流程 1.类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性. 2.如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,co ...

  6. AMQ学习笔记 - 21. 异步发送

    原文地址:Async Sends 背景 ActiveMQ支持同步.异步两种发送的模式将消息发送到broker,模式的选择对发送延时有巨大的影响.producer能达到怎样的产出率[1],主要受发送延时 ...

  7. ArcGIS API for JavaScript 4.2学习笔记[21] 对3D场景上的3D要素进行点击查询【Query类学习】

    有人问我怎么这个系列没有写自己做的东西呢? 大哥大姐,这是"学习笔记"啊!当然主要以解读和笔记为主咯. 也有人找我要实例代码(不是示例),我表示AJS尚未成熟,现在数据编辑功能才简 ...

  8. [原创]java WEB学习笔记21:MVC案例完整实践(part 2)---DAO层设计

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. Linux下汇编语言学习笔记21 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  10. Hadoop学习笔记—21.Hadoop2的改进内容简介

    Hadoop2相比较于Hadoop1.x来说,HDFS的架构与MapReduce的都有较大的变化,且速度上和可用性上都有了很大的提高,Hadoop2中有两个重要的变更: (1)HDFS的NameNod ...

随机推荐

  1. 不求甚解--详解ansible-playbook中roles的用法

    前言 本文将详细介绍ansible-playbook中roles的各种用法,它允许你将相关的任务.变量.处理器.文件和模板等集合在一起,以便于在不同的项目中复用 环境准备 组件 版本 操作系统 Ubu ...

  2. 2024年1月Java项目开发指南9:密码加密存储

    提前声明: 你不会写这加密算法没关系啊,你会用就行. 要求就是:你可以不会写这个加密算法,但是你要知道加密流程,你要会用. @Service public class PasswordEncrypto ...

  3. 【MyBatis】学习笔记09:动态设置表名

    [Mybatis]学习笔记01:连接数据库,实现增删改 [Mybatis]学习笔记02:实现简单的查 [MyBatis]学习笔记03:配置文件进一步解读(非常重要) [MyBatis]学习笔记04:配 ...

  4. MessageConsumer

    @Slf4j @Component public class MessageConsumer { @Autowired private PpcRequestMessageListener ppcReq ...

  5. 如何调整Linux系统为正确时区

    如果你的 Linux 系统时区配置不正确,必需要手动调整到正确的当地时区.NTP 对时间的同步处理只计算当地时间与 UTC 时间的偏移量,因此配置一个 NTP 对时间进行同步并不能解决时区不正确的问题 ...

  6. 【网络安全】Shell 脚本学习

    声明:学习视频来自 b 站 up 主 泷羽 sec,如涉及侵权马上删除文章 声明:本文主要用作技术分享,所有内容仅供参考.任何使用或依赖于本文信息所造成的法律后果均与本人无关.请读者自行判断风险,并遵 ...

  7. Qt编写地图综合应用25-echart动态交互

    一.前言 之前用echart组件做过各种效果,随着各种现场应用现场项目的增多,各种需求也都慢慢增加起来,为了满足各种不同类型的需求,近期又抽空重新整理和封装了echart类,主要就是增加了不少的js函 ...

  8. Qt音视频开发13-mpv录像存储

    一.前言 用mpv来做录像存储,保存视频文件,从来都没有如此的方便,直接设置属性stream-record对应的文件路径即可,我的乖乖,一行代码,如此精简美丽大方,搞得我都不敢相信自己的眼睛,mpv除 ...

  9. Qt音视频开发3-vlc录像存储

    一.前言 录像功能是视频监控系统的常用功能,就是将打开的视频流或者视频文件重新保存成MP4文件,当然也可以保存成其他格式,一般默认用MP4比较好,比较标准一些,MP4格式的兼容性最好,基本上没有说那台 ...

  10. ubuntu18.04安装g2o

    先对g2o的依赖库进行安装: sudo apt-get update sudo apt-get install libeigen3-dev sudo apt-get install libsuites ...