Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Гурман от Октябрь 02, 2017, 16:58



Название: Глюк с virtual event() у MainWindow в Android
Отправлено: Гурман от Октябрь 02, 2017, 16:58
До сих пор с таким чудом не сталкивался. Обработчик event() в MainWindow в приложении для Android хронически пропускает через один DoubleClick. То есть, в нём есть

Код:
if( e->type() == QEvent::MouseButtonDblClick ) ...

Так вот оно true... на каждые 2 подряд двойных тапа на экран. Можно даже смело делать 4 тапа быстро подряд, чтобы гарантированно сработало. Сделал вывод в консоль - чего там в type() на самом деле, и получаю на первый двойной тап - только MouseButtonPress. Если через любой промежуток времени ещё раз сделать двойной тап, то прилетает MouseButtonDblClick.

НО! При этом я открываю ещё одно окно, тоже наследующее от MainWindow, и в нём тоже ловлю event() также точно - а там всё правильно работает.

Первое главное окно довольно сложное, на нём много всего. Пока не знаю, куда копать. Может кто уже сталкивался? Очевидно существенно, что это всё в Android.


Название: Re: Глюк с virtual event() у MainWindow в Android
Отправлено: Old от Октябрь 02, 2017, 17:15
Я смотрел-бы в первую очередь все установленные eventFilters.


Название: Re: Глюк с virtual event() у MainWindow в Android
Отправлено: Гурман от Октябрь 02, 2017, 17:29
Я смотрел-бы в первую очередь все установленные eventFilters.
Код:
bool MainWindow::event(QEvent *e)
{
    if( e->type()!=QEvent::UpdateRequest) qDebug()<<e->type();
    if( e->type() == QEvent::MouseButtonDblClick )
    {
............
    }
    if( e->type() == QEvent::HoverMove )
    {
............
    }
    return e->type() == QEvent::Gesture ? gesture( static_cast<QGestureEvent*>( e ) )
                                        : QWidget::event( e );
}
Больше ничего нет. Есть только перехваты жестов в конструкторе
Код:
    grabGesture(Qt::PinchGesture);
    grabGesture(Qt::TapAndHoldGesture);
    grabGesture(Qt::TapGesture);
Всё.


Название: Re: Глюк с virtual event() у MainWindow в Android
Отправлено: Old от Октябрь 02, 2017, 17:33
Вы писали, что MainWindow сложный виджет, возможно сообщения перехватывают его дочерние виджеты.


Название: Re: Глюк с virtual event() у MainWindow в Android
Отправлено: Гурман от Октябрь 02, 2017, 17:53
Вы писали, что MainWindow сложный виджет, возможно сообщения перехватывают его дочерние виджеты.

Те, которые перехыватывают - те перехватывают (кнопки, слайдеры), через них вообще тапы не проходят. Проблема с тапами туда, где нет перехватывающих виджетов. Там есть только виджеты, которые рисуют, у них нет перегруженных event(). И под ними QGraphicsView со сценой. Но во втором окне, которое правильно работает, тоже есть QGraphicsView со сценой. То есть, проблема не в них.

И потом - если бы перехватывали, то перехватывали бы каждый двойной тап, а не через один.


Название: Re: Глюк с virtual event() у MainWindow в Android
Отправлено: Old от Октябрь 02, 2017, 17:59
Долго не искал, для примера.
В qeffects.cpp есть QAlphaWidget, который устнавливает фильтр событий от самого qApp и обрабатывает двойной клик. И уверен таких классов относящихся к QGraphicsXXX еще масса.

А так дело ваше, не они - так не они.


Название: Re: Глюк с virtual event() у MainWindow в Android
Отправлено: Гурман от Октябрь 02, 2017, 18:11
Долго не искал, для примера.
В qeffects.cpp есть QAlphaWidget, который устнавливает фильтр событий от самого qApp и обрабатывает двойной клик. И уверен таких классов относящихся к QGraphicsXXX еще масса.

А так дело ваше, не они - так не они.

В проблемных местах либо QLabel, лежащий на QGraphicsProxyWidget, либо производный от QWidget мой класс, также лежащий на QGraphicsProxyWidget. А прокси в свою очередь на QGraphicsScene и соответственно QGraphicsView. Всё.

Что самое странное - первый раз, то есть после запуска приложения, дабл-тап нормально пропускается. Второй раз уже нет.


Название: Re: Глюк с virtual event() у MainWindow в Android
Отправлено: Гурман от Октябрь 02, 2017, 18:51
ЫЫЫЫ!!!!.... Установил приложение на смартфон с Android 6 - глюка нет. Всё работает как полагается. Глюк есть на планшете с CyanogenMod 10.1 ака Android 4.1.1.  >:(