QTableView是Qt中用来显示表格的视图控件,与之相似的还有QListView是以列表的形式进行显示的视图控件,QTreeView是树状显示的控件可以分多级进行显示。(在这里只介绍QTableView)

QTableView的使用需要结合QStandardItemModel和QStandardItem一起使用。QStandardItemModel使用来创建模型的,QStandardItem是用来在模型中创建对象的。QTableView和QStandardItemModel使用的是 视图/模型的框架,即模型使用来管理数据,视图是用来显示,当模型中的数据有变化的时候,会自动的更新在视图中显示。

QTextCodec *m_gbkCodec = QTextCodec::codecForName("GBK");//设置字体
	QStandardItemModel *m_model = new QStandardItemModel;
	m_model->setColumnCount(6);	//设置表格列的数量
	/*设置表格的标题*/
	m_model->setHeaderData(0, Qt::Horizontal, m_gbkCodec->toUnicode("学号"));
	m_model->setHeaderData(1, Qt::Horizontal, m_gbkCodec->toUnicode("姓名"));
	m_model->setHeaderData(2, Qt::Horizontal, m_gbkCodec->toUnicode("性别"));
	m_model->setHeaderData(3, Qt::Horizontal, m_gbkCodec->toUnicode("年龄"));
	m_model->setHeaderData(4, Qt::Horizontal, m_gbkCodec->toUnicode("身高"));
	m_model->setHeaderData(5, Qt::Horizontal, m_gbkCodec->toUnicode("体重"));
	ui.m_tableView->setModel(m_model);//为视图设置模型

首先创建QStandardItemModel标准模型对象;使用setColumnCount()设置列的数量;通过setHeaderData()设置列的标题名字;最后为QTableView设置模型。效果如下图。

qt tablemodel 过滤_ico

在没有设置标题格式的时候如上图所示,最后一格之后是空白的。通过setSectionResizeMode(QHeaderView::Stretch)设置标题列宽度自适应。默认情况下点击表格只能选中单个,而且双击后是可以编辑的。setEditTriggers()设置可编辑方式,setSelectionBehavior()设置选择模式,verticalHeader()->hide()可以隐藏掉垂直标题。

标题列的设置还可以设置某些列为固定宽度某些为自适应宽度。效果如下图

ui.m_tableView->setColumnWidth(0, 60);//设置0列的宽度为60
	ui.m_tableView->setColumnWidth(1, 100);//设置1列的宽度为100
	ui.m_tableView->setColumnWidth(2, 80);//设置2列的宽度为80
	ui.m_tableView->setColumnWidth(3, 60);//设置3列的宽度为60
	ui.m_tableView->horizontalHeader()->setSectionResizeMode(4, QHeaderView::Stretch);//设置4列的宽度自适应
	ui.m_tableView->horizontalHeader()->setSectionResizeMode(5, QHeaderView::Stretch);//设置5列的宽度自适应

qt tablemodel 过滤_Qt_02

ui.m_tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//设置标题自适应宽度
	ui.m_tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);	//内容不可编辑
	ui.m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows); //选择整行
	ui.m_tableView->verticalHeader()->hide();//隐藏垂直表头
QStandardItem *item;	//创建标准项指针
	for (int i = 0; i < 6; i++)
	{
		m_model->insertRow(i);//在模型中插入行
		for (int j = 0; j < 6; j++)
		{
			item = new QStandardItem();		//创建标准项对象
			item->setText(QString::number(j));	//设置标准项的内容
			m_model->setItem(i, j, item);		//在模型中设置标准项
		}
	}

通过循环为模型添加数据(注意每一个单元格都是一个QStandardItem);效果如下图。

qt tablemodel 过滤_自适应_03

可以通过m_model->rowCount()获取表格的行数。如果要更新表格的所用数据,可以通过m_model->clear(),但是这样清理会把表格设置的格式也清理掉;标题会恢复到默认的情况,设置的效果会丢失。可以选择使用m_model->removemRows(m_model->rowCount());这种清楚方式只会把数据行清除,并不会把表格设置的格式也给清除。