要實現的功能是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();
但是發現一些問題:
當鼠標右鍵點擊第一行的上邊緣附近 返回0spa
點擊第一行中間 返回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
以上就是我解決問題的過程。文檔