QGestureEvent用于鼠标

时间:2018-03-14 20:44:07

标签: c++ qt

我编写了适用于地图的桌面应用程序, 我想对平底锅和长按事件作出反应。 可以在普通鼠标的Qt / Linux / X11上使用QGestureEvent吗?

我拿了Qt gesture example,它适用于平板电脑, 但按下鼠标左键并移动时没有反应(我希望应用程序将其识别为点击或滑动事件)。

然后我在app.setAttribute(Qt::AA_SynthesizeTouchForUnhandledMouseEvents, true);添加了Qt gesture example main,并将此类代码添加到imagewidget.cpp

void ImageWidget::mousePressEvent(QMouseEvent *e)
{
    e->ignore();
}
void ImageWidget::mouseReleaseEvent(QMouseEvent *e)
{
    e->ignore();
}
void ImageWidget::mouseMoveEvent(QMouseEvent *e)
{
    e->ignore();
}

此代码仍适用于平板电脑,但在Linux / X11上鼠标上没有任何反应。

如果要在linux / x11上启用qgesture,我应该编写自己的手势识别 对于鼠标?

2 个答案:

答案 0 :(得分:4)

在Qt中使用鼠标事件做出手势的官方方法是从QGestureRecognizer类派生,它允许侦听相关的鼠标事件,相应地设置手势属性,然后触发手势(或取消手势)。

以下是仅用于平移手势的示例,仅用于了解必须执行的操作。

拥有像这样的QGestureRecognizer子类:

#include <QGestureRecognizer>
#include <QPointF>
class PanGestureRecognizer : public QGestureRecognizer
{
  QPointF startpoint;
  bool panning;
public:
  PanGestureRecognizer() : panning(false){}
  QGesture *create(QObject *target);
  Result recognize(QGesture *state, QObject *watched, QEvent *event);
};

已覆盖create方法以返回我们感兴趣的手势的新实例:

QGesture *PanGestureRecognizer::create(QObject *target)
{
  return  new QPanGesture();
}

recognize方法覆盖是识别器类的核心,其中传递事件,手势属性集,触发手势事件:

QGestureRecognizer::Result PanGestureRecognizer::recognize(QGesture *state, QObject *, QEvent *event)
{
  QMouseEvent * mouse = dynamic_cast<QMouseEvent*>(event);
  if(mouse != 0)
  {
    if(mouse->type() == QMouseEvent::MouseButtonPress)
    {
      QPanGesture * gesture = dynamic_cast<QPanGesture*>(state);
      if(gesture != 0)
      {
        panning = true;
        startpoint = mouse->pos();
        gesture->setLastOffset(QPointF());
        gesture->setOffset(QPointF());
        return TriggerGesture;
      }
    }
    if(panning && (mouse->type() == QMouseEvent::MouseMove))
    {
      QPanGesture * gesture = dynamic_cast<QPanGesture*>(state);
      if(gesture != 0)
      {
        gesture->setLastOffset(gesture->offset());
        gesture->setOffset(mouse->pos() - startpoint);
        return TriggerGesture;
      }
    }
    if(mouse->type() == QMouseEvent::MouseButtonRelease)
    {
      QPanGesture * gesture = dynamic_cast<QPanGesture*>(state);
      if(gesture != 0)
      {
        QPointF endpoint = mouse->pos();
        if(startpoint == endpoint)
        {
          return CancelGesture;
        }
        panning = false;
        gesture->setLastOffset(gesture->offset());
        gesture->setOffset(mouse->pos() - startpoint);
        return FinishGesture;
      }
    }
    if(mouse->type() == QMouseEvent::MouseButtonDblClick)
    {
      panning = false;
      return CancelGesture;
    }
    return Ignore;
  }
}

基本上,我们会跟踪鼠标事件,更新我们自己的一些属性(panningstartpoint)以及传入的手势属性。对于每个鼠标事件类型,我们还返回QGestureRecognizer::Result 。所有其他事件都将被丢弃(该方法返回Ignore)。

可以使用Image Gestures Example测试此代码:只需将类添加到项目中,并在ImageWidget构造函数中添加此行:

QGestureRecognizer::registerRecognizer(new PanGestureRecognizer());

这应该让用户抓住图片并使用鼠标移动它。

答案 1 :(得分:0)

查看此图片小部件手势示例。 (搜索mouseDoubleClickEvent)

http://doc.qt.io/qt-5/qtwidgets-gestures-imagegestures-imagewidget-cpp.html

基于此,您需要重新实现所需的鼠标事件。

MyWidget::MyWidget() {
    ---
    ---
}

bool MyWidget::event(QEvent *ev)
{
    ---
    ---
}

void MyWidget::mouseReleaseEvent(QMouseEvent *event)
{


}
void MyWidget::mouseMoveEvent(QMouseEvent *event)
{


}

并在标题

中声明这两个函数
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);