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上ui

 

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

 

但是發現一些問題:
當鼠標右鍵點擊第一行的上邊緣附近  返回0
spa

點擊第一行中間  返回1  debug

點擊最後一行中間就返回  -1指針

也就是說 點擊行A的上邊緣附近 返回的是A的上一行
只有點擊行A的中間返回的纔是A行 
並非  indexAt函數所描述的那樣返回的是當前行


最後發現問題出在:
indexAt函數根據QPoint判斷行的時候 是沒有把 QTableView的表頭去掉的  (HoriziotalHeader和VerticalHeader) 
因此   隱藏表頭後  就一切正常了 
若是不肯意隱藏表頭  我是用以下代碼 解決的:
code

 

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

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

相關文章
相關標籤/搜索