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设置模型。效果如下图。
在没有设置标题格式的时候如上图所示,最后一格之后是空白的。通过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列的宽度自适应
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);效果如下图。
可以通过m_model->rowCount()获取表格的行数。如果要更新表格的所用数据,可以通过m_model->clear(),但是这样清理会把表格设置的格式也清理掉;标题会恢复到默认的情况,设置的效果会丢失。可以选择使用m_model->removemRows(m_model->rowCount());这种清楚方式只会把数据行清除,并不会把表格设置的格式也给清除。