您的位置:首页 > 编程语言 > Qt开发

QTableWidget 添加右键菜单,最后一行不能处理

2015-04-29 17:09 489 查看
当把 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是以屏幕坐标系为准的,因此实际中使用时要进行坐标系的转换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息