如何在QT中获取主窗口的触摸事件

6
我将为Arm板编写一个应用程序。我有一个主窗口,需要获取单点触控的触摸坐标。由于我缺乏Qt的知识,我遇到了获取触摸事件的问题。
根据QTouchEvent类的文档,我已经声明了一个插槽,如下所示。
#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:
    {

    }
  }
}

我无法获取触摸事件。请有人帮忙。

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

3个回答

4

QWidget有许多受保护的虚拟成员,例如QWidget::mousePressEvent。它们在事件发生时被调用。通常,人们会重写这样的函数来运行一些代码,当某个事件发生时。

问题是,与鼠标按下不同,没有这样的虚函数QWidget::touchEvent(截至Qt 5.12)。也就是说,您无法重写它,并且当触摸事件发生时,它不能被调用,因为QWidget不知道这样的方法。

C++11引入了override关键字。如果您使用了它,就会注意到这个问题。

为了接收触摸事件,您必须重写更通用的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);
    }
}

请注意,您必须在MainWindow构造函数中声明setAttribute(Qt::WA_AcceptTouchEvents);以接收任何触摸事件。请阅读文档中的更多细节

3

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

 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;
    }
  }
}

编辑:如果仍然无法工作,这意味着您的mainwindow没有接受触摸事件。 您需要在mainwindow的构造函数中执行以下操作:

 setAttribute(Qt::WA_AcceptTouchEvents, true);

如果您没有从命令行运行程序,请查看我的最后一次编辑。 - user4516901
我在FFLabel中没有得到事件,也就是说这个程序没有被调用。这就是我的问题所在。 - sandeep
如果这些方法都无法解决您的问题,我很抱歉,这是我所能做的一切。祝你好运。您可能需要查看http://qt-project.org/doc/qt-4.8/qtouchevent.html。 - user4516901
嘿,感谢你的帮助,虽然对我没有用。我正在查看是否存在与使用tslib进行交叉编译的问题。 - sandeep
我已经使用tslib重新交叉编译了qt。现在我能够看到触摸屏幕上的演示应用程序正在工作,但是我的应用程序无法获取触摸事件。您是否有一个仅接受触摸事件并在屏幕上显示的小应用程序,这将非常有帮助。 - sandeep
显示剩余3条评论

2
免责声明: 我遇到了类似的问题,这不是一个解决方案,但根据您想要做什么,可能是一个解决方法。
在我的情况下,触摸事件被解释为鼠标事件,因此 MainWindow::touchEvent 没有被调用,但是鼠标事件处理程序被调用。
我使用 MainWindow::mousePressEvent 来获取触摸点,使用 MainWindow::mouseMoveEvent 来获取拖动。
这不能处理多点触控(它适用于单独的接触点,但是所有点只有一个移动事件)。
从 Qt5.4 开始,可以尝试(我没有测试,因为我被困在 Qt4 中),在鼠标事件处理程序中检查 MouseEventSource。如果它是 MouseEventSynthesizedBySystem,则表示 文档
鼠标事件是由平台从触摸事件合成的。
可以通过查看 Chirag Sachdeva 在 this post 中提供的解决方案来获取更多详细信息。
当然,关于OP代码,正如user4516901所说的那样,事件不是插槽。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接