Эта очень простая программа, которая отлично работала при использовании Qt 5.6 на Android, теперь не работает с Qt 5.12.В Windows он работает с обеими версиями.
Это очень просто, просто создать помощника для перехвата событий QGesture и уведомления указанного класса.
gest.h :
#ifndef RMCWRAPPER_H
#define RMCWRAPPER_H
#include <QObject>
#include <QPoint>
class QWidget;
class TapAndHoldWrapper : public QObject
{
Q_OBJECT
public:
TapAndHoldWrapper( QWidget* parent, QObject* receiver = NULL, const char* slot = NULL );
~TapAndHoldWrapper();
bool eventFilter(QObject *obj, QEvent *event);
signals:
void requested( QPoint globalPos );
private:
QWidget* m_parent;
};
#endif
gest.cpp :
#include "gesture.h"
#include <QWidget>
#include <QEvent>
#include <QGestureEvent>
TapAndHoldWrapper::TapAndHoldWrapper( QWidget* parent, QObject* receiver, const char* slot ) :
QObject( parent ), m_parent( parent )
{
m_parent->installEventFilter( this );
m_parent->grabGesture( Qt::TapAndHoldGesture );
if ( receiver && slot )
{
connect( this, SIGNAL(requested(QPoint)), receiver, slot );
}
}
TapAndHoldWrapper::~TapAndHoldWrapper()
{
}
bool TapAndHoldWrapper::eventFilter(QObject *obj, QEvent *event)
{
if ( event->type() == QEvent::Gesture && obj == m_parent )
{
QGestureEvent *gestevent = static_cast<QGestureEvent *>(event);
if (QGesture *gest = gestevent->gesture(Qt::TapAndHoldGesture))
{
if ( gest && gest->state() == Qt::GestureFinished )
{
QPoint globalPos = gest->hotSpot().toPoint();
emit requested( globalPos );
return true;
}
}
}
// standard event processing
return QObject::eventFilter(obj, event);
}
mainwidget.h :
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QMainWindow>
class TapAndHoldWrapper;
class MainWidget : public QMainWindow
{
Q_OBJECT
public:
MainWidget(QWidget *parent = 0);
public slots:
void showMenu( QPoint pt );
private:
TapAndHoldWrapper* helper;
};
#endif
mainwidget.cpp :
#include "mainwidget.h"
#include "gesture.h"
#include <QScreen>
#include <QGuiApplication>
#include <QTreeWidget>
#include <QLabel>
#include <QMessageBox>
MainWidget::MainWidget(QWidget *parent)
: QMainWindow(parent)
{
QTreeWidget* widget = new QTreeWidget(this);
setCentralWidget(widget);
helper = new TapAndHoldWrapper( widget, this, SLOT(showMenu(QPoint)) );
}
void MainWidget::showMenu( QPoint pt )
{
QMessageBox::information( this, "", "gesture detected" );
}
main.cpp :
#include "mainwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWidget w;
w.show();
return app.exec();
}
TapAndHoldWrapper
, используемый для перехвата события и вызова MainWidget::showMenu
.Это больше неОн отлично работает, когда центральным виджетом QMainWindow
является QLabel
, но не работает, когда он QTreeWidget
.
. Журнал сообщает об этой ошибке (впервые в Qt 5.12):
W/libqtbug_gesture.so(22735): QMetaObject::invokeMethod: No such method
QTreeWidget::inputMethodQuery(Qt::InputMethodQuery,QVariant)
Есть ли что-то особенное, что нужно сделать для QTreeWidget
, чтобы разумно работать с жестами на Android с Qt 5.12?Есть ли что-то особенное, что можно сделать с помощью методов ввода?Я пытался позвонить widget->setInputMethodHints( Qt::InputMethodHint::ImhNone );
, но это не помогло ...