一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

TableView右键弹出菜单

关于TableView的控件使用,这里不做解释了,直接说诉求,右键点击选中的某一行(术语称item),弹出菜单。操作结果如下图:
在这里插入图片描述
实现过程主要包括以下几个重点:

1、初始化一个TableView控件表

主要需要完成表头的设置,表格属性的设置。
代码如下:

point_time_model 表示TableView控件对应的model:

point_time_model = new QStandardItemModel(ui->Point_Time_tableView);

初始化:

复制代码
 1 const int table_cols = 3; //有几列
 2 QStringList headerList;
 3 headerList <<  "位置"  <<  "监测时长"  <<  "     " ;
 4 point_time_model->setHorizontalHeaderLabels(headerList);
 5 point_time_model->setColumnCount(table_cols);
 6 //设置列表属性
 7 ui->Point_Time_tableView->verticalHeader()->setVisible(false);   //隐藏列表头
 8 ui->Point_Time_tableView->setSelectionBehavior(QAbstractItemView::SelectRows); //选择整行
 9 ui->Point_Time_tableView->setSelectionMode(QAbstractItemView::SingleSelection); //只选择一行
10 ui->Point_Time_tableView->horizontalHeader()->setStretchLastSection(true); //最后一列填满表
11 ui->Point_Time_tableView->setContextMenuPolicy(Qt::CustomContextMenu); //可弹出右键菜单
复制代码

其中,ui->Point_Time_tableView->setContextMenuPolicy(Qt::CustomContextMenu); !!!这里是重点!!!

2 、为TableView控件表添加右键菜单

首先需要创建一个菜单,并为菜单添加行为,代码如下:
.cpp文件中

复制代码
1 QMenu *popMenu; //菜单
2 popMenu = new QMenu(ui->Point_Time_tableView);
3 QAction *actionUpdateInfo = new QAction();
4 QAction *actionDelInfo = new QAction();
5 actionUpdateInfo ->setText(QString("修改"));
6 actionDelInfo ->setText(QString("删除"));
7 popMenu->addAction(actionUpdateInfo);
8 popMenu->addAction(actionDelInfo);
复制代码

到这里,右键菜单已经建立好了,接下来的关键步骤是,如何右键点击一行,弹出该菜单,需要用到槽和信号机制。

3 、右键弹出菜单的槽和信号机制

.h文件中

1 private slots:
2      //右键菜单响应函数
3      void slotContextMenu(QPoint pos);

.cpp文件中,在第2步的代码之后初始化槽信号的connect函数:

connect(ui->Point_Time_tableView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint)));

(1)该连接函数中的SIGNAL(customContextMenuRequested(QPoint))是QMenu的自带响应信号。
(2)SLOT(slotContextMenu(QPoint)))中的槽函数需要自己实现,代码如下:

复制代码
1 void MainWindow::slotContextMenu(QPoint pos)
2 {
3    auto index = ui->Point_Time_tableView->indexAt(pos);
4     if (index.isValid())
5     {
6         popMenu->exec(QCursor::pos()); // 菜单出现的位置为当前鼠标的位置
7     }
8 }
复制代码

以上,右键点击某一行时,菜单就会出现,相应的每一个菜单需要什么样的响应操作,就是后续的槽和信号之间的操作。

 

posted on   一杯清酒邀明月  阅读(2548)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示