Russian Qt Forum
Ноябрь 24, 2024, 11:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Multi Multi  (Прочитано 5589 раз)
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 понятно  не срабатывает)
Прошу помочь решить данную проблему.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Февраль 10, 2017, 12:51 »

Там сложно, у QApplication есть 2 флажка - симулировать тач и мышь в зависимости от.
Возможно, они помогут.
Записан
OlegNik
Гость
« Ответ #2 : Февраль 10, 2017, 18:26 »

было бы неплохо озвучить эти флаги)
Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #3 : Февраль 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.
« Последнее редактирование: Февраль 12, 2017, 11:29 от Apktyc » Записан
OlegNik
Гость
« Ответ #4 : Февраль 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);

  }



Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #5 : Февраль 13, 2017, 12:02 »

А не достаточно ли будет кнопке тоже разрешить обрабатывать касания (Qt::WA_AcceptTouchEvents), и подписаться на сигнал toggled к примеру?

Или в текущем коде, самостоятельно взводить флаг checked.
Записан
OlegNik
Гость
« Ответ #6 : Февраль 13, 2017, 12:11 »

конкретнее по подписку, если возможно конечно
Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #7 : Февраль 13, 2017, 12:41 »

Ну, механизм сигналов и слотов, connect там, все дела, это знакомо?
Записан
OlegNik
Гость
« Ответ #8 : Февраль 13, 2017, 13:16 »

ну конечно, об чЁм речь)

 код в конструкторе widgetА:
{
    connect(gui->getZoomInButton(), SIGNAL(clicked()), this, SLOT(zoomIn()));
    и т.д
    this->setAttribute(Qt::WA_AcceptTouchEvents);
    this->setAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents);
}
Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #9 : Февраль 13, 2017, 13:57 »

Ну так я и имел ввиду, выставить кнопке Qt::WA_AcceptTouchEvents, и по сигналу вызывать нужные слоты.

Проблема то приведенного кода, как я понял, что не срабатывает условие if(gui->getAzimutButton()->isChecked()), т.к. кнопка не переключает своего состояния от касаний.
Записан
OlegNik
Гость
« Ответ #10 : Февраль 14, 2017, 11:58 »

решил через жесты(gesture) Всем спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.127 секунд. Запросов: 23.