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表頭不隱藏,如果豎直方向的也沒隱藏,那么也要加上其寬度)。

以上就是我解決問題的過程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM