任务:使用QTableWidget动态生成表格,在每行的某两列中加入QComboBox下拉框控件和QPushButton按钮控件

有添加,删除,编辑功能,每行的按钮可以浏览文件夹并选择文件

1、新建一个对话框QDialog,设计界面中选择Item-Widgets里的Table Widget,添加该控件,命名为tableWidget_userlist

2、在Dialog的构造函数中初始化表格的一些参数

//初始化表格

ui->tableWidget_userlist->setWindowTitle("user list"); //表名

ui->tableWidget_userlist->setEditTriggers(QAbstractItemView::NoEditTriggers); //表格禁止编辑

ui->tableWidget_userlist->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式

//设置行列数

ui->tableWidget_userlist->setColumnCount(7);

ui->tableWidget_userlist->setRowCount(0);

//设置每列宽

ui->tableWidget_userlist->setColumnWidth(0,80);

ui->tableWidget_userlist->setColumnWidth(1,80);

ui->tableWidget_userlist->setColumnWidth(2,50);

ui->tableWidget_userlist->setColumnWidth(3,80);

ui->tableWidget_userlist->setColumnWidth(4,50);

ui->tableWidget_userlist->setColumnWidth(5,100);

ui->tableWidget_userlist->setColumnWidth(6,80);

//设置表头

QStringList header;

header.append(QObject::tr("name"));

header.append(QObject::tr("sex"));

header.append(QObject::tr("age"));

header.append(QObject::tr("hometown"));

header.append(QObject::tr("group"));

header.append(QObject::tr("text list file"));

header.append("");

ui->tableWidget_userlist->setHorizontalHeaderLabels(header);

3、目前表格只有表头,还没有数据,添加新数据方法如下:

添加新一行

int row = ui->tableWidget_userlist->rowCount(); //获取表格行数

ui->tableWidget_userlist->setRowCount(row+1); //表格加一行

表格第2列为一个下拉框,如下方法添加

QComboBox *comBox = new QComboBox();

comBox->addItem(QObject::tr("female"));

comBox->addItem(QObject::tr("male"));

comBox->setEnabled(true);

ui->tableWidget_userlist->setCellWidget(row,1,comBox);

表格第7列为一个按钮,如下方法添加

QPushButton *button = new QPushButton();

button->setText(tr("scan"));

button->setEnabled(true);

ui->tableWidget_userlist->setCellWidget(row,6,button);

由于要在按钮点击后进行处理,连接按钮点击的信号和处理的槽

connect(button,SIGNAL(clicked()),this,SLOT(changTextListPath()));

处理函数changTextListPath()实现的是浏览文件,重置第6列内容为选择的文件,实现如下

void user_setting::changTextListPath() //更改用户列表文件

{

int row = -1;

//获取当前行

row = ui->tableWidget_userlist->currentRow();

if(row >= 0)

{

QString filters = QObject::tr("text files (*.txt)"); //过滤txt文件

//浏览文件,返回选择的文件路径

QString file = QFileDialog::getOpenFileName(this,QObject::tr("Select Files"),resource_Path,filters);

//获取文件名和路径

QString filepath = file.left(file.size() - file.split("/").back().size() - 1);

QString filename = file.split("/").back();

if(file.size() > 0)

{ //将第6列设置为文件名

ui->tableWidget_userlist->setItem(row,5,new QTableWidgetItem(filename));

}

}

}

4、删除数据

删除数据实现了多行同时选中删除,所以比较麻烦

1)首先用QTableWidget的selectedItems()方法获取所有选中的单元格

2)用std::set del_row记录选中的单元格的行号,用set防止重复

3)为了保证删除行时不混乱,必须从行号由大到小依次删除行(否则后面的行号出现变动,之后删除的行就错误了),但是囧的是发现QT里set不让逆序排序。。(无法识别set >),所以只好将set中的数据赋值为vector,再逆序遍历了

实现如下

void user_setting::on_pushButton_deleteuser_clicked() //删除用户

{

QList list = ui->tableWidget_userlist->selectedItems(); //读取所有被选中的item

if(list.size() == 0) //没有被选中的就返回

{

QMessageBox::warning(this,QObject::tr("warning"),QObject::tr("please select a user"));

return;

}

std::set del_row; //记录要删除的行号,用set防止重复

for(int i=0; i

{

QTableWidgetItem* sel = list[i]; //指向选中的item的指针

if (sel)

{

int row = ui->tableWidget_userlist->row(sel); //获取行号

del_row.insert(row);

}

}

std::vector del_list; //赋值给del_list,set本身为有序

for(std::set::iterator it=del_row.begin(); it!=del_row.end(); it++)

{

del_list.push_back(*it);

}

for(int i=del_list.size()-1; i>=0; i--) //逆序遍历

{

ui->tableWidget_userlist->removeRow(del_list[i]); //从显示列表中删除行

}

}

5、编辑数据

编辑数据功能实际上做成一个开关,一开始表格默认不可编辑,点击编辑,表格变成可编辑模式,用一个bool变量记录表格是在编辑模式还是锁定模式。需要注意的是对于表格中的控件要单独处理

void user_setting::on_pushButton_edituser_clicked() //编辑用户

{

if(isedit == false)

{

ui->tableWidget_userlist->setEditTriggers(QAbstractItemView::CurrentChanged); //允许编辑

for(int i=0; itableWidget_userlist->rowCount(); i++)

{

//允许操作下拉框

QComboBox *now = (QComboBox *)ui->tableWidget_userlist->cellWidget(i,1);

now->setEnabled(true);

//允许操作按钮

QPushButton *button = (QPushButton *)ui->tableWidget_userlist->cellWidget(i,6);

button->setEnabled(true);

}

ui->tableWidget_userlist->setSelectionBehavior(QAbstractItemView::SelectItems); //单元格选中的方式

ui->pushButton_edituser->setText("lock"); //设置按钮文本为“锁定”

isedit = true;

}

else

{

ui->tableWidget_userlist->setEditTriggers(QAbstractItemView::NoEditTriggers); //不允许编辑

for(int i=0; itableWidget_userlist->rowCount(); i++) //不允许编辑性别下拉框

{

//不允许操作下拉框

QComboBox *now = (QComboBox *)ui->tableWidget_userlist->cellWidget(i,1);

now->setEnabled(false);

//不允许操作按钮

QPushButton *button = (QPushButton *)ui->tableWidget_userlist->cellWidget(i,6);

button->setEnabled(false);

}

ui->tableWidget_userlist->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式

ui->pushButton_edituser->setText("edit"); //设置按钮文本为“编辑”

isedit = false;

}

}

至此,任务中所述的功能基本实现,实际上,我将这个Dialog应用于显示与更改用户信息文件,需要重载Dialog的构造函数,读取文件传入参数,并添加提交数据按钮,将表格中更新的数据写入文件等,不过与这次的主题关系不大,就不详述了~

qt 表格中插入一行_Qt在表格中加入控件相关推荐

  1. qt 表格中插入一行_qt中QTableWidget类关于表格的操作

    1.设置表头及大小 QStringList header; header< ui->tableWidget->setHorizontalHeaderLabels(header); u ...

  2. 想在PPT中插入swf文件,但是在其他控件中找不到shockwave falsh object,怎么办?(win7)

    经过我的一些探索之路,我终于发现了我的win7电脑的问题所在,没有安装Adobe flash player,如果有相同问题的同学可以继续往下看. 1.下载安装Adobe flash player 为了 ...

  3. 如何用Apache POI操作Excel文件-----如何在已有的Excel文件中插入一行新的数据?

    在POI的第一节入门中,我们提供了两个简单的例子,一个是如何用Apache POI新建一个工作薄,另外一个例子是,如果用Apache POI新建一个工作表.那么在这个章节里面,我将会给大家演示一下,如 ...

  4. 怎么在html中加横条,如何在HTML中插入一行?html横线标签hr全新讲解

    对于刚刚入门的新手不知道如何在HTML中插入一行?那么接下来我们认识一下html横线标签hr. 一:html横线标签hr属性 标签主要是在html中创建水平线,hr是单标签,是没有结束标签的,而且所有 ...

  5. 如何在Excel中插入一行

    如何在Excel中插入一行 VCL组件开发及应用 http://www.delphi2007.net/DelphiVCL/html/delphi_20061221143745213.html 请问用T ...

  6. linux中sed -i命令修改文件内容、在文件中插入行、删除文件中删除行

    文章目录 0.sed -i与sed 1.修改文件内容 2.在文件中插入行 3.在文件中删除行 4.使用find查找文件,并用 | xargs传输文件名给sed命令 0.sed -i与sed sed - ...

  7. axure树形表格_Axure教程:Axure中继器实现动态树结构控件详解

    树结构是原型设计中常用的控件之一,常用于组织架构等功能.本文作者参照钉钉后台组织架构样式,使用Axure中继器实现动态树结构控件. 一.交互样式 初始样式(以钉钉后台-通讯录-组织架构为例): 初始载 ...

  8. html中可滑动选项怎么设置,滚动条设置控件格式

    excel2013中插入滚动条控件滚动窗格如何设置 我想在excel中插入滚动条,设置为能够像excel自带的滚动条那样滚动单元点击开发工具-插入,选择滚动条. Excel版本参考:2013 点击开发 ...

  9. 【Qt开发笔记】Qt自定义控件开发与使用,自定义控件实现容器与控件内布局

    1.开发环境 Qt版本:Qt 4.8.7 编译器:MinGw 系统:Windows 2.创建Qt4自定义控件 创建一个Qt自定义控件工程. 工程名为Custom. 控件类取名Custom. 然后完成创 ...

  10. Winform中在使用Dock属性设计页面布局控件的顺序导致页面效果不同的问题

    场景 在Winform中进行页面设计时,常使用控件的Dock属性来进行布局调整.但是由于设置属性的顺序问题,导致达不到想要的效果. 比如以下两个控件 下面的控件设置的Dock属性是Bottom,即在页 ...

最新文章

  1. CentOS安装Java JDK
  2. 1026:空格分隔输出
  3. 遇到一个sql2000的问题,实在搞不懂了,求解决的办法?
  4. 微软Tech Summit 2017,等你来打Call
  5. ADO连接各种数据库
  6. 万丰科技机器人排名_机器人系统集成“7宗最”
  7. oracle的错误代码如何查看对应的错误信息
  8. win2016开启ntp_Windows服务器开启NTP服务
  9. 创建触发器报错_Oracle行级触发器的使用
  10. 对比分析法(Comparative Analysis Approach)
  11. 织梦模板:用织梦建站的五大好处
  12. 域名到期查询如何查看?有什么新方法吗?
  13. Mac与远程服务器数据交互软件Cyberduck
  14. 微信被误封号怎么办?详解微信封号的底层逻辑
  15. 2021汽车行业内容营销白皮书
  16. 模板引擎不关心内容之——art-template,碰见的同步与fs.readFile异步以及函数回调问题的描述,针对fs的readfille读取文件时,返回不了异步函数返回值的解决方法
  17. Android电视开机进入AV,康佳电视如何设置开机成AV模式-康佳开机直接进电视
  18. 学习大数据要掌握哪些语言?哪些必备知识和技能呢?
  19. 某班有5名同学,建立一个学生的简单信息表,包括学号、姓名、3门课程的成绩,编写程序,计算每名学生的平均成绩及名次。(30分) 题目内容: 某班有5名同学,建立一个学生的简单信息表,包括学号、姓名、3
  20. ArcGIS API for Silverlight 绘制降雨路径动画

热门文章

  1. 通过优启通制作U盘启动安装Windows系统
  2. VNC远程控制软件,VNC远程控制软件如何实现批量管理服务器
  3. linux系统可以在移动硬盘,如何在移动硬盘上装LINUX系统?
  4. iPhone十年越狱史
  5. 虎赢大数据:“企业工商数据价值挖掘”,是2020年大数据创业发展的方向之一
  6. 2021鹏业安装算量软件常见问题整理(二)
  7. html图片与文字的排版6,前端开发学习笔记(六)- Css 文字排版
  8. Elasticsearch 版本 和SpringData ElasticSearch 版本以及SpringBoot版本选择
  9. 倒计时1天,IMG、完美、腾讯技术大咖相聚直播间详解光线追踪技术
  10. 11年艺术学习“转投”数学,他出版首本TensorFlow中文教材,成为蚂蚁金服技术大军一员...