—— 均为自学记录,如有错误请指正
一、简述
参考:QTableView
QTableView是一种view/model模式在创建QTableView表格的时候,除了创建QTableView对象还需要创建对应的Model对象,Model 对象负责表格中的数据单元添加、单元格删除和设置表格标题等操作,一般常见的就是 QStandardItemModel 模型。
二、创建QTableView
使用时需要包含以下头文件,创建一个QTableView对象和 QStandardItemModel 并使用QTableView的 setModel() 函数将视图和模型对象进行绑定。
#include <QTableView>
#include <QStandardItemModel>
例:
// .h
#include <QTableView>
#include <QStandardItemModel>
class DBTableView
: public QTableView
{
public:
explicit DBTableView(QWidget * _parent_widget = nullptr);
~DBTableView() override;
private:
QStandardItemModel *db_table_model_;
};
// .cpp
#include "db_table_view.h"
DBTableView::DBTableView(QWidget *_parent_widget) : QTableView(_parent_widget)
{
db_table_model_ = new QStandardItemModel();
setModel(db_table_model_);
}
DBTableView::~DBTableView()
{
}
1. 表格标题
可以使用 model 对象提供的函数进行表格标题的设置
- 水平标题 setHorizontalHeaderLabels() 函数
- 垂直标题 setVerticalHeaderLabels() 函数
DBTableView::DBTableView(QWidget *_parent_widget)
: QTableView(_parent_widget)
{
// ......
QStringList table_h_headers;
table_h_headers << "设施ID" << "设施名称" << "设施等级" << "人员配置"<< "数据采集日期";
db_table_model_->setHorizontalHeaderLabels(table_h_headers);
QStringList table_v_headers;
table_v_headers << "测试1" << "测试2" << "测试3" << "测试4"<< "测试5";
db_table_model_->setVerticalHeaderLabels(table_v_headers);
}
表格上的所有单元格都是 item 对象,表格标题也不例外,因此可以单独创建 item 对象,然后通过 model 的两个函数依次对表格进行标题设置。
例:
DBTableView::DBTableView(QWidget *_parent_widget)
: QTableView(_parent_widget)
{
// ......
QStringList table_h_headers;
table_h_headers << "设施ID" << "设施名称" << "设施等级" << "人员配置"<< "数据采集日期";
for (int index = 0; index < table_h_headers.count(); ++index) {
QStandardItem * header_item = new QStandardItem(table_h_headers[index]);
db_table_model_->setHorizontalHeaderItem(index, header_item);
}
}
注:这种做法适用于对表格标题需要添加一些数据的时候,
例如当前的模型描述的数据库中的数据表,标题的显示文字可以写成中文,然后将其对应的数据库字段作为附加信息通过 setData() 函数写到对象中。代码:
#include "db_table_view.h"
#define DATABASE_FIELD_CODE Qt::UserRole + 100
DBTableView::DBTableView(QWidget *_parent_widget)
: QTableView(_parent_widget)
{
// ......
QStringList table_h_headers;
table_h_headers << "设施ID" << "设施名称" << "设施等级" << "人员配置"<< "数据采集日期";
QStringList table_h_fields;
table_h_fields << "id" << "name" << "level" << "config"<< "date";
for (int index = 0; index < table_h_headers.count(); ++index) {
QStandardItem * header_item = new QStandardItem(table_h_headers[index]);
header_item->setData(table_h_fields[index], DATABASE_FIELD_CODE);
db_table_model_->setHorizontalHeaderItem(index, header_item);
}
}
2. 获取表格的标题
- 可以通过 model 的 columnCount() 函数获取数量;
- 配合 model 的 headerData() 函数获取当前列的文字内容。
例:
DBTableView::DBTableView(QWidget *_parent_widget)
: QTableView(_parent_widget)
{
// ......
QStringList table_h_headers;
table_h_headers << "设施ID" << "设施名称" << "设施等级" << "人员配置"<< "数据采集日期";
db_table_model_->setHorizontalHeaderLabels(table_h_headers);
for (int index = 0; index < db_table_model_->columnCount(); ++index) {
qInfo() << db_table_model_->headerData(index, Qt::Horizontal, Qt::DisplayRole).toString();
}
}
注: headerData() 函数的3个参数:
- 参数1:列的索引号;
- 参数2:获取水平/垂直方向的表头;
- 参数3:模型数据编号,该编号与 setData() 函数在设置时一致(此处的Qt::DisplayRole是内置的一个编号,用于获取显示的文字内容)。
三、数据操作
1. 插入数据
可以使用 model 的函数
- setItem() 函数 : 需要指定设置的行和列
- appendRow() 函数 : 可以先将一行 item 的对象添加到一个list中,然后一次性插入
例:
DBTableView::DBTableView(QWidget *_parent_widget)
: QTableView(_parent_widget)
{
// ......
db_table_model_->setItem(0, 0, new QStandardItem("1"));
db_table_model_->setItem(0, 1, new QStandardItem("2"));
db_table_model_->setItem(0, 2, new QStandardItem("3"));
db_table_model_->setItem(0, 3,new QStandardItem("4"));
db_table_model_->setItem(0, 4,new QStandardItem("5"));
QList<QStandardItem*> add_items;
for (int index = 0; index < table_h_headers.count(); index++)
{
add_items << new QStandardItem(QString::number(index));
}
db_table_model_->appendRow(add_items);
}
2. 删除数据
model 对象提供了以下函数
clear() 函数 :可以一次将表格内容和表格标题都删掉
removeRows() 函数:删除某一列数据
rowCount() 函数:配合 removeRows() 函数 将表格内容清空
例:
// 删除一列数据
DBTableView::DBTableView(QWidget *_parent_widget)
: QTableView(_parent_widget)
{
// ......
db_table_model_->removeColumn(0);
}
// 全部清空
DBTableView::DBTableView(QWidget *_parent_widget)
: QTableView(_parent_widget)
{
// ......
db_table_model_->removeRows(0, db_table_model_->rowCount());
}
四、属性设置
1. 设置表格的对齐方式
horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
verticalHeader()->setDefaultAlignment(Qt::AlignBottom);
2. 设置表格的宽高
// 固定表格宽度不可扩展,不可手动调整宽度
horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
// 表格宽度随内容自动扩展
horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
// 表格宽度自动根据UI进行计算,不可手动调整宽度
horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// 固定表格高度不可扩展,不可手动调整高度
verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
// 表格高度随内容自动扩展
verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
// 表格高度自动根据UI进行计算,不可手动调整高度
verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
3. 设置表格的线属性
// 隐藏网格线
setShowGrid(false);
// 显示网格线
setShowGrid(true);
// 线的样式
setGridStyle(Qt::DotLine);
五、获取某一行一列的数据
参考:QTableView
六、获取选中行指定列的内容
参考:QTableView
七、获取某行所有信息
参考:QTableView
// 1. 信号槽
//显示信息
connect(ui->tableView,SIGNAL(clicked(QModelIndex)),this,SLOT(show_list()));
// 2.获取当前行的行号
int row = ui-> tableView ->currentIndex().row();
qDebug()<<row;
// 3.获取当前行的所有信息
for(i = 0; i < 4; i++)
{
qDebug()<<ui->tableView->model()->index(index.row(),i).data().toString();
}
// 槽函数
void show_list()
{
}
八、获取当前选中行
参考:QTableView
QList<int> MainWindow::getSelectedTaskIdList()
{
QTableView *m_pTableView = ui.tableView;
//选中当前行
QModelIndexList selected = m_pTableView->selectionModel()->selectedRows();
//返回选中当前行的行号
QList<int> rows;
foreach( const QModelIndex & index, selected)
{
rows.append( index.row() );
}
return rows;
}