Bonjour,
Si le signal accepted ne fonctionne pas (voir également http://doc.qt.io/qt-5/qml-qtquick-ke...#priority-prop), je n'ai qu'une seule solution à vous proposer : eventFilter() sur qApp de sorte d'attendre l'event et d'émettre un nouveau signal quand vous recevez l'event cherché.
J'ai eu à faire ce genre de chose dans un projet où je cherchais à utiliser à plusieurs occasions en même temps les events souris d'un Flickable sans pour autant en briser le comportement (PinchArea ne me suffisait pas).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <QCoreApplication>
#include "mapzoomcontroller.h"
MapZoomController::MapZoomController(QObject *parent)
: QObject(parent)
{
_timer.setSingleShot(true);
_timer.setInterval(600);
connect(&_timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
qApp->installEventFilter(this);
}
MapZoomController::~MapZoomController()
{
}
void MapZoomController::registerMap(QQuickItem *map)
{
_map = map;
}
void MapZoomController::onTimeout()
{
emit zoomRequest();
}
bool MapZoomController::eventFilter(QObject *obj, QEvent *e)
{
if (e && _map)
{
if (e->type() == QEvent::MouseButtonPress)
{
QMouseEvent *me = dynamic_cast<QMouseEvent *>(e);
if (_map->contains(_map->mapFromScene(me->pos())))
_timer.start();
}
else if (e->type() == QEvent::MouseMove && _timer.isActive())
_timer.stop();
else if (e->type() == QEvent::MouseButtonRelease)
{
_timer.stop();
emit resetRequest();
}
}
return QObject::eventFilter(obj, e);
} |
Avant la création de la scène :
qmlRegisterType<MapZoomController>("Game", 1, 0, "MapZoomController");
Dans le code QML :
1 2 3 4 5
| MapZoomController {
Component.onCompleted: { registerMap(internalContainer); }
onZoomRequest: // ...
onResetRequest: // ...
} |
Dans votre cas, il faudra bien refuser l'event s'il s'agit d'un Return dans le eventFilter() concernant un QObject de type TableView (ou pas, selon vos besoins - vous pouvez utiliser l'objectname pour plus de facilité) et émettre un signal approprié.
Si d'autres connaissent des solutions plus simples, n'hésitez pas, parce que c'est une solution assez brute.
Bonne journée,
Louis
Partager