2016-12-20 4 views
1

C++ API имеет QEvent вместе с несколькими другими полученными из него классами (QMouseEvent, QGestureEvent и т. Д.). С другой стороны, QML имеет события. Однако я изо всех сил стараюсь найти элегантный способ непосредственного обработки событий C++ в QML.Обработка событий Qt C++ в контексте QML

Обычно то, что я сделать, это создать пользовательские QQuickWidget (или аналогичные включая QQmlEngine), переопределение QWidget::event(QEvent* event) и при получении ++ события специфического C Я размножить его через сигналы в QML слоты с кодом QML загружаются через этот виджет. Это похоже на большую работу, и мне интересно, есть ли какая-то встроенная обработка событий QML для событий, происходящих из контекста C++.

В частности, меня интересует обработка QGestureEvent s в QML, но я думаю, что то, что работает для этого типа событий, должно также работать для любого другого типа событий.

+0

Вы пытались использовать [MultiPointTouchArea] (http://doc.qt.io/qt-5/qml-qtquick-multipointtoucharea.html)? Он имеет сигнал 'gestureStarted (жест GestureEvent), который может отвечать вашим потребностям. – dydil

+0

Дело в том, что я хочу захватить события жестов, которые действительно происходят из контекста C++. Например, если я сопоставляю данные с устройства (к которому можно получить доступ только через средства С ++) к API-интерфейсу жестов Qt, а затем передать его в QML-часть приложения. Он не может быть удаленно подключен к контакту (например, жесты с использованием устройства Kinect). – rbaleksandar

+0

«Это похоже на большую работу» - это буквально ** ничего ** по сравнению с объемом работы, которую потребуется для реализации обработки событий C++ для QML. – dtech

ответ

1

Прямой поддержки обработки событий в QML нет, даже клавиатура и мышь доступны через вспомогательные объекты.

QEvent сам по себе не является производным QObject, и он также применяется ко всем производным событиям. Это означает отсутствие метаинформации и простой способ использования из QML.

Поскольку вас интересует конкретный тип событий, было бы проще создать собственный вспомогательный объект для этих типов событий, реализовать его на C++ и связать с ним QML с помощью сигналов, к которым вы можете присоединить обработчики.

+0

Хорошо, это, похоже, не имеет ситуации с точки зрения прямого решения. Это, по крайней мере, подтверждает мой страх в том, что я должен продолжать перенаправлять данные событий через сигналы в слоты QML. Благодарю. Мне нужно задаться вопросом, как реализованы события QML на земле.Похоже, что они не основаны на 'QEvent', а что-то еще ... – rbaleksandar

+1

@rbaleksandar - как говорится в ответе, это делается через вспомогательные объекты. Например, «MouseArea», который предназначен только для мыши и событий с одним касанием. – dtech

+0

А, да. Извини за это. Благодарю. Думаю, я могу это сделать и посмотреть, как это работает. – rbaleksandar

1

Если QGestureEvent можно скопировать возведенных можно просто создать адаптер Q_GADGET, основанный на:

class QmlGestureEvent : public QGestureEvent 
{ 
    Q_GADGET 
    Q_PROPERTY(...) // for the things you want to access from QML 

public: 
    QmlGestureEvent(const QGestureEvent &other) : QGestureEvent(other) {} 
}; 

Если не копировать-constructable вам придется добавить элементы данных к адаптеру и скопировать значения из событие.

+1

Поддержка событий не поддерживается. Это является источником значительного хакера, необходимого для реализации, например. государственная машина. Из-за этого Qt внутренне реализует клонирование событий в нескольких местах. Надеюсь, он будет очищен для Qt 6. –

+0

@KubaOber ах, я вижу. Я просто видел, что сам 'QEvent' имел конструктор копирования, а' QGestureEvent', похоже, не удалял его, поэтому я представил себе, что компилятор создавал бы по умолчанию тот, который вызывает базовый класс, а затем копирует член для данных производного типа –

+0

Скажем так: есть конструктор копирования. Но он не поддерживается. Вы должны проверить Qt-код, чтобы убедиться, что любые события, которые вы собираетесь копировать, на самом деле можно копировать. Другая проблема заключается в том, что, хотя конкретный тип события может быть скопирован, вам действительно нужен виртуальный конструктор копирования ('clone', который принимает' QEvent'). –

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