天天看点

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);

}

继续阅读