日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發布時間:2025/5/22 c/c++ 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QTableview 获取鼠标坐标的item(QModelIndex) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

要實現的功能是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

總結

以上是生活随笔為你收集整理的QTableview 获取鼠标坐标的item(QModelIndex)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。