任务:使用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<int> del_row记录选中的单元格的行号,用set防止重复
3)为了保证删除行时不混乱,必须从行号由大到小依次删除行(否则后面的行号出现变动,之后删除的行就错误了),但是囧的是发现QT里set不让逆序排序。。(无法识别set<int,greater<int> >),所以只好将set中的数据赋值为vector,再逆序遍历了

实现如下

void user_setting::on_pushButton_deleteuser_clicked()   //删除用户
{
QList<QTableWidgetItem*> 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<int> del_row; //记录要删除的行号,用set防止重复 for(int i=0; i<list.size(); i++) //删除选中的项
{
QTableWidgetItem* sel = list[i]; //指向选中的item的指针
if (sel)
{
int row = ui->tableWidget_userlist->row(sel); //获取行号
del_row.insert(row);
}
} std::vector<int> del_list; //赋值给del_list,set本身为有序
for(std::set<int>::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; i<ui->tableWidget_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; i<ui->tableWidget_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在表格中加入控件的更多相关文章

  1. Qt QTableView 表格内添加控件

    目录 Qt QTableView 表格内添加控件 1. QItemDelegate 2. setIndexWidget 3. setIndexWidget + setLayout Qt QTableV ...

  2. GridControl详解(九)表格中的控件

    选择完成控件后,可用+号点开ColumnEdit列,改控件的类型是RepositoryItem类型的,其相应的属性和相应的控件属性是类似的 构建数据如下: DataTable dt = new Dat ...

  3. qt 在ui界面添加控件后在cpp文件中无法调用?

    问题:qt 在ui界面添加控件后在cpp文件中无法调用? 解决方法:在build选项中选择“重新build项目”,再次在cpp中调用添加的控件发现可以调用了. 还有一种情况导致添加控件后无法调用,就是 ...

  4. PyQt(Python+Qt)学习随笔:布局控件layout的layoutSizeConstraint属性

    在Qt Designer中布局控件有4个,分别是Vertical Layout(垂直布局).Horizontal Layout(水平布局).Grid Layout(网格布局).Form Layout( ...

  5. 基于Qt的第三方库和控件

    ====================== 基于Qt的第三方库和控件 ======================     libQxt --------   http://dev.libqxt.o ...

  6. Qt 界面使用自己定义控件 &quot;提升为&quot;

    1.效果图 我做了一个很easy的样例,一个能够显示颜色的QLabel,边上有个button,点击,跳出颜色选取的Dialog,然后选择一个颜色.这个QLabel会变成什么颜色. 2.ColorLab ...

  7. Qt SizePolicy 属性(每个控件都有一个合理的缺省sizePolicy。QWidget.size()默认返回值是(640, 480),QWidget.sizeHint()默认返回值是(-1, -1))

    控件的sizePolicy说明控件在布局管理中的缩放方式.Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合 所有的布局,开发人员经常需要改变窗体上的某些控件的sizeP ...

  8. PyQt(Python+Qt)学习随笔:布局控件layout的layoutSizeConstraint属性不起作用的问题解决办法

    在<PyQt(Python+Qt)学习随笔:布局控件layout的layoutSizeConstraint属性>中介绍layout的layoutSizeConstraint属性后,反复测试 ...

  9. PyQt(Python+Qt)学习随笔:布局控件layout的LeftMargin等contentsMargins属性

    在Qt Designer中布局控件有4个,分别是Vertical Layout(垂直布局).Horizontal Layout(水平布局).Grid Layout(网格布局).Form Layout( ...

随机推荐

  1. MVC应用程序使用Web Services(asmx)

    原文:MVC应用程序使用Web Services(asmx) 这次,我们练习MVC应用程序中,应用web service.先在MVC应用程序中创建一个目录Services,将用来存储Service.a ...

  2. 文字超出DIV后,隐藏文字并显示...

    <html> <head> <style type="text/css"> #cs{width:100px;height:50px;line-h ...

  3. VMware vCloud与Zend Server实现PHP应用程序自动化交付

    在巴塞罗那2013年VMworld大会上,开发商VMware公司和zend公司在云管理市场上大放异彩.两家公司的产品VMware vCloud和Zend Server组合,实现了PHP程序自动化交付. ...

  4. SaaS模式和实现思路

    EFW框架开发的系统支持SaaS模式和实现思路 回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dAD ...

  5. BrnShop:自定义插件

    BrnShop开源网上商城第四讲:自定义插件 重要通知:BrnShop企业版NOSQL设计(基于Redis)已经开源!源码内置于最新版的BrnShop中,感兴趣的园友可以去下载来看看.官网地址:www ...

  6. 如果gen.lib.rus.ec这个电子书下载站上不去了,那就用这个吧

    如果著名的gen.lib.rus.ec这个电子书下载站上不去了,那就用这个吧: 万千合集站 http://www.hejizhan.com/ 里面除了镜像索引了gen.lib.rus.ec上的所有英文 ...

  7. NET实现仓库看板的一些感想

    NET实现仓库看板的一些感想 从一名技术开发人员到实施人员的蜕变,从不同的角度看待同一个问题,或许会有不一样的结果.这里记录一下最近一个项目实施的案例,非常有感触! 一. 项目情况简介 本次项目是给一 ...

  8. thrift之TTransport层的内存缓存传输类TMemoryBuffer

    内存缓存是简单的在内存进行读写操作的一种传输,任何时候想在上面写入数据都是放入缓存中,任何时候读操作数据也是来至于缓存.内存缓存的分配使用c语言的malloc类函数,分配的长度是需要长度的两倍,需要考 ...

  9. Word文档合并

    Word文档合并的一种实现   今天遇到一个问题,就是需要把多个Word文档的内容追加到一个目标Word文档的后面,如果我有目标文档a.doc以及其他很多个文档b.doc,c.doc…等等数量很多.这 ...

  10. D8

    =-=昨天被老师拉去吃点心了就没有发题解...忧伤..昨天的T2貌似都没有调完嗯 今天脑洞是大啊.. T1模拟写挂..呵呵我一面 T2数学题..刚开始只会求素数表的那种方法暴力..不过后面他们都知道一 ...