Название: Multi Multi Отправлено: OlegNik от Февраль 10, 2017, 11:33 Добрый день.
Возникла проблема с подключением нового функционала приложения, а именно multi-touch (вернее проблема даже не в этом) 1. добавил в класс QWidget новый обработчик событий event, где вполне удачно реализовал моменты с реализацией (multi-touch) и трансляцию событий не относящихся к сему действу. 2. в конструкторе QWidget установил атрибуты setAttribute(Qt::WA_AcceptTouchEvents); - о чудо заработало (multitouch) 3. но увы!, события mousePressEvent реализованное для кнопок, помещенных в основной QWidget перестает срабатывать. (после отключения setAttribute(Qt::WA_AcceptTouchEvents) кнопочные действа восстанавливаются, но multi-touch понятно не срабатывает) Прошу помочь решить данную проблему. Название: Re: Multi Multi Отправлено: Авварон от Февраль 10, 2017, 12:51 Там сложно, у QApplication есть 2 флажка - симулировать тач и мышь в зависимости от.
Возможно, они помогут. Название: Re: Multi Multi Отправлено: OlegNik от Февраль 10, 2017, 18:26 было бы неплохо озвучить эти флаги)
Название: Re: Multi Multi Отправлено: Apktyc от Февраль 12, 2017, 11:03 Думаю речь о Qt::AA_SynthesizeTouchForUnhandledMouseEvents и Qt::AA_SynthesizeMouseForUnhandledTouchEvents (установлен по умолчанию) соответственно.
Если надо чтобы по касанию срабатывало что-то, как на клик мыши - то возможно стоит переопределить QObject::event() для кнопок и отлавливать QEvent::MouseButtonPress и QEvent::TouchBegin. P.S. Как минимум у меня на Win7 встречается баг, что событие QEvent::TouchBegin (а соответственно и синтезированный QEvent::MouseButtonPress) не отсылается сразу после начала касания, в таком случае следует копать в сторону RegisterTouchWindow с TWF_WANTPALM. Название: Re: Multi Multi Отправлено: OlegNik от Февраль 13, 2017, 11:02 работаю под линукс
переопределил и отловил... bool IDraw::event(QEvent* event) { if(event->type() == QEvent::TouchBegin || event->type() == QEvent::TouchUpdate || event->type() == QEvent::TouchEnd ) { QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event); QList<QTouchEvent::TouchPoint> touchPoints = touchEvent->touchPoints(); if (touchPoints.count() == 1) { switch (event->type()) { case QEvent::TouchBegin: { QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event); QTouchEvent::TouchPoint touchPoints = touchEvent->touchPoints().first(); QMouseEvent *e = new QMouseEvent(QEvent::MouseButtonPress, touchPoints.pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); mousePressEvent(e); }break; case QEvent::TouchUpdate: { if(!_release2touch) { QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event); QTouchEvent::TouchPoint touchPoints = touchEvent->touchPoints().first(); QMouseEvent *e = new QMouseEvent(QEvent::MouseMove, touchPoints.pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); mouseMoveEvent(e); } }break; case QEvent::TouchEnd: { _release2touch = false; QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event); QTouchEvent::TouchPoint touchPoints = touchEvent->touchPoints().first(); QMouseEvent *e = new QMouseEvent(QEvent::MouseButtonRelease, touchPoints.pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); printf("TouchEnd\n"); mouseReleaseEvent(e); }break; default: break; } }else ... ...... событие поступает в mousePress void IDraw::mousePressEvent(QMouseEvent* pe) { isMousePressed = true; pressedX = pe->x(); pressedY = pe->y(); printf("PRINTF:MOUSEPRESS pressedX:%d pressedY:%d\n", pressedX, pressedY); //Это строка печатается if(gui->getAzimutButton()->isChecked()) { // А вот сюда она не поступает с включенным атрибутом // this->setAttribute(Qt::WA_AcceptTouchEvents); // this->setAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents); } Название: Re: Multi Multi Отправлено: Apktyc от Февраль 13, 2017, 12:02 А не достаточно ли будет кнопке тоже разрешить обрабатывать касания (Qt::WA_AcceptTouchEvents), и подписаться на сигнал toggled к примеру?
Или в текущем коде, самостоятельно взводить флаг checked. Название: Re: Multi Multi Отправлено: OlegNik от Февраль 13, 2017, 12:11 конкретнее по подписку, если возможно конечно
Название: Re: Multi Multi Отправлено: Apktyc от Февраль 13, 2017, 12:41 Ну, механизм сигналов и слотов, connect там, все дела, это знакомо?
Название: Re: Multi Multi Отправлено: OlegNik от Февраль 13, 2017, 13:16 ну конечно, об чЁм речь)
код в конструкторе widgetА: { connect(gui->getZoomInButton(), SIGNAL(clicked()), this, SLOT(zoomIn())); и т.д this->setAttribute(Qt::WA_AcceptTouchEvents); this->setAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents); } Название: Re: Multi Multi Отправлено: Apktyc от Февраль 13, 2017, 13:57 Ну так я и имел ввиду, выставить кнопке Qt::WA_AcceptTouchEvents, и по сигналу вызывать нужные слоты.
Проблема то приведенного кода, как я понял, что не срабатывает условие if(gui->getAzimutButton()->isChecked()), т.к. кнопка не переключает своего состояния от касаний. Название: Re: Multi Multi Отправлено: OlegNik от Февраль 14, 2017, 11:58 решил через жесты(gesture) Всем спасибо.
|