我编写了适用于地图的桌面应用程序,
我想对平底锅和长按事件作出反应。
可以在普通鼠标的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,我应该编写自己的手势识别 对于鼠标?
答案 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;
}
}
基本上,我们会跟踪鼠标事件,更新我们自己的一些属性(panning
和startpoint
)以及传入的手势属性。对于每个鼠标事件类型,我们还返回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);