首先看效果图:
表格视图的使用,主要需要用到三个类:QTableView 、 QStandardItemModel、QStandardItem
QTableView 可以比作是一个空的百来平米的房子,
QStandardItemModel则是房子里的格局模型,比如你要划分几十平米做客厅,十几平米做卧室,剩下的划分为厨房等。
QStandardItem 则是具体的家具,电视,桌子,凳子等
所以现在mainwindow.h文件中添加相关类:
QTableView* m_pTableView;
QStandardItemModel* m_pModel;
当前演示程序,是直接在designer设计,所以绑定界面的控件。
m_pTableView = ui->tableView;
以及
m_pModel = new QStandardItemModel(this);
接下来则是初始化整个控件:(初始化代码直接全上了,还有注释)
以下主要是设计整个房子的内部格局。用QStandardItemModel。
void MainWindow::InitTableView()
{
m_pModel = new QStandardItemModel(this);
//设置列字段名
m_pModel->setColumnCount(3);
m_pModel->setHeaderData(0,Qt::Horizontal, "时间");
m_pModel->setHeaderData(1,Qt::Horizontal, "名称");
m_pModel->setHeaderData(2,Qt::Horizontal, "性别");
//设置行字段名
m_pModel->setRowCount(1);
m_pModel->setHeaderData(0,Qt::Vertical, "1");
//m_pModel->setHeaderData(1,Qt::Vertical, "2");
//设置两条数据
m_pModel->setItem(0, 0, new QStandardItem(getCurrentTime()));
m_pModel->setItem(0, 1, new QStandardItem("张三"));
m_pModel->setItem(0, 2, new QStandardItem("男"));
// m_pModel->setItem(1, 0, new QStandardItem(getCurrentTime()));
// m_pModel->setItem(1, 1, new QStandardItem("李四"));
// m_pModel->setItem(1, 2, new QStandardItem("女"));
m_pTableView->setModel(m_pModel);
//设置表格属性
m_pTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置表格只读,不能进行编辑
m_pTableView->setShowGrid(true); //显示网格线
//m_pTableView->verticalHeader()->hide(); //隐藏行表头 或 table->vercalHeader()->setVisible(false);
//m_pTableView->verricalHeader()->setDefaultSeciontSize(22); //设置默认行高
//m_pTableView->horizontalHeader()->setDefaultSecionSize(100); //设置默认列宽
//注意设置表头时需要用到头文件 #include <QHeaderView>
m_pTableView->setSelectionBehavior(QAbstractItemView::SelectRows); //设置选中时为整行选中
m_pTableView->setColumnWidth(0, 100); //设置各列宽度,注意该设置函数必须在数据模型创建并绑定之后调用才起效, 刚开始在setModel 之前调用了该函数始终没有生效
m_pTableView->setColumnWidth(1, 100);
//m_pTableView->setColumnsWidth(); //设置所有列宽
m_pTableView->resizeRowToContents(1); //根据内容调整某行的行高
m_pTableView->resizeColumnsToContents(); //根据内容自动调整所有列的列宽
//m_pTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 各列平均分配,并且占满整个tableview
m_pTableView->horizontalHeader()->setStretchLastSection(true); // 自动调整最后一列的宽度使它和表格的右边界对齐
}
接下来是如何摆放家具了:
private slots:
void onAddData(); // 添加一行数据
void onAddRedData(); // 添加一行红色数据
void onDeleteData(); // 删除一行数据
void slotClearTable(); // 清理表格
具体实现:
/************************槽函数************************/
// 添加一行数据
void MainWindow::onAddData()
{
QList<QStandardItem*> list;
list.append(new QStandardItem(getCurrentTime()));
list.append(new QStandardItem("赵六"));
list.append(new QStandardItem("女"));
int nNewRow = m_pModel->rowCount();
m_pModel->insertRow(nNewRow, list); //在最后一行插入一条记录
}
// 添加一行红色数据
void MainWindow::onAddRedData()
{
QList<QStandardItem*> list;
list << new QStandardItem(getCurrentTime()) << new QStandardItem("王五") << new QStandardItem("男");
int nNewRow = m_pModel->rowCount();
m_pModel->insertRow(nNewRow, list); //在最后一行插入一条记录
// 整行变为红色
for(int i=0;i<m_pModel->columnCount();++i)
{
// 背景颜色红色
//m_pModel->item(nNewRow,i)->setBackground(QBrush(QColor(255, 0, 0)));
// 字体颜色红色
m_pModel->item(nNewRow,i)->setForeground(QBrush(QColor(255, 0, 0)));
}
}
// 删除一行数据
void MainWindow::onDeleteData()
{
int nRow = m_pTableView->currentIndex().row(); // 获取当前选中的行数
m_pModel->removeRow(nRow);//移除第0行数据
}
// 清理表格
void MainWindow::slotClearTable()
{
m_pModel->removeRows(0,m_pModel->rowCount());//移除第0行数据
}