我正在为扶手板写一份申请表。我有一个主窗口,我需要触摸单点触摸的坐标。由于缺乏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并且正在那里接收事件。
答案 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}}那个:
中找到更多详细信息,检查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。