QT5:QTableWidget 表格控件

文章目录

    • 1 设置列宽度
    • 2 设置表头
    • 3 读/写某行的内容
    • 4 信号槽
    • 5 排序
    • 9 其他
    • 加载表格数据很卡顿的问题
  • Demo
  • 参考资料

1 设置列宽度

  • 指定某列的宽度值
    	ui.qTableWidget1->setColumnWidth(0, 250);	//指定第0列的宽度值=250
    
  • 列宽自适应:根据各列的文本内容自动设置列宽度
    	//根据单元格的内容自动设置列宽度。宽度无法由用户或编程方式再修改。
    	ui.qTableWidget1->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);	
    
  • 列宽自适应:自动调整列宽度以填满表格
    	//自动调整列宽度以填满表格,不留空白。宽度无法由用户或编程方式再修改。
    	ui.qTableWidget1->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);	
    
  • 用最后一列填满表格剩余的空白位置
    	//如果表格有空白位置,则用最后一列填满剩余的空白位置
    	ui.tb_SectionHeader->horizontalHeader()->setStretchLastSection(true);
    

2 设置表头

  • 表头文本的换行:直接在文本中加【\n】

3 读/写某行的内容

	//向表格第0行第1列写入数据
	ui.qTableWidget1->setItem(0, 1, new QTableWidgetItem(QString::fromLocal8Bit("你好"))
	//读取第0行第1列的数据
	QString cellStr = ui.qTableWidget1->item(0, 1)->text();	//cellStr = "你好"

4 信号槽

  • 点击单元格的信号:QTableWidget::cellClicked( int row , int col )
    PEScan::PEScan(QWidget* parent)
    	: QMainWindow(parent)
    {
    	//连接cellClicked信号 与 自定义槽函数
    	connect(ui.qTable1, &QTableWidget::cellClicked, this, &PEScan::handleClick);
    }
    //************************************
    // Method:     handleClick
    // Description:槽函数
    // Parameter:  int row - 被点击的行号
    // Parameter:  int col - 被点击的列号
    //************************************
    void PEScan::handleClick(int row,int col) 
    {
    	//读取单元格内容
    	QString cellStr = ui.qTable1->item(row, col)->text();
    }
    
  • 点击表头时排序
    Form_OpenProcess::Form_OpenProcess(QWidget* parent)
    : QMainWindow(parent)	
    {
    	connect(ui.qTable1->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(Sort(int)));
    }	
    
    //************************************
    // Method:     Sort 
    // Description:槽函数:点击表头时排序
    // Parameter:  int col - 
    // Returns:    void - 
    //************************************
    void Form_OpenProcess::Sort(int col)
    {
    	ui.qTable1->sortItems(col, Qt::AscendingOrder);	//升序
    }
    

5 排序

  • 使某列升序/降序,列的值可以是字符串
    	ui.qTable1->sortItems(0, Qt::AscendingOrder);  //以第0列升序排列
    	
    	ui.qTable1->sortItems(0, Qt::DescendingOrder);  //以第0列降序排列
    

9 其他

  • 每次选中整行
    	//设置选中模式:每次选中整行
    	ui.qTable1->setSelectionBehavior(QAbstractItemView::SelectRows);
    	ui.qTable1->setSelectionMode(QAbstractItemView::SingleSelection);
    

加载表格数据很卡顿的问题

  • 要避免在加载数据前设置 setSectionResizeMode(QHeaderView::ResizeToContents) ,因为加载数据的时候会去算列表项的宽度、高度。
    解决方案:
    (1)在添加数据前设置为setSectionResizeMode(QHeaderView::Fixed),添加数据后设回setSectionResizeMode(QHeaderView::ResizeToContents),
    (2)不在添加数据前设置setSectionResizeMode(),统一在添加数据后才设置setSectionResizeMode()
  • 在给表格写入文本之前,调用clear()可以避免莫名其妙的卡顿,例如双击单元格造成卡顿。

Demo

	//设置选中模式:每次选中整行
	ui.qTableWidget1->setSelectionBehavior(QAbstractItemView::SelectRows);
	ui.qTableWidget1->setSelectionMode(QAbstractItemView::SingleSelection);
	
	//设置表格的行数和列数
	ui.qTableWidget1->setRowCount(10);
	ui.qTableWidget1->setColumnCount(3);

	//添加表头
	QStringList tHeader;
	ui.qTableWidget1->clear();	//clear()可避免莫名其妙的卡顿
	tHeader << QString(QString::fromLocal8Bit("姓名")) << QString(QString::fromLocal8Bit("年龄")) << QString(QString::fromLocal8Bit("学号"));
	ui.qTableWidget1->setHorizontalHeaderLabels(tHeader);	//添加表头
	ui.qTableWidget1->horizontalHeader()->setVisible(true);	//横向表头可视化
	ui.qTableWidget1->verticalHeader()->setVisible(false);	//纵向表头可视化

	//向表格添加数据
	for (int row = 0; row <10; row++)
	{
		for (int column = 0; column < 6; column++)
		{
			if (column == 0) { ui.qTableWidget1->setItem(row, column, new QTableWidgetItem(QString::fromLocal8Bit("康康"))); }
			if (column == 1) { ui.qTableWidget1->setItem(row, column, new QTableWidgetItem(QString().sprintf("%04X", 0x1234))); }
			if (column == 2) 
			{ 
				QTableWidgetItem* tableItem = new QTableWidgetItem(QString::fromLocal8Bit("2017006"))
				tableItem->setToolTip(QString::fromLocal8Bit("2017006"));	//设置单元格的鼠标悬浮提示文字
				ui.qTableWidget1->setItem(row, column,tableItem);
			}
		}
	}
	/* 设置表格的各列宽度(尽量在添加数据后再调用setSectionResizeMode(QHeaderView::ResizeToContents),可以避免加载数据卡顿的问题)*/
	ui.qTableWidget1->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);			//自动调整列宽度以填满表格
	//ui.qTableWidget1->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);//根据单元格的文本内容调整列宽
	//ui.qTableWidget1->horizontalHeader()->setStretchLastSection(true);						//如果表格有空白位置,则用最后一列填满剩余的空白位置。宽度无法由用户或编程方式再修改。

参考资料

  • Qt5:QTableWidget创建表格 https://blog.csdn.net/mars_xiaolei/article/details/83410466
  • QT带参数信号槽 https://blog.csdn.net/su1041168096/article/details/78857213
  • 实现点击表头进行排序 https://www.cnblogs.com/jiangson/p/9147662.html

你可能感兴趣的:(QT-学习笔记)