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

当把 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是以屏幕坐标系为准的,因此实际中使用时要进行坐标系的转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值