QTableview 获取鼠标坐标的item(QModelIndex)

在QTableView中实现右键点击Item弹出菜单时,遇到indexAt函数返回值不准确的问题。当鼠标点击在行边缘时,返回的不是当前行的QModelIndex。原因是indexAt函数未考虑表头的影响。通过隐藏表头或调整计算逻辑,可以解决此问题,确保正确获取点击的Item。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要实现的功能是QTableview中Item项上右键弹出菜单
这就必然要判断点击右键时鼠标指针是否在QTableView的Item上


如果是QTableWidget可以用itemAt来判断
QTableView通过查看文档  发现有个indexAt函数  返回QModelIndex

 

QModelIndex QTableView::indexAt(const QPoint & pos) const [virtual]
Reimplemented from QAbstractItemView::indexAt().
Returns the index position of the model item corresponding to the table item at position pos in contents coordinates.

 

于是通过如下代码判断鼠标右键单击的时候,鼠标指针是否在item上

 

qDebug()<<ui->tableview->indexAt(ui->tableview->mapFromGlobal(QCursor::pos())).row();

 

可是发现一些问题:
当鼠标右键点击第一行的上边缘附近  返回0

点击第一行中间  返回1  

点击最后一行中间就返回  -1

也就是说 点击行A的上边缘附近 返回的是A的上一行
只有点击行A的中间返回的才是A行 
并不是  indexAt函数所描述的那样返回的是当前行


最后发现问题出在:
indexAt函数根据QPoint判断行的时候 是没有把 QTableView的表头去掉的  (HoriziotalHeader和VerticalHeader) 
所以   隐藏表头后  就一切正常了 
如果不愿意隐藏表头  我是用如下代码 解决的:

 

QPoint pt = ui->tableview->mapFromGlobal(QCursor::pos());
int height = ui->tableview->horizontalHeader()->height();
QPoint pt2(0,height);
pt+=pt2;
qDebug()<<ui->tableview->indexAt(pt).row();

 

现在debug输出就一切正常了(上面只是针对QtableView上面的horizontal表头不隐藏,如果竖直方向的也没隐藏,那么也要加上其宽度)。

以上就是我解决问题的过程。

转载于:https://www.cnblogs.com/wangjian8888/p/10272570.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值