QT笔记7__控件_QTableWidget

版权声明:本文为博主原创文章, 欢迎转载,转载请注明出处。 https://blog.csdn.net/baicaidiaozhui/article/details/87336367


在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

猜你喜欢

转载自blog.csdn.net/baicaidiaozhui/article/details/87336367