QStandardItemModel 存放数据

QItemSelectionModel 选择项模型

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

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QItemSelectionModel>
#include <QLabel>
#include <QMainWindow>
#include <QStandardItemModel> #define COL 6 //行数 QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE class MainWindow : public QMainWindow
{
Q_OBJECT public:
MainWindow(QWidget *parent = nullptr);
~MainWindow(); private slots:
void on_currentChanged(const QModelIndex &current, const QModelIndex &previous);
void on_actOpen_triggered(); void on_actSave_triggered(); void on_actAppend_triggered(); void on_actInsert_triggered(); void on_actDelete_triggered(); void on_actAlignLeft_triggered(); void on_actAlignCenter_triggered(); void on_actAlignRight_triggered(); void on_actFontBold_triggered(bool checked); private:
Ui::MainWindow *ui; QLabel *labelPath;//路径信息
QLabel *labelCellPos;//单元格行列号
QLabel *labelCellText;//单元格信息 QStandardItemModel *model;//数据model
QItemSelectionModel *selectModel;//选择model void initItemModel(QStringList list);//文本为model填充数据 void setTextAlign(Qt::Alignment atextAlignment);//设置文本对齐方式
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h" #include <QAbstractItemView>
#include <QFileDialog>
#include <QFileDialog>
#include <QTextStream> MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this); labelPath = new QLabel("当前文件:", this);
labelPath->setMinimumWidth(225);
labelCellPos = new QLabel("当前位置:", this);
labelCellPos->setMinimumWidth(75);
labelCellText = new QLabel("当前内容:", this);
labelCellText->setMinimumWidth(150);
ui->statusbar->addWidget(labelPath);
ui->statusbar->addWidget(labelCellPos);
ui->statusbar->addWidget(labelCellText); model = new QStandardItemModel(10, COL, this);
selectModel = new QItemSelectionModel(model);
ui->tableView->setModel(model);//设置模型
ui->tableView->setSelectionModel(selectModel);//选择模型
ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectItems); connect(selectModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(on_currentChanged(QModelIndex, QModelIndex)));
} MainWindow::~MainWindow()
{
delete ui;
} void MainWindow::on_currentChanged(const QModelIndex &current, const QModelIndex &previous)
{
Q_UNUSED(previous);
if (!current.isValid()) {
return;
}
labelCellPos->setText(QString("第 %1 行,第 %2 列").arg(current.row()).arg(current.column()));
QStandardItem *item = model->itemFromIndex(current);//根据index获取到item
labelCellText->setText("当前单元格内容:" + item->text());
QFont font = item->font();
ui->actFontBold->setChecked(font.bold());
} void MainWindow::on_actOpen_triggered()//打开文件,并将文件数据加载进数据模型
{
QString curPath = QCoreApplication::applicationDirPath();
QString name = QFileDialog::getOpenFileName(this, "打开文件", curPath, "文本文件(*.txt);;所有文件(*.*)");
if (name.isEmpty()) {
return;
}
QStringList list;//文本内容 QFile file(name);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
ui->plainTextEdit->clear();
QTextStream stream(&file);
while (!stream.atEnd()) {
QString lineText = stream.readLine();
ui->plainTextEdit->appendPlainText(lineText);
list.append(lineText);
}
this->labelPath->setText("当前文件:" + curPath); initItemModel(list);
ui->tableView->resizeRowsToContents();
ui->tableView->resizeColumnsToContents(); ui->actSave->setEnabled(true);
ui->actInsert->setEnabled(true);
ui->actAppend->setEnabled(true);
ui->actDelete->setEnabled(true);
}
} /**
* @brief MainWindow::initItemModel 根据文本文件为Model填充数据
* @param list
*/
void MainWindow::initItemModel(QStringList list)
{
model->setRowCount(list.size() - 1);
QString header = list.at(0);
QStringList headerList = header.split(QRegExp("\\s+"), QString::SkipEmptyParts);
model->setHorizontalHeaderLabels(headerList);//设置表头 for (int i = 1; i < list.count(); i++) {
int j = 0;
QStringList contents = list.at(i).split(QRegExp("\\s+"), QString::SkipEmptyParts);
for (; j < COL - 1; j++) {
QStandardItem *item = new QStandardItem(contents.at(j));
model->setItem(i - 1, j, item);
}
QStandardItem *checkItem = new QStandardItem();
checkItem->setCheckState(contents.at(j) == "1" ? Qt::Checked : Qt::Unchecked);
model->setItem(i - 1, j, checkItem);
}
} void MainWindow::on_actSave_triggered()//另存为
{
QString curPath = QCoreApplication::applicationDirPath();
QString name = QFileDialog::getSaveFileName(this, "数据信息保存", curPath, "文本文件(*.txt)");
if (name.isEmpty()) {
return;
}
QFile file(name);
if (file.open(QIODevice::ReadWrite | QIODevice::Text | QIODevice::Truncate)) {
QTextStream stream(&file);
stream.setCodec("UTF-8");
ui->plainTextEdit->clear();
QString str = "";
for (int i = 0; i < model->columnCount(); i++) {//写表头
QStandardItem *item = model->horizontalHeaderItem(i);
str += (item->text() + "\t\t");
}
stream << str << "\n";
ui->plainTextEdit->appendPlainText(str);
QString text = "";
for (int i = 0; i < model->rowCount(); i++) {
int j = 0;
for (; j < model->columnCount() - 1; j++) {
text += model->item(i, j)->text() + "\t\t";
}
text += model->item(i, j)->checkState() == Qt::Checked ? "1\n" : "0\n";
}
stream << text;
stream.flush();
}
} void MainWindow::on_actAppend_triggered()//添加一行
{
QList<QStandardItem *>itemList;
for (int i = 0; i < model->columnCount() - 1; i++) {
QStandardItem *item = new QStandardItem("0");
itemList << item;
}
// QString data = model->headerData(model->columnCount() - 1, Qt::Horizontal).toString();//最后一列check列
QStandardItem *item = new QStandardItem("1");
item->setCheckState(Qt::Checked);
itemList << item;
model->appendRow(itemList); selectModel->clear();//设置选中当前行
QModelIndex index = model->index(model->rowCount() - 1, 0);
selectModel->setCurrentIndex(index, QItemSelectionModel::Rows);
} void MainWindow::on_actInsert_triggered()//插入一行
{
QList<QStandardItem *>itemList;
for (int i = 0; i < model->columnCount() - 1; i++) {
QStandardItem *item = new QStandardItem("0");
itemList << item;
} QStandardItem *item = new QStandardItem("1");
item->setCheckState(Qt::Checked);
itemList << item;
int row = selectModel->currentIndex().row();
model->insertRow(row, itemList); selectModel->clear();//设置选中当前行
QModelIndex index = model->index(row, 0);
selectModel->setCurrentIndex(index, QItemSelectionModel::Select);
} void MainWindow::on_actDelete_triggered()//删除一行
{
QModelIndex index = selectModel->currentIndex();
model->removeRow(index.row());
if (index.row() >= model->rowCount()) {
index = model->index(model->rowCount() - 1, 0);
}
selectModel->setCurrentIndex(index, QItemSelectionModel::Select);
} void MainWindow::setTextAlign(Qt::Alignment atextAlignment)//设置文本对齐方式
{
if (selectModel->hasSelection()) {
QModelIndexList selectList = selectModel->selectedIndexes();
for (int i = 0; i < selectList.count(); i++) {
QModelIndex index = selectList[i];
QStandardItem *item = model->itemFromIndex(index);
item->setTextAlignment(atextAlignment);
}
}
} void MainWindow::on_actAlignLeft_triggered()//文本左对齐
{
setTextAlign(Qt::AlignLeft);
} void MainWindow::on_actAlignCenter_triggered()
{
setTextAlign(Qt::AlignCenter);
} void MainWindow::on_actAlignRight_triggered()
{
setTextAlign(Qt::AlignRight);
} void MainWindow::on_actFontBold_triggered(bool checked)//字体加粗
{
if (selectModel->hasSelection()) {
QModelIndexList selectList = selectModel->selectedIndexes();
for (int i = 0; i < selectList.count(); i++) {
QModelIndex index = selectList[i];
QStandardItem *item = model->itemFromIndex(index);
QFont font = item->font();
font.setBold(checked);
item->setFont(font);
}
}
}

界面

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. DDCA —— 片上网络互联

    1. 路由 1.1 网络拓扑示例 Grid(网格) 网络拓扑通常是一个二维矩阵形式,每个节点(处理器)与其上下左右相邻的节点相连. 如果节点在边缘,某些方向上可能没有相邻节点(边界节点). Torus ...

  2. 【C#】【平时作业】习题-13-数据类型

    目录 1. 什么是 ArrayList ,如何存放数据? 2. 什么 Queue ,如何存放数据? Queue 类的方法和属性 3. 什么 Stack ,如何存放数据? 4. 什么 Hashtable ...

  3. 【Vue】vue基础学习笔记

    目录 基础 差值语法 模板语法 数据绑定 el与data的两种写法 el与data写法1 el写法2:挂载 data写法2:函数式写法 绑定样式 绑定class样式 绑定style样式 条件渲染 基础 ...

  4. mybatis-plus 使用In查询

    第一种在Dao接口中自定义SQL查询,拼接xml字符串 UserDaoMapper.java @Select("<script>" +"select * fr ...

  5. @EnableWebMvc 注解会让Swagger无效访问的问题

    在工作中,通过Swagger2对项目的controller进行配置,以便于用户测试restful服务接口提高开发效率. 但是今天却出现了一个让我匪夷所思的问题就是在配置类里面加上@EnableWebM ...

  6. Qt编写地图综合应用31-仪表盘

    一.前言 用Qt开发仪表盘控件非常方便,无论是用widget的painter还是qml,尤其是qml,内置的那些动画效果非常适合做这类的应用,这次不讨论如何用qt开发仪表盘,而是直接用echart内置 ...

  7. Qt开源作品34-qwt无需插件源码

    一.前言 QWT,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目,可生成各种统计图.为具有技术专业背景的程序提供GUI组件和一组 ...

  8. 2024-12-28:求出出现两次数字的 XOR 值。用go语言,给定一个数组 nums,其中的数字出现的频率要么是一次,要么是两次。 请找出所有出现两次的数字,并计算它们的按位 XOR 值。 如果没

    2024-12-28:求出出现两次数字的 XOR 值.用go语言,给定一个数组 nums,其中的数字出现的频率要么是一次,要么是两次. 请找出所有出现两次的数字,并计算它们的按位 XOR 值. 如果没 ...

  9. 在用Android StudioBuild项目时,提示:Could not resolve all files for configuration ':classpath'.Could not find com.android.tools.

    在用Android StudioBuild项目时,提示:Could not resolve all files for configuration ':classpath'.Could not fin ...

  10. 视频分析框架VideoPipe完整介绍

    (2024年4月编写) github地址 https://github.com/sherlockchou86/video_pipe_c 作者微信 zhzhi78(备注 videopipe),拉群交流( ...