天天看點

Qt:解決QListWidget/QTreeWidget選取Item不準确/偏移問題(右鍵菜單)

參考部落格: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);

}

繼續閱讀