參考部落格:http://blog.csdn.net/lpmygod/article/details/38924427中的方法,發現出現選取item不準确/偏移的問題,做了一點修正,希望幫到出現同樣問題的朋友。
item的擷取依賴于滑鼠單擊時點的坐标,通過m_pTree->itemAt(localPos)傳回localPos處的item。m_pTree為QTreeWidget*。
若點的擷取是在父視窗擷取的,按原部落格的例子進行坐标映射會出現坐标偏移。
下面的代碼為了擷取右鍵菜單時,右鍵處的item。首先擷取滑鼠處的全局坐标,然後将全局坐标映射到m_pTree上,最後擷取局部坐标處的item,但是這樣做将會出現偏移。
void ParentWindow::contextMenuEvent(QContextMenuEvent *event )
{
QPoint point= QCursor::pos();
QPoint localPos = m_pTree->mapFromGlobal(point);
QTreeWidgetItem*pItem = m_pTree->itemAt(localPos);
}
仔細觀察itemAt()函數的說明:
QTreeWidgetItem * QTreeWidget::itemAt(const QPoint & p) const
Returns a pointer to theitem at the coordinates p. The coordinates are relative to the treewidget's viewport().
該函數所擷取的是樹視窗中viewport()坐标系下的item,是以隻要改成m_pTree->viewport()->mapFromGlobal(point)即可消除偏移。
void ParentWindow::contextMenuEvent(QContextMenuEvent *event )
{
QPoint point= QCursor::pos();
QPoint localPos = m_pTree->viewport()->mapFromGlobal(point);
QTreeWidgetItem*pItem = m_pTree->itemAt(localPos);
}