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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: mousePressEvent баг ?  (Прочитано 9645 раз)
Dima
Гость
« : Сентябрь 27, 2013, 00:47 »

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

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

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Сентябрь 27, 2013, 01:27 »

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Dima
Гость
« Ответ #2 : Сентябрь 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.
Записан
Bepec
Гость
« Ответ #3 : Сентябрь 27, 2013, 11:42 »

Можно воткнуть стража обыкновенного. (флаг булевский)

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

PS с таймером мне не нравится конкретно данный случай - если натыкать много много раз, будет армагеддон диалогов Веселый
Записан
Dima
Гость
« Ответ #4 : Сентябрь 27, 2013, 11:56 »

Можно воткнуть стража обыкновенного. (флаг булевский)

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

PS с таймером мне не нравится конкретно данный случай - если натыкать много много раз, будет армагеддон диалогов Веселый
Пожалуйста, отобразите ваши мысли в рабочем коде.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #5 : Сентябрь 27, 2013, 12:38 »

отправить сигнал, а в отдельном слоте его впоймать?
Записан
Bepec
Гость
« Ответ #6 : Сентябрь 27, 2013, 12:58 »

Постарался воссоздать вашу ситуацию - не смог. Диалог отрабатывает нормально, никаких коллизий не возникает.

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

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

PPS хотелось бы так же версию Qt узнать и ОС.
Записан
Dima
Гость
« Ответ #7 : Сентябрь 30, 2013, 10:23 »

Цитировать
отправить сигнал, а в отдельном слоте его впоймать?
- не помогает.
Цитировать
Постарался воссоздать вашу ситуацию - не смог. Диалог отрабатывает нормально, никаких коллизий не возникает.

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

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

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

прикрепил проект
Записан
Bepec
Гость
« Ответ #8 : Сентябрь 30, 2013, 10:35 »

Никакой проблемы нет. Во всяком случае у меня она не воссоздалась. Может быть у вас что-то с компилятором/Qt/прочими вещами?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #9 : Сентябрь 30, 2013, 10:38 »

Попробовал вашу сумку с молнией (bag.zip). Ни в 4.8.5, ни в 5.1.1 не воспроизводится. Компиляторы в обоих случая MinGW.
Записан
Dima
Гость
« Ответ #10 : Сентябрь 30, 2013, 10:52 »

Никакой проблемы нет. Во всяком случае у меня она не воссоздалась. Может быть у вас что-то с компилятором/Qt/прочими вещами?
Попрошу от вас  exe файл проекта. Попробую запустить у себя
Записан
Bepec
Гость
« Ответ #11 : Сентябрь 30, 2013, 10:54 »

https://dl.dropboxusercontent.com/u/62712483/Prog.Org/bag.zip
Записан
Dima
Гость
« Ответ #12 : Сентябрь 30, 2013, 11:17 »

Да все работает. Может проблема в версии Qt у меня 5 у вас 4?
Верес можете посмотреть через TeamViewer?
« Последнее редактирование: Сентябрь 30, 2013, 11:33 от Dima » Записан
Dima
Гость
« Ответ #13 : Сентябрь 30, 2013, 12:40 »

запустил в Qt 4.7.4 (32-х битной) все нормально.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #14 : Сентябрь 30, 2013, 13:29 »

Да все работает. Может проблема в версии Qt у меня 5 у вас 4?
Вот тебе на брошки, вот те на духи
Вот 5-ая версия: http://rghost.ru/private/49062092/1bfe81c5d999ce28acc26d31b17746fe
Бага не наблюдаю.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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