2016-08-01 2 views
3

У меня возникла ситуация, когда мне нужно добавить сочетания клавиш в приложение, которое в основном состоит из пользовательского интерфейса QtQuick. Версия Qt Quick, к сожалению, заблокирована для Qt5.3, а ярлыки (то, как они нам нужны) были введены только в Qt5.5 и Qt5.7 соответственно.Как установить и использовать фильтр событий, написанный на Qt C++ в приложении QML

Итак, в качестве решения я написал фильтр событий, который функционирует аналогично QShortcut (не может использовать QShortcut, следовательно, фильтр событий).

Кто-нибудь знает, как установить и использовать этот eventfilter в QML?

ответ

4

Одним из способов были бы выставить тип одноплодного к QML:

#include <QtGui> 
#include <QtQml> 

class ShortcutListener : public QObject 
{ 
    Q_OBJECT 

public: 
    ShortcutListener(QObject *parent = nullptr) : 
     QObject(parent) 
    { 
    } 

    Q_INVOKABLE void listenTo(QObject *object) 
    { 
     if (!object) 
      return; 

     object->installEventFilter(this); 
    } 

    bool eventFilter(QObject *object, QEvent *event) override 
    { 
     if (event->type() == QEvent::KeyPress) { 
      QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); 
      qDebug() << "key" << keyEvent->key() << "pressed on" << object; 
      return true; 
     } 
     return false; 
    } 
}; 

static QObject *shortcutListenerInstance(QQmlEngine *, QJSEngine *engine) 
{ 
    return new ShortcutListener(engine); 
} 

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 

    qmlRegisterSingletonType<ShortcutListener>("App", 1, 0, "ShortcutListener", shortcutListenerInstance); 

    QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

    return app.exec(); 
} 

#include "main.moc" 

main.qml:

import QtQuick 2.5 
import QtQuick.Window 2.2 

import App 1.0 

Window { 
    id: window 
    width: 640 
    height: 480 
    visible: true 

    Component.onCompleted: ShortcutListener.listenTo(window) 
} 

Если у вас есть несколько разных слушателей, вы также можете сделать это декларативно путем добавления object недвижимости до ShortcutListener, чтобы он устанавливал фильтр событий при установке.

Для получения дополнительной информации см. Integrating QML and C++.

+0

Спасибо Митч, это довольно полный ответ! У меня нет окна QtQuick для работы, основное окно отображается с QQuickItem. QQuickItem имеет доступ к окну с помощью указателя, возможно, я могу попробовать это. – Hitsugaya198

+0

Я мог ошибаться, но не имеет значения, что такое корневой элемент, если он получает ключевые события. – Mitch

+0

Возможно, вы правы. Однако, если объект, на который установлен фильтр событий, не отображается/не имеет фокуса, требуется вызов grabKeyboard(), чтобы заставить входные триггеры пройти через этот объект. Это не то, что я хочу сделать, так как есть другие элементы QAction, которые имеют ярлыки, настроенные вне моего фильтра событий. – Hitsugaya198

 Смежные вопросы

  • Нет связанных вопросов^_^