如何在qt中获得主窗口的touchevent

时间:2015-02-11 08:14:01

标签: c++ qt

我正在为扶手板写一份申请表。我有一个主窗口,我需要触摸单点触摸的坐标。由于缺乏Qt知识,我遇到了触摸事件的问题。

根据QTouchEvent Class文档,我已经声明了一个插槽如下。

#include <QTouchEvent>
class MainWindow : public QMainWindow
{
  Q_OBJECT

public:
  explicit MainWindow(int x, int y, QWidget *parent = 0);
public slots:
  void touchEvent(QTouchEvent *ev);
};

在mainwindow.cpp中,我将其重新定义如下。 FFLabel [1]已经由我宣布,我正在写它以确认是否收到了该事件。

void MainWindow::touchEvent(QTouchEvent *ev)
{
  ui->FFLabel[1]->setText(QString("Event"));
  switch (ev->type())
  {
    case QEvent::TouchBegin:
    case QEvent::TouchEnd:
    case QEvent::TouchUpdate:
    {

    }
  }
}

我无法获得touchEvent。有人可以帮助我。

我已经验证了/ dev / input / event2并且正在那里接收事件。

3 个答案:

答案 0 :(得分:1)

事件不是插槽。将其声明为受保护的函数。

 protected:
      void touchEvent(QTouchEvent *ev);

编辑:您没有在switch声明中放置任何内容,以显示您是否参加了此活动。

void MainWindow::touchEvent(QTouchEvent *ev)
{
  switch (ev->type())
  {
    case QEvent::TouchBegin:
        ui->FFLabel[1]->setText("Event began.");
        break;
    case QEvent::TouchEnd:
        ui->FFLabel[1]->setText("Event ended.");
        break;
    case QEvent::TouchUpdate:
    {
        ui->FFLabel[1]->setText("Event updated.");
        break;
    }
  }
}

编辑:如果它仍无效,则表示您的主窗口不接受触摸事件。您需要在主窗口的构造函数中执行此操作:

 setAttribute(Qt::WA_AcceptTouchEvents, true);

答案 1 :(得分:1)

声明: 我有一个类似的问题,这不是一个解决方案,但可能是一种解决方法,取决于你想做什么。

在我的情况下,触摸事件被解释为鼠标事件,因此,MainWindow::touchEvent从未被调用,但鼠标事件处理程序是。

我使用MainWindow::mousePressEvent获取触摸点,MainWindow::mouseMoveEvent获取拖动。

这不能处理多点触控(它适用于单独的联系点,但你的所有点只有一个移动事件)

从Qt5.4开始,我可以尝试(我没有测试,因为我坚持使用Qt4),在鼠标事件处理程序中,检查MouseEventSource如果它是MouseEventSynthesizedBySystem则意味着{ {3}}那个:

  

鼠标事件是由平台触摸事件合成的。

人们可以在from the documentation

中找到更多详细信息,检查Chirag Sachdeva提供的解决方案

当然,关于OP代码,正如user4516901所说,事件不是插槽。

答案 2 :(得分:0)

QWidget具有多个protected virtual成员,例如QWidget::mousePressEvent。事件发生时将调用它们。 通常,当某个事件发生时,一个函数会重写此功能以运行一些代码。

问题是,与鼠标按下不同,没有这样的虚函数QWidget::touchEvent(从Qt 5.12开始)。也就是说,您无法覆盖它,并且由于QWidget不知道这种方法而无法在发生触摸事件时调用它。

C ++ 11引入了override-keyword。如果您使用过它,那么您会注意到该问题。

为了接收触摸事件,必须重写更通用的QWidget::event方法。然后过滤您真正感兴趣的事件:

bool MainWindow::event(QEvent* event)
{
    switch (event->type()) {
    case QEvent::TouchBegin:
        qDebug() << "touch!";
        return true;
    default:
        // call base implementation
        return QMainWindow::event(event);
    }
}

请注意,您必须声明setAttribute(Qt::WA_AcceptTouchEvents);才能接收任何触摸事件(将其放入MainWindow构造函数中)。

您可以阅读more details in the docs