分享

Qt:QTableView(01) 的用法...

 myallmy 2022-10-11 发布于北京

Qt:QTableView(01) 的用法



前言

  • QTableView:二维数据表视图组件,有多个行和多个列,每个基本显示单元是一个单元格,通过 setModel() 函数设置一个QStandardItemModel 类的数据模型之后,一个单元格显示 QStandardItemModel 数据模型中的一个项。

  • QStandardItemModel:基于项数据的标准数据模型,可以处理二维数据。维护一个二维的项数据数组,每个项是一个QStandardltem 类的变量,用于存储项的数据、字体格式、对齐方式等。

  • QItemSelectionModel:一个用于跟踪视图组件的单元格选择状态的类,当在 QTableView
    选择某个单元格,或多个单元格时,通过 QItemSelectionModel 可以获得选中的单元格的模型索引,为单元格的选择操作提供方便。

以上几个类之间的关系是:QTableView 是界面视图组件,其关联的数据模型是QStandardItemModel,关联的项选择模型是QItemSelectionModel,QStandardItemModel 的数据管理的基本单元是QStandardItem。


提示:以下是本篇文章正文内容,下面案例可供参考

QTableView 常用于实现数据的表格显示。下面我们如何按步骤来实现给QTableView表格添加数据:

一 、给 QTableView 添加表头

提示:给QTableView添加表头有两种方式

方式一(繁琐添加):

// 准备数据模型
QStandardItemModel *model = new QStandardItemModel();
model->setHorizontalHeaderItem(0, new QStandardItem(QObject::tr("ID")));
model->setHorizontalHeaderItem(1, new QStandardItem(QObject::tr("名称")));
model->setHorizontalHeaderItem(2, new QStandardItem(QObject::tr("描述")));
model->setHorizontalHeaderItem(3, new QStandardItem(QObject::tr("时间")));
model->setHorizontalHeaderItem(4, new QStandardItem(QObject::tr("备注")));
model->setHorizontalHeaderItem(5, new QStandardItem(QObject::tr("操作")));

// 利用 setModel() 方法将数据模型与 QTableView 绑定
ui->tableView->setModel(model);

方式二(简单添加):

// 准备数据模型
QStandardItemModel *model = new QStandardItemModel();

// 设置表头内容
QStringList headers;
headers << "ID" << "名称" << "描述" << "时间" << "备注" << "操作";

// 添加表头
model->setHorizontalHeaderLabels(headers);

// 利用 setModel() 方法将数据模型与 QTableView 绑定
ui->tableView->setModel(model);

二、设置表格属性

1. 设置 QTableView 内容及属性

1.1. 设置列宽不可变动,即不能通过鼠标拖动增加列宽

// 设置列宽不可变动,即不能通过鼠标拖动增加列宽        
ui->tableView->horizontalHeader()->setResizeMode(0, QHeaderView::Fixed);   
ui->tableView->horizontalHeader()->setResizeMode(1, QHeaderView::Fixed);   
ui->tableView->horizontalHeader()->setResizeMode(2, QHeaderView::Fixed);   
ui->tableView->horizontalHeader()->setResizeMode(3, QHeaderView::Fixed);   
ui->tableView->horizontalHeader()->setResizeMode(4, QHeaderView::Fixed);  
ui->tableView->horizontalHeader()->setResizeMode(5, QHeaderView::Fixed);    
 

1.2. 设置表格的各列的宽度值

// 设置表格的各列的宽度值        
ui->tableView->setColumnWidth(0, 100);    
ui->tableView->setColumnWidth(1, 100);    
ui->tableView->setColumnWidth(2, 100);    
ui->tableView->setColumnWidth(3, 100);    
ui->tableView->setColumnWidth(4, 100);     
ui->tableView->setColumnWidth(5, 100);  
     

1.3. 其他参数设置

// 默认显示行头
// 是否显示水平表头
ui->tableView->horizontalHeader()->setVisible(false);
// 是否显示垂直表头
ui->tableView->verticalHeader()->setVisible(false);

// 设置选中时为整行选中        
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);         

// 设置选择多行,按ctrl键
ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);

// 设置表格的单元为只读属性,即不能编辑        
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);          

// 在QTableView中的使用右键菜单,需启用该属性        
ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);

// 设置最后一栏自适应长度
ui->tableView->horizontalHeader()->setStretchLastSection(true);
 
// 设置列内容自适应宽度
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
 
// 开启交替行背景色,在设置style为交替颜色时必须开启
ui->tableView->setAlternatingRowColors(true);

// 去除选中虚线框
ui->tableView->setFocusPolicy(Qt::NoFocus);

2. 设置 item 属性

QStandardItem *item = new QStandardItem("测试");
QFont font = item->font();
// 设置为粗体
font.setBold(true);
// 字体大小
font.setPointSize(12);
// 设置字体
item->setFont(font);
// 设置字体颜色
item->setForeground(QBrush(QColor(255, 0, 0)));
// 文本对齐格式(垂直和水平)
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);

3. 右键弹出菜单

// 打开右键菜单属性
ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);
 
// 右键菜单
QMenu *menu = new QMenu(ui->tableView);
menu->addAction(QStringLiteral("设置"), this, SLOT(slot_setting(bool)));
menu->addAction(QStringLiteral("添加"), this, SLOT(slot_add(bool)));
menu->addAction(QStringLiteral("删除"), this, SLOT(slot_del(bool)));

// 响应右键菜单信号槽
connect(ui->tableView, &QTableView::customContextMenuRequested, this, &Widget::slotCustomContextMenuRequested);
 
// 响应槽函数
void Widget::slotCustomContextMenuRequested(const QPoint &pos)
{
	QPoint p;
	p.setX(pos.x());
	p.setY(pos.y() + menu->height() / 2);
	menu->exec(ui->tableView->mapToGlobal(p));
}

三、动态添加行

// 在表格中添加行时,我们只需要在model中插入数据即可,一旦model中的数据发生变化,QTabelView显示就会做相应的变动
// 第一行添加学生张三的个人信息(setItem函数的第一个参数表示行号,第二个表示列号,第三个为要显示的数据)
model->setItem(0, 0, new QStandardItem("1"));
model->setItem(0, 1, new QStandardItem("张三"));
model->setItem(0, 2, new QStandardItem("我是张三,我是一个保安"));
model->setItem(0, 3, new QStandardItem("2022年5月30日11:50:00"));
model->setItem(0, 4, new QStandardItem("吃小熊饼干"));
model->setItem(0, 4, new QStandardItem("编辑|删除|查看"));

四、设置数据显示的样式

// 设置单元格文本居中
model->item(0, 0)->setTextAlignment(Qt::AlignCenter);
model->item(0, 1)->setTextAlignment(Qt::AlignCenter);
model->item(0, 2)->setTextAlignment(Qt::AlignCenter);
model->item(0, 3)->setTextAlignment(Qt::AlignCenter);
model->item(0, 4)->setTextAlignment(Qt::AlignCenter);
model->item(0, 5)->setTextAlignment(Qt::AlignCenter);

// 设置单元格文本颜色(红色)
model->item(0, 0)->setForeground(QBrush(QColor(255, 0, 0))); 
model->item(0, 1)->setForeground(QBrush(QColor(255, 0, 0))); 
model->item(0, 2)->setForeground(QBrush(QColor(255, 0, 0))); 
model->item(0, 3)->setForeground(QBrush(QColor(255, 0, 0))); 
model->item(0, 4)->setForeground(QBrush(QColor(255, 0, 0))); 
model->item(0, 5)->setForeground(QBrush(QColor(255, 0, 0))); 

// 字体加粗
model->item(0, 0)->setFont( QFont( "Times", 10, QFont::Black));
model->item(0, 1)->setFont( QFont( "Times", 10, QFont::Black));
model->item(0, 2)->setFont( QFont( "Times", 10, QFont::Black));
model->item(0, 3)->setFont( QFont( "Times", 10, QFont::Black));
model->item(0, 4)->setFont( QFont( "Times", 10, QFont::Black));
model->item(0, 5)->setFont( QFont( "Times", 10, QFont::Black));

// 设置排序方式,按 ID 降序显示
model->sort(1, Qt::DescendingOrder);


总结

tips:这里是对文章进行的总结:

QStandardItemModel 是标准的以项数据(item data)为基础的标准数据模型类,通常与 QTableView 组合成 Model/View 结构,实现通用的二维数据的管理功能。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多