参考博客: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);
}