C/C++表格组件Qt TableWidget应用详解
程序员文章站
2022-03-23 23:00:56
tablewidget 表格结构组件,该组件可以看作是treewidget树形组件的高级版,表格组件相比于树结构组件灵活性更高,不仅提供了输出展示二维表格功能,还可以直接对表格元素直接进行编辑与修改操...
tablewidget 表格结构组件,该组件可以看作是treewidget树形组件的高级版,表格组件相比于树结构组件灵活性更高,不仅提供了输出展示二维表格功能,还可以直接对表格元素直接进行编辑与修改操作,表格结构分为表头,表中数据两部分,表格结构可看作一个二维数组,通过数组行列即可锁定特定元素,如下代码是针对表格结构的基本使用方法,分别实现了表头数据的初始化,元素的插入等基本操作。
在研究widget组件之前先来熟悉一下view组件,view组件相对widget组件来说只是不具备编辑功能,其他功能保持一致,view组件支持与数据库建立映射关系,如果表格无需更新则最好可以使用view组件,view组件创建表格代码如下。
#include "mainwindow.h" #include "ui_mainwindow.h" #include <iostream> #include <qstandarditemmodel> qstandarditemmodel *model = new qstandarditemmodel(); mainwindow::mainwindow(qwidget *parent): qmainwindow(parent), ui(new ui::mainwindow) { ui->setupui(this); // 初始化tableview表头 model->setcolumncount(3); model->setheaderdata(0,qt::horizontal,qstring("账号")); model->setheaderdata(1,qt::horizontal,qstring("用户")); model->setheaderdata(2,qt::horizontal,qstring("年龄")); ui->tableview->setmodel(model); ui->tableview->horizontalheader()->setdefaultalignment(qt::alignleft); // 表头居左显示 //设置列宽 ui->tableview->setcolumnwidth(0,101); ui->tableview->setcolumnwidth(1,102); } mainwindow::~mainwindow() { delete ui; } // 对表格添加数据 // https://www.cnblogs.com/lyshark void mainwindow::on_pushbutton_clicked() { for(int i = 0; i < 5; i++) { model->setitem(i,0,new qstandarditem("20210506")); //设置字符颜色 model->item(i,0)->setforeground(qbrush(qcolor(255, 0, 0))); //设置字符位置 model->item(i,0)->settextalignment(qt::aligncenter); model->setitem(i,1,new qstandarditem(qstring("lyshark"))); model->setitem(i,2,new qstandarditem(qstring("24"))); } }
代码运行效果如下:
widget组件的初始化与view组件基本保持一致,当程序运行时,首先在构造函数中执行以下代码,对表格进行初始化。
// https://www.cnblogs.com/lyshark mainwindow::mainwindow(qwidget *parent): qmainwindow(parent), ui(new ui::mainwindow) { ui->setupui(this); qstringlist header; header << "姓名" << "性别" << "年龄"; ui->tablewidget->setcolumncount(header.size()); // 设置表格的列数 ui->tablewidget->sethorizontalheaderlabels(header); // 设置水平头 ui->tablewidget->setrowcount(5); // 设置总行数 ui->tablewidget->setedittriggers(qabstractitemview::noedittriggers); // 设置表结构默认不可编辑 // 初始化右侧的编辑框等属性 ui->radiobutton->setchecked(true); ui->lineedit_1->settext(""); ui->lineedit_2->settext(""); // 填充数据 qstringlist namelist; namelist << "lyshark a" << "lyshark b" << "lyshark c"; qstringlist sexlist; sexlist << "男" << "男" << "女"; qint32 agelist[3] = {22,23,43}; // 针对获取元素使用 namelist[x] 和使用 namelist.at(x)效果相同 for(int x=0;x< 3;x++) { int col =0; // 添加姓名 ui->tablewidget->setitem(x,col++,new qtablewidgetitem(namelist[x])); // 添加性别 ui->tablewidget->setitem(x,col++,new qtablewidgetitem(sexlist.at(x))); // 添加年龄 ui->tablewidget->setitem(x,col++,new qtablewidgetitem( qstring::number(agelist[x]) ) ); } } mainwindow::~mainwindow() { delete ui; }
代码运行效果如下:
接着就是对ui中的按钮增加一些绑定事件,此处我们就通过connect
绑定信号,绑定以下这几个:
- •ui->pushbutton 绑定添加信号
- •ui->pushbutton_2 绑定删除信号
- •ui->pushbutton_3 绑定获取单元格信号
- •ui->pushbutton_4 绑定修改信号
增加添加按钮信号: 给添加按钮绑定一个信号槽,点击按钮添加
connect(ui->pushbutton,&qpushbutton::clicked,[=](){ qstring uname = ui->lineedit_1->text(); qstring usex = "男"; int uage = 0; if(ui->radiobutton->ischecked()) usex = "男"; if(ui->radiobutton_2->ischecked()) usex = "女"; uage =(ui->lineedit_2->text()).toint(); // 添加之前,先判断uname是否存在于tablewidget中,如果存在返回0不存在返回1 bool isempty = ui->tablewidget->finditems(uname,qt::matchexactly).empty(); if(isempty) { ui->tablewidget->insertrow(0); // 在行首添加一行空列表 ui->tablewidget->setitem(0,0,new qtablewidgetitem(uname)); ui->tablewidget->setitem(0,1,new qtablewidgetitem(usex)); ui->tablewidget->setitem(0,2,new qtablewidgetitem( qstring::number(uage))); } });
增加删除按钮信号: 点击按钮删除选中行
connect(ui->pushbutton_2,&qpushbutton::clicked,[=](){ bool isempty = ui->tablewidget->finditems(ui->lineedit_1->text(),qt::matchexactly).empty(); if(!isempty) { // 定位到所在行行号 int row = ui->tablewidget->finditems(ui->lineedit_1->text(),qt::matchexactly).first()->row(); // 释放资源 ui->tablewidget->removerow(row); } });
增加释放单元格按钮信号: 获取当前选中单元,并释放当前单格
connect(ui->pushbutton_3,&qpushbutton::clicked,[=](){ int row = ui->tablewidget->currentrow(); std::cout << row << std::endl; qtablewidgetitem *table = ui->tablewidget->currentitem(); delete(table); });
增加修改单元格按钮信号: 添加修改指定内容的处理流程
connect(ui->pushbutton_4,&qpushbutton::clicked,[=](){ qtablewidgetitem *cellitem; // 取出当前选中行 int curr_row = ui->tablewidget->currentrow(); // 循环列数 // https://www.cnblogs.com/lyshark for(int col=0; col<ui->tablewidget->columncount(); col++) { // 寻找到当前列的指针 cellitem = ui->tablewidget->item(curr_row,col); // 循环输出列名称 std::cout << cellitem->text().tostdstring().data() << std::endl; // 先来处理第一个姓名,读出来并写回到列表第0列 if(col == 0) cellitem->settext(ui->lineedit_1->text()); // 判断性别,并分别写回到第1列 if(col == 1) { if(ui->radiobutton->ischecked()) cellitem->settext("男"); if(ui->radiobutton_2->ischecked()) cellitem->settext("女"); } // 判断年龄,并写回到第3列 if(col == 2) cellitem->settext(ui->lineedit_2->text()); } });
信号绑定后,代码运行效果如下:
到此这篇关于c/c++表格组件qt tablewidget应用详解的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
详解C/C++ QT QChart 绘制组件应用
-
C/C++ Qt Dialog 对话框组件应用技巧
-
C/C++表格组件Qt TableWidget应用详解
-
C/C++ Qt TreeWidget 单层树形组件应用小结
-
C/C++ Qt 自定义Dialog对话框组件应用案例详解
-
C/C++ Qt StringListModel 字符串列表映射组件详解
-
C/C++ Qt数据库与SqlTableModel组件应用教程
-
C/C++ Qt 数据库QSql增删改查组件应用教程
-
C/C++ Qt TableDelegate 自定义代理组件使用详解
-
C/C++ Qt 自定义Dialog对话框组件应用案例详解