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

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

Страниц: 1 2 3 [4]   Вниз
  Печать  
Автор Тема: Техника отлова  (Прочитано 23272 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #45 : Март 24, 2015, 12:09 »

Решилось довольно просто - помогло наблюдение за QEvenr::Move. Псевдокод
Код
C++ (Qt)
QWidget * win = new QWidget;
win->setGeometry(100, 100, 640. 480);
WId id = win->winId();    // это калечит
// win->move(100, 100);   // это лечит
win->show();
При создании системного окна (др show) оно почему-то располагается как ОС решит (хотя позиция уже задана явно). Если потом не сделать move/setGrometry, то окно остается "в интересном положении" - рисуется верно но колбасит координаты. Хотя может на Вындоуз и работает, там не проверял
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #46 : Март 24, 2015, 14:27 »

При создании системного окна (др show) оно почему-то располагается как ОС решит (хотя позиция уже задана явно). Если потом не сделать move/setGrometry, то окно остается "в интересном положении" - рисуется верно но колбасит координаты. Хотя может на Вындоуз и работает, там не проверял

Я еще очень давно заметил, что при наследовании некоторых классов, особенно интерфейсных, некоторые параметры начинают устанавливаться только после отработки конструктора. То есть, их установка в конструкторе ни на что не влияет. И в Вындоуз тоже. Возможно это связано с тем, что до окончания конструктора цикл обработки сообщений окна еще не работает, и задание этих параметров без обработки сообщений не имеет смысла.
Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #47 : Март 24, 2015, 17:27 »

Еще один. Открывается модальный диалог (опять-таки, самый рядовой) и первый клик мыши почему-то игнорируется. Не всегда, но примерно в 50% случаев. Второй день придумываю тестовые печати. Наконец допер распечатать qApp->activeModalWidget. Во блин, оно NULL. Модальности это почему-то не мешает, но с событиями конечно чушь. MouseButtonPress получает окно что под диалогом, но там отлуп - теперь модальность появилась. Как можно было ее потерять  Непонимающий
Цитировать
How did you lose your virginity, Mary Long ?

Thoughts?
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #48 : Март 25, 2015, 01:07 »

Ну... как бы, если что-то происходит "примерно в 50% случаев", то с вероятностью близко к 100% где-то есть неинициализированная переменная.  Веселый

Но в Qt 4.7, с которым сейчас работаю, такого глюка с модальностью не замечал. Хотя модальными диалогами пользуюсь не редко. Делал и на 5.каком-то, тоже всё было нормально.

Так что проблемный код в студию...
« Последнее редактирование: Март 25, 2015, 01:11 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #49 : Март 25, 2015, 09:33 »

Так что проблемный код в студию...
Конечно было бы замечательно локализовать в тестовом примере - но это далеко не всегда удается. Попробую сегодня позже, пока выяснил следующее

"Пропажа"  нажатия мыши связана с вызовом этого диалога по double-click из предыдущего окна (хотя делается это через сигнал с QueuedConnection). Все норм если тот же самый диалог я открываю по клавише. В сбойной ситуации при нажатии мыши на кнопку никаких событий не приходит вообще. При отпускании кнопки мыши приходит 3 (MouseButtonRelease) причем окну (не виджету) - и все, дальнейших событий нет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #50 : Март 25, 2015, 10:33 »

На OSX (Qt 5.4) тестовый пример полностью воспроизводит ситуацию: запустить и double-click в  окно (ну в область клиента конечно). Появляется модальный диалог, тыкаете в его клиентскую часть. Ничего не происходит, mousePressEvent нет (вот он баг). Опять тыкаете - все норм.

На Win7 (Qt 5.3.2) - баг не воспроизводится, "утерянного" нажатия нет
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #51 : Март 25, 2015, 13:06 »

Появляется модальный диалог, тыкаете в его клиентскую часть. Ничего не происходит, mousePressEvent нет (вот он баг). Опять тыкаете - все норм.

У меня похожее было некогда с MFC - в окно первоначально не попадал фокус ввода. Первый клик ставил его в окно, второй отрабатывался окном уже как сигнал. У OSX и Win управление фокусом ввода совершенно разное.

А если тоже самое не кодом, а в Дизайнере нарисовать - ведь всё нормально работает?  Подмигивающий Я вообще всё в Дизайнере рисую, у меня ТЬМА окон и все достаточно сложные, если кодом их делать - проще застрелиться. Ни разу подобной проблемы не встречал, хотя есть и модальные окна, и не модальные. Правда и делаю пока только в Win, переносить в Lin буду потом-потом...
« Последнее редактирование: Март 25, 2015, 13:25 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #52 : Март 25, 2015, 13:43 »

У меня похожее было некогда с MFC - в окно первоначально не попадал фокус ввода. Первый клик ставил его в окно, второй отрабатывался окном уже как сигнал.
В тестовом примере фокуса нет, да и было бы событие мыши - а его нет. 

У OSX и Win управление фокусом ввода совершенно разное.
А Вы тоже работаете на OSX? Ой как хорошо, будет с кем посоветоваться! Ах нет, это Вы просто так сказали... очень жаль  Плачущий

А если тоже самое не кодом, а в Дизайнере нарисовать - ведь всё нормально работает?  Подмигивающий
Не заслуживает проверки, какая разница "где/как создано" если баг в событиях мыши. 
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #53 : Март 25, 2015, 17:57 »

А Вы тоже работаете на OSX? Ой как хорошо, будет с кем посоветоваться! Ах нет, это Вы просто так сказали... очень жаль  Плачущий

Я с Linux работаю. Идеология ввода *NIXовая, как и у OSX, и тоже очень отличается от Win. Предыдущая версия моего софта работала в Linux в KDE и GNOME, без каких-либо проблем с фокусом. То есть, всё работало один-в-один. Но я всё рисую в Дизайнере.

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

А вот это совершенно зря. Очень может быть, что при создании в дизайнере что-то учитывается, и баг не проявится. Останется только сравнить и найти - что учитывается.  Смеющийся Или написать баг-репорт на bugreports.qt.io ...  Подмигивающий
« Последнее редактирование: Март 25, 2015, 17:58 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Страниц: 1 2 3 [4]   Вверх
  Печать  
 
Перейти в:  


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