QWidget中的QT MouseMove Simulation无法正常工作

时间:2019-03-18 08:56:42

标签: qt qmouseevent

我正在尝试从一个窗口小部件捕获触摸事件,并在另一个窗口小部件中对其进行仿真。捕获和模拟触摸事件对于mousePressEvent,mouseReleaseEvent正常工作,但是当我尝试模拟mouseMoveEvent时,相应的事件没有进入目的端。

void SimulateManager::showWidgets()
{
Source.show();
Destination.show();
connect(&Source, SIGNAL(sigMousePress(QMouseEvent *)), this, 
SLOT(slotMousePress(QMouseEvent *)));
connect(&Source, SIGNAL(sigMouseMove(QMouseEvent *)), this, 
SLOT(slotMouseMove(QMouseEvent *)));
}
void SourceWidget:: mouseMoveEvent(QMouseEvent *event)
{
emit  sigMouseMove(event);
}
void SourceWidget::mousePressEvent(QMouseEvent *event)
{
 emit sigMousePress(event);
}
void SimulateManager:: slotMousePress(QMouseEvent *event)
{

 QPoint pPoint(event->pos().x(),event->pos().y());
 QMouseEvent mouseEvent( (QEvent::MouseButtonPress),pPoint,  Qt::LeftButton, Qt::NoButton,Qt::NoModifier   );
 QCoreApplication::sendEvent(&Destination, &mouseEvent);

}

void SimulateManager:: slotMouseMove(QMouseEvent *event)
{
 QPoint pPoint(event->pos().x(),event->pos().y());
 QMouseEvent mouseEvent( (QEvent::MouseMove),pPoint,  Qt::LeftButton, 
 Qt::NoButton,Qt::NoModifier   );
 QCoreApplication::sendEvent(&Destination, &mouseEvent);

}

void DesitinationWidget:: mouseMoveEvent(QMouseEvent *event)
{
 qDebug()<<Q_FUNC_INFO;
}

void DesitinationWidget::mousePressEvent(QMouseEvent *event)
{
  qDebug()<<Q_FUNC_INFO;
}

以上代码用于抓取和模拟。基本上,(QEvent :: MouseMove)+(Qt :: LeftButton)用于滚动tablewidget。 QCoreApplication :: sendEvent返回成功。有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

要在Qt中捕获鼠标移动事件,您需要重写MouseMoveEvent,但是MouseMoveEvent不会占用太多资源。在默认状态下,您必须按鼠标才能捕获它。要移动鼠标而不按下鼠标,您需要setMouseTracking(true)。

对于QMainWindow,即使使用setMouseTracking(true),也无法捕获鼠标未按下的动作。只能在按下鼠标时捕获它。

使用setMouseTracking(true)从QMainWindow的CentrolWIdget开始移动监视。然后使用QMainWindow的setMainsTracking(true)打开监视。