在QT5界面开发的过程中,表单设置是采用QTableWidget类来进行开发的。由于表格属性众多,例如行列表格的数量,表格的显示风格、表格的触发属性以及表格的增删改等。网上关于QTableWidget操作的相关博客数量众多,其中也有很多非常优秀的文章,但 纸上得来终觉浅 绝知此事要躬行,所有我还是写了一篇相关文章,以便于加深自己的理解。
一、表单整体样式
表单整体风格包括表单的行列数、显示方式(网格显示、背景色设置)、编辑属性、选择方式(多行或单行、多列或单列)等,每种风格可通过更改枚举值进行设置,具体代码如下所示;
//***************设置表单风格
ui.tableWidget->setRowCount(10);//设置标定为5行,不包括表头
ui.tableWidget->setColumnCount(4);//设置表单为4列,不包括表头
//***************表格整体风格
ui.tableWidget->setShowGrid(false);//不显示网格;
//编辑触发的方式由QAbstractItemView 类中的EditTrigger枚举进行定义;
//ui.tableWidget->setEditTriggers(QAbstractItemView::DoubleClicked);//设置表格整体双击触发;
ui.tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置表格整体无编辑触发;
//选择行为由QAbstractItemView 类中的SelectionBehavior枚举定义;
ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //设置选择行为时每次选择一行
//选择行数行为由QAbstractItemView 类中的SelectionModem枚举定义
ui.tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); //可以选择多行
ui.tableWidget->setStyleSheet("selection-background-color:green;"); //设置选中背景色
二、表头风格设置和表头标签设置
- 表头包括水平表头和竖直表头,两种表头的设置较为类似,常用表头风格设置代码如下:
//***************表头风格设置
ui.tableWidget->verticalHeader()->setHidden(true);//设置垂直表头隐藏
ui.tableWidget->horizontalHeader()->setVisible(true);//设置垂直表头不可视,与隐藏效果一样setHidden(false)效果一样;
ui.tableWidget->horizontalHeader()->setSectionsClickable(true);//设置表头是否能被选定,考虑到需要通过表头选择整列,设置可选;
ui.tableWidget->horizontalHeader()->setStretchLastSection(true);//调整最后一列的宽度,让后一列填充表格多余部分;
ui.tableWidget->horizontalHeader()->setEditTriggers(false);//设置表头不可编辑;
//设置标签位置,具体风格可以在枚举AlignmentFlag中查到
ui.tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
ui.tableWidget->horizontalHeader()->resizeSection(0, 70); //设置表头第一列的宽度为50
ui.tableWidget->horizontalHeader()->setFixedHeight(20); //设置表头的固定高度
//ui.tableWidget->horizontalHeader()->resizeSections(QHeaderView::Interactive); //QHeaderView::ResizeMode 1
//行列尺寸的自适应设置由于QHeaderView中的ResizeMode枚举定义
ui.tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);//列宽用户可以调整;
//字体设置为粗体;
QFont font = ui.tableWidget->horizontalHeader()->font();
font.setBold(true);
ui.tableWidget->horizontalHeader()->setFont(font);
- 添加表头文字标签主要有两种方法:1、对每一格进行单独添加item;2、利用QStringList一起设置;
//***************表头标签设置
//***水平表头内容设置方法1:按照Item的形式,单个设置
//ui.tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(QString::fromLocal8Bit("序号")));
//ui.tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem(QString::fromLocal8Bit("山名")));
//ui.tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem(QString::fromLocal8Bit("死亡率")));
//ui.tableWidget->setHorizontalHeaderItem(3, new QTableWidgetItem(QString::fromLocal8Bit("地点")));
//***水平表头内容设置方法2:利用QStirngList,一起设置
QStringList strListHor;
strListHor << QString::fromLocal8Bit("序号") << QString::fromLocal8Bit("山名") << QString::fromLocal8Bit("死亡率") << QString::fromLocal8Bit("地点");
ui.tableWidget->setHorizontalHeaderLabels(strListHor);
//***竖直表头设置方法同上,利用setVerticalHeaderItem()和setVerticalHeaderLabels();
以上代码实现效果如下图所示:
三、增加表格
表单表格内容增加,主要也有两种方式:
- 方法一:创建QTableWidgetItem对象,并对QTableWidgetItem对象进行内容和风格设置,最后再将该对象添加进入指定的表格内,实现代码如下:
//***************增加表单内容
int tableWidCount = 0;
//***方法一:创建QTableWidgetItem对象
QTableWidgetItem* item1 = new QTableWidgetItem; //需要采用new指针的形式
item1->setText(QString::number(++tableWidCount));
//item1->setFont(QFont("Helvetica"));//设置字体为黑体;
//
QTableWidgetItem* item2 = new QTableWidgetItem; //需要采用new指针的形式
item2->setText(QString::fromLocal8Bit("乔戈里峰"));
item2->setBackgroundColor(QColor(237, 145, 33));//设置背景颜色,胡萝卜色;
item2->setTextColor(QColor(25, 25, 112));//设置文字颜色,深蓝色;
//
QTableWidgetItem* item3 = new QTableWidgetItem; //需要采用new指针的形式
item3->setText(QString::fromLocal8Bit("27%"));
item3->setTextColor(QColor(255, 0, 0));//设置文字颜色,深红色;
//
QTableWidgetItem* item4 = new QTableWidgetItem; //需要采用new指针的形式
item4->setText(QString::fromLocal8Bit("中国"));
//文字分布设置;
item1->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
item2->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
item3->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
item4->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
//添加到对应的行和列中;
ui.tableWidget->setItem(tableWidCount - 1, 0, item1);
ui.tableWidget->setItem(tableWidCount - 1, 1, item2);
ui.tableWidget->setItem(tableWidCount - 1, 2, item3);
ui.tableWidget->setItem(tableWidCount - 1, 3, item4);
- 方法二、直接利用tableWidget类对象的成员函数setItem()和item()对特定表格进行设置,实现代码如下:
//***方法二:直接调用setItem进行添加;
ui.tableWidget->setItem(tableWidCount, 0, new QTableWidgetItem(QString::number(tableWidCount + 1)));
ui.tableWidget->setItem(tableWidCount, 1, new QTableWidgetItem(QString::fromLocal8Bit("梅里雪山")));
ui.tableWidget->item(tableWidCount, 1)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
ui.tableWidget->item(tableWidCount, 1)->setBackgroundColor(QColor(237, 145, 33));//设置背景颜色,胡萝卜色;
ui.tableWidget->item(tableWidCount, 1)->setTextColor(QColor(25, 25, 112));//设置文字颜色,深蓝色;
ui.tableWidget->setItem(tableWidCount, 2, new QTableWidgetItem(QString::fromLocal8Bit("无人登顶")));
ui.tableWidget->item(tableWidCount, 2)->setTextColor(QColor(255, 0, 0));//设置文字颜色,深红色;
ui.tableWidget->setItem(tableWidCount, 3, new QTableWidgetItem(QString::fromLocal8Bit("中国")));
//***按照方法二:添加其他行数据,如果已经有整理好的数据,且数据较多时,可以写成循环,更加行来进行自动添加;
tableWidCount++;
ui.tableWidget->setItem(tableWidCount, 0, new QTableWidgetItem(QString::number(tableWidCount + 1)));
ui.tableWidget->setItem(tableWidCount, 1, new QTableWidgetItem(QString::fromLocal8Bit("南迦巴瓦峰")));
ui.tableWidget->item(tableWidCount, 1)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
ui.tableWidget->item(tableWidCount, 1)->setBackgroundColor(QColor(237, 145, 33));//设置背景颜色,胡萝卜色;
ui.tableWidget->item(tableWidCount, 1)->setTextColor(QColor(25, 25, 112));//设置文字颜色,深蓝色;
ui.tableWidget->setItem(tableWidCount, 2, new QTableWidgetItem(QString::fromLocal8Bit("1次")));
ui.tableWidget->item(tableWidCount, 2)->setTextColor(QColor(255, 0, 0));//设置文字颜色,深红色;
ui.tableWidget->setItem(tableWidCount, 3, new QTableWidgetItem(QString::fromLocal8Bit("中国")));
//
tableWidCount++;
ui.tableWidget->setItem(tableWidCount, 0, new QTableWidgetItem(QString::number(tableWidCount + 1)));
ui.tableWidget->setItem(tableWidCount, 1, new QTableWidgetItem(QString::fromLocal8Bit("贡嘎山")));
ui.tableWidget->item(tableWidCount, 1)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
ui.tableWidget->item(tableWidCount, 1)->setBackgroundColor(QColor(237, 145, 33));//设置背景颜色,胡萝卜色;
ui.tableWidget->item(tableWidCount, 1)->setTextColor(QColor(25, 25, 112));//设置文字颜色,深蓝色;
ui.tableWidget->setItem(tableWidCount, 2, new QTableWidgetItem(QString::fromLocal8Bit("60%")));
ui.tableWidget->item(tableWidCount, 2)->setTextColor(QColor(255, 0, 0));//设置文字颜色,深红色;
ui.tableWidget->setItem(tableWidCount, 3, new QTableWidgetItem(QString::fromLocal8Bit("中国")));
//
tableWidCount++;
ui.tableWidget->setItem(tableWidCount, 0, new QTableWidgetItem(QString::number(tableWidCount + 1)));
ui.tableWidget->setItem(tableWidCount, 1, new QTableWidgetItem(QString::fromLocal8Bit("安纳布尔纳峰")));
ui.tableWidget->item(tableWidCount, 1)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
ui.tableWidget->item(tableWidCount, 1)->setBackgroundColor(QColor(237, 145, 33));//设置背景颜色,胡萝卜色;
ui.tableWidget->item(tableWidCount, 1)->setTextColor(QColor(25, 25, 112));//设置文字颜色,深蓝色;
ui.tableWidget->setItem(tableWidCount, 2, new QTableWidgetItem(QString::fromLocal8Bit("50%")));
ui.tableWidget->item(tableWidCount, 2)->setTextColor(QColor(255, 0, 0));//设置文字颜色,深红色;
ui.tableWidget->setItem(tableWidCount, 3, new QTableWidgetItem(QString::fromLocal8Bit("阿根廷与智利之间")));
以上代码增加表格内容如下图所示,绿色部分为单击一行后,该行高亮显示颜色:
四、表格触发设置
- 常用触发信号
QTableWidget常用触发信号,可在Qt设计师中看到。从信号名上可以看出,有单击触发、有双击触发、有的返回行列值,有的返回QTableWidgetItem对象,可根据实际项目需要选择使用。
- QTableWidget:点击表单某行,返回该行的数据;
QTableWidget作为表单类,往往需要多种类型的互交操作,因此触发信号类型非常丰富。这里小码哥不一一进行介绍了,这里介绍一种比较常用的触发方式,那就是点击表单某行,返回该行的数据。这里需要用到QTableWidget类的selectedItems()函数,并加入适当的遍历操作,即可获得某行的数据;
具体实现代码如下,这里使用的是双击信号
void QTableWidgetLearn::on_tableWidget_itemDoubleClicked(QTableWidgetItem* montItem)
{
//单击返回所在单元格的行和列;
QString name = montItem->text();
QList<QTableWidgetItem*> items = ui.tableWidget->selectedItems();//返回选中行中各列的QTableWidgetItem;
int count = items.count();//返回包含的QTableWidgetItem数目,即列数
int row;
if (count>0)
{
row = ui.tableWidget->row(items.at(0))+1;//返回选中行数;
}
QString mountainName;
for (int i = 0; i < count; i++)
{
QTableWidgetItem *item = items.at(i);
QString name = item->text(); //获取内容
if (i==1)
{
mountainName = name;
}
}
//
QString myflag;
myflag = QString::fromLocal8Bit("既然你选择了第")+QString::number(row) + QString::fromLocal8Bit("行,那就陪小码哥去爬") + mountainName + QString::fromLocal8Bit("吧! ");
QMessageBox::about(nullptr, QString::fromLocal8Bit("立Flag专用对话框"), myflag);
}
代码实现的效果是,当用户双击某行时,弹出与该行相关的信息提示框;此处测试时,单击第二行,弹出与第二行内容相关的对话框;
五、删除表格
-
表格中常用的删除函数总结如下:
//void QTableWidget::clear(); //清空表格中所有内容(包含表头)
//void QTableWidget::clearContents(); //清空表格中的内容(不包含表头)。
//void QTableWidget::removeCellWidget(int row, int column); //删除表格中的某行中的某列内容
//void QTableWidget::removeColumn(int column); //删除表格中的某列内容
//void QTableWidget::removeRow(int row) //删除表格中的某行内容。
//QTableWidgetItem * QTableWidget::takeItem(int row, int column); //删除表格中的某行和某列
//QTableWidgetItem * QTableWidget::takeHorizontalHeaderItem(int column); //删除表格中的水平标题头
//QTableWidgetItem * QTableWidget::takeVerticalHeaderItem(int row); //删除表格中的垂直标题 -
这里要注意clear()和clearContents()两个函数的区别;
原表单为:
clear()实现效果为:
clearContents()实现效果为:
QtableWidget的用法丰富多样,小码哥先写这么多,在日常使用中应该够用的,之后如有有遇到值得分享的用法,小码哥会再来补充、分享。
注意:本文的山峰排名无实际意义,各位别在意这些细节。
六、延伸
1、QAbstractItemView 类:https://blog.csdn.net/qq_40732350/article/details/86686361