Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Dima от Сентябрь 27, 2013, 00:47



Название: mousePressEvent баг ?
Отправлено: Dima от Сентябрь 27, 2013, 00:47
Приветствую!
Есть главное окно на нем widget MyQFrame, в котором переопределена функция mousePressEvent().
С функции MyQFrame::mousePressEvent (при нажатии клавиши мыши на дочерний MyQFrame) должен создаться QDialog.
QDialog создается… Но проблема в том, что после закрытия диалога при нажатии в любом месте главного окна (не по MyQFrame) происходит вызов MyQFrame::mousePressEvent , да и toolTip начинает выдавать подсказку от MyQFrame по всему главному  окну при этом размер и положения MyQFrame не изменяется.

Вот что в хелпе:

Цитировать
Данный обработчик для сообщения e может быть повторно реализован в подклассе для обработки виджетом сообщения о нажатии кнопки мыши.
Если Вы в функции mousePressEvent() создаете новые виджеты, то функция mouseReleaseEvent() может завершить работу не совсем так, как Вы ожидаете, это зависти от основной оконной системы (или оконного менеджера X11), расположения виджета и, может быть, от других факторов.
Реализация по умолчанию закрывает всплывающий виджет при нажатии кнопки мыши вне его окна. Для других типов виджетов ничего не происходит.
Как обойти это?


Название: Re: mousePressEvent баг ?
Отправлено: kambala от Сентябрь 27, 2013, 01:27
попробуй создавать виджет после небольшой задержки в отдельном слоте, например так:
Код
C++ (Qt)
void MyQFrame::mousePressEvent(QMouseEvent *e)
{
   QTimer::singleShot(0, this, SLOT(createDialog()));
}
 
void MyQFrame::createDialog()
{
   // тут создавай свой диалог
}


Название: Re: mousePressEvent баг ?
Отправлено: Dima от Сентябрь 27, 2013, 09:54
попробуй создавать виджет после небольшой задержки в отдельном слоте, например так:
Код
C++ (Qt)
void MyQFrame::mousePressEvent(QMouseEvent *e)
{
   QTimer::singleShot(0, this, SLOT(createDialog()));
}
 
void MyQFrame::createDialog()
{
   // тут создавай свой диалог
}
Не помогло.
Проблема в том, что баг этот проявляется когда диалог создается между событием mousePressEvent() и mouseReleaseEvent()  клавиш мыши, так как событие mouseReleaseEvent уже приходит сосданому диалогу. Вот если таймер поставить например в 1с после нажатия клав. то тогда все нормально. Думаю будем создавать диалог в событи mouseReleaseEvent.


Название: Re: mousePressEvent баг ?
Отправлено: Bepec от Сентябрь 27, 2013, 11:42
Можно воткнуть стража обыкновенного. (флаг булевский)

Или же проверять указатель на диалог - если не NULL, тогда отменяем действия и прочее - прочее - прочее.

PS с таймером мне не нравится конкретно данный случай - если натыкать много много раз, будет армагеддон диалогов :D


Название: Re: mousePressEvent баг ?
Отправлено: Dima от Сентябрь 27, 2013, 11:56
Можно воткнуть стража обыкновенного. (флаг булевский)

Или же проверять указатель на диалог - если не NULL, тогда отменяем действия и прочее - прочее - прочее.

PS с таймером мне не нравится конкретно данный случай - если натыкать много много раз, будет армагеддон диалогов :D
Пожалуйста, отобразите ваши мысли в рабочем коде.


Название: Re: mousePressEvent баг ?
Отправлено: Fregloin от Сентябрь 27, 2013, 12:38
отправить сигнал, а в отдельном слоте его впоймать?


Название: Re: mousePressEvent баг ?
Отправлено: Bepec от Сентябрь 27, 2013, 12:58
Постарался воссоздать вашу ситуацию - не смог. Диалог отрабатывает нормально, никаких коллизий не возникает.

Выкладывайте проект или же код создания вашего окна.

PS всего окна, а не куска.

PPS хотелось бы так же версию Qt узнать и ОС.


Название: Re: mousePressEvent баг ?
Отправлено: Dima от Сентябрь 30, 2013, 10:23
Цитировать
отправить сигнал, а в отдельном слоте его впоймать?
- не помогает.
Цитировать
Постарался воссоздать вашу ситуацию - не смог. Диалог отрабатывает нормально, никаких коллизий не возникает.

Выкладывайте проект или же код создания вашего окна.

PS всего окна, а не куска.

PPS хотелось бы так же версию Qt узнать и ОС.
ВИН 7 64.
Qt : Основан на Qt 5.0.2 (32-х битной) Собран Apr 9 2013 в 09:32:03 Ревизия b6257ef735

прикрепил проект


Название: Re: mousePressEvent баг ?
Отправлено: Bepec от Сентябрь 30, 2013, 10:35
Никакой проблемы нет. Во всяком случае у меня она не воссоздалась. Может быть у вас что-то с компилятором/Qt/прочими вещами?


Название: Re: mousePressEvent баг ?
Отправлено: LisandreL от Сентябрь 30, 2013, 10:38
Попробовал вашу сумку с молнией (bag.zip). Ни в 4.8.5, ни в 5.1.1 не воспроизводится. Компиляторы в обоих случая MinGW.


Название: Re: mousePressEvent баг ?
Отправлено: Dima от Сентябрь 30, 2013, 10:52
Никакой проблемы нет. Во всяком случае у меня она не воссоздалась. Может быть у вас что-то с компилятором/Qt/прочими вещами?
Попрошу от вас  exe файл проекта. Попробую запустить у себя


Название: Re: mousePressEvent баг ?
Отправлено: Bepec от Сентябрь 30, 2013, 10:54
https://dl.dropboxusercontent.com/u/62712483/Prog.Org/bag.zip


Название: Re: mousePressEvent баг ?
Отправлено: Dima от Сентябрь 30, 2013, 11:17
Да все работает. Может проблема в версии Qt у меня 5 у вас 4?
Верес можете посмотреть через TeamViewer?


Название: Re: mousePressEvent баг ?
Отправлено: Dima от Сентябрь 30, 2013, 12:40
запустил в Qt 4.7.4 (32-х битной) все нормально.


Название: Re: mousePressEvent баг ?
Отправлено: LisandreL от Сентябрь 30, 2013, 13:29
Да все работает. Может проблема в версии Qt у меня 5 у вас 4?
Вот тебе на брошки, вот те на духи
Вот 5-ая версия: http://rghost.ru/private/49062092/1bfe81c5d999ce28acc26d31b17746fe
Бага не наблюдаю.


Название: Re: mousePressEvent баг ?
Отправлено: Bepec от Сентябрь 30, 2013, 13:38
Вывод - наблюдаемый баг летает у вас на компьютере.


Название: Re: mousePressEvent баг ?
Отправлено: LisandreL от Сентябрь 30, 2013, 13:48
Вывод - наблюдаемый баг летает у вас на компьютере.
Ну, может в конкретной версии 5.0.2 баг (может и от компилятора зависеть - почему нет, да и от ключей, если сборка своя).