Russian Qt Forum

Qt => Вопросы новичков => Тема начата: OlegNik от Февраль 10, 2017, 11:33



Название: 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) Всем спасибо.