当把 QTableWidget放在别的 QWidget中以后,发现右键总是捕捉不到最下面的一个Item节点。
void DlgTask::on_customContextMenuRequested(QPoint pos)
{
if (m_nListCount > 0)
{
QTableWidgetItem* item = ui->taskTable->itemAt(ui->taskTable->viewport()->mapFromGlobal(QCursor::pos()));
if(item != NULL)
{
if (m_pPopMenu) //自定义的一个菜单对象
{
m_pPopMenu->exec(QCursor::pos());
}
}
}
}
为什么要用 viewport()->mapFromGlobal(QCursor::pos()
QT 助手中解释:
QWidget * QAbstractScrollArea::viewport () const
Returns the viewport widget.
Use the QScrollArea::widget() function to retrieve the contents of the viewport widget.
所以要用viewport()返回当前widget的坐标,
QPoint QWidget::mapFromGlobal ( const QPoint & pos ) const
Translates the global screen coordinate pos to widget coordinates.
再调用mapFromGlobal函数将屏幕坐标系转化为窗口坐标系,这样就拿到了鼠标点击处在tablewidget的坐标,然后就可以操作最后一行数据了。
所以本质原因就是坐标系的问题,即我们认为的(0,0)点坐标和实际的坐标其实是有差别的。将而鼠标点击返回的CursorPos是以屏幕坐标系为准的,因此实际中使用时要进行坐标系的转换。