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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Дырка QMessageBox  (Прочитано 19305 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« : Ноябрь 25, 2015, 18:15 »

Код:
    QMessageBox box;
    box.setParent( someOtherQWidgetPointer );
    box.exec()

Бокс не появится... . Поиски вывели на соответствующий баг в базе на bugreports.qt.io. Был подтвержден в версиях 4.8 и 5.4. Теперь еще и в 4.7. Очень странный баг, так не срабатывает именно вызов show() внутри exec().

« Последнее редактирование: Ноябрь 26, 2015, 00:33 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Nimbus
Гость
« Ответ #1 : Ноябрь 25, 2015, 22:13 »

Код:
    QMessageBox box();
    box.setParent( someOtherQWidgetPointer );
Странно, что это вообще компилится, а не вылетает the most vexing parse.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #2 : Ноябрь 26, 2015, 00:33 »

Код:
    QMessageBox box();
    box.setParent( someOtherQWidgetPointer );
Странно, что это вообще компилится, а не вылетает the most vexing parse.

Ничего странного, скобки лишние остались при редактировании. Убрал. К дырке это отношения не имеет.
« Последнее редактирование: Ноябрь 26, 2015, 00:40 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #3 : Ноябрь 26, 2015, 08:20 »

хм... Очень интересно, а нафига такое поведение?

Всмысле что messageBox обычно идёт на всё приложение, а вы хотите его сделать отдельным для каждого виджета?
Интересно, а интерфейс весь блокируется или только указанной виджет? Улыбающийся
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #4 : Ноябрь 26, 2015, 10:07 »

а так QMessageBox box(this); ?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Ноябрь 26, 2015, 12:05 »

а так QMessageBox box(this); ?
У меня на 5.5 так работает.
При назначении родителя позже содержимое диалога рисуется прямо на окне заданного родителя.
Т.е. репарент отрабатывает правильно, но с точки зрения обычного виджета, а не под-окна.


хм... Очень интересно, а нафига такое поведение?
+1
Записан

Qt 5.11/4.8.7 (X11/Win)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #6 : Ноябрь 26, 2015, 17:49 »

хм... Очень интересно, а нафига такое поведение?

Всмысле что messageBox обычно идёт на всё приложение, а вы хотите его сделать отдельным для каждого виджета?
Интересно, а интерфейс весь блокируется или только указанной виджет? Улыбающийся

Есть окно "управления" и есть окно "данных". При необходимости окно "данных" у пользователя должно перекрываться модальным окном с сообщением. При этом разработчику должно быть доступно окно "управления", его блокировать нельзя, но разработчик должен видеть, как блокируется окно "данных", когда отлаживает решение для пользователя. Обычному пользователю окно "управления" не доступно.

Всё работает как надо, если сделать

Код:
        box = new QMessageBox( dataWindow );
        ... код установки параметров сообщения
        box->setWindowModality( Qt::WindowModal );
        box->exec();

Где dataWindow - окно данных. При этом box появляется по центру этого окна и блокирует только его. Все остальные окна приложения доступны. В режиме "разработки" это важно.

Чтобы так сделать, пришлось немного усложнить приложение, так как dataWindow находится в одном плагине, а box в другом, и там где box, ничего про dataWindow по идее не известно. Если бы работал box->setParent( dataWindow ), тогда было бы проще - указатель на QWidget бокса передавался бы в плагин dataWindow, а там он сам умеет полученных делать своими потомками.

« Последнее редактирование: Ноябрь 26, 2015, 17:59 от Гурман » Записан

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

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Ноябрь 26, 2015, 18:01 »

Что-то как-то уж больно сложно...
А почему бы у dataWindow не сделать метод/слот типа showMessage() ?
Записан

Qt 5.11/4.8.7 (X11/Win)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #8 : Ноябрь 26, 2015, 18:20 »

Что-то как-то уж больно сложно...
Так и приложение больно не простое... Это не приложение даже, а инструмент для создания приложений, типа среды разработки. Можно считать так - окно "данных", это окно "приложения". А окно "управления" - это окно "отладчика". Собственно, по сути так и есть.

А почему бы у dataWindow не сделать метод/слот типа showMessage() ?
Во-первых, пришлось бы повторить практически весь функционал QMessageBox. Это должно быть именно окно с сообщением, с разными иконками, звуковыми сигналами и кнопками реагирования, в разных вариантах (Neutral message, Error, Warning, Question, Info, Extended Info) - а не просто сообщение на dataWindow, тем более, что именно dataWindow является инициатором появления сообщений. То есть, не слот должен быть, а сигнал. ;-) Но реальность гораздо разнообразнее. QMessageBox же делает всё что нужно. Во-вторых, плагин с выдачей сообщения может и отсутствовать, или может в будущем иметь немного другой функционал.
« Последнее редактирование: Ноябрь 26, 2015, 18:25 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #9 : Ноябрь 26, 2015, 21:59 »

Слишком замудрено, да и получается что у вас сообщение блокирующее вообще неизвестно где находится и находится ли вообще, при том оно само не в курсе что блокирует и пошто.

А на деле вы неправы. Тут как раз идёт обобщённость Qt, setParent это метод QWidget, а инициализация в конструкторе - метод QMessageBox как самостоятельного виджета.

Так что вы получили правильное поведение как виджета, но неправильное как QMessageBox. Это ясно видно в асситенте. На мой взгляд всё правильно, дырок нет, просто вы недоглядели.

Разобрались и ладно, я рад за вас.

PS поменять общее поведение всех QWidget ради неосмотрительности программиста... Ммм, вы же баг создали? Так если не трудно держите нас в курсе, что ответят разрабы Улыбающийся
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #10 : Ноябрь 26, 2015, 22:52 »

Слишком замудрено, да и получается что у вас сообщение блокирующее вообще неизвестно где находится и находится ли вообще, при том оно само не в курсе что блокирует и пошто.

Не получается. Оно появляется там где надо - ровно по центру того окна, которое оно блокирует. И оно в курсе, если ему надо - оно блокирует своего родителя. Только родитель устанавливается не вызовом setParent(), а в конструкторе бокса.

А на деле вы неправы. Тут как раз идёт обобщённость Qt, setParent это метод QWidget, а инициализация в конструкторе - метод QMessageBox как самостоятельного виджета.

Так что вы получили правильное поведение как виджета, но неправильное как QMessageBox. Это ясно видно в асситенте. На мой взгляд всё правильно, дырок нет, просто вы недоглядели.

Разобрались и ладно, я рад за вас.
Не... То, что кувиджет прячется при смене родителя - это я в курсе. У него hidden взводится. Но он обязан появляться по методу show(). Я с этим имел дело. Однако именно бокс по show() не появляется. Вот где баг.


PS поменять общее поведение всех QWidget ради неосмотрительности программиста... Ммм, вы же баг создали? Так если не трудно держите нас в курсе, что ответят разрабы Улыбающийся
Баг не я создал, он уже был на багтрекере, с прошлого года. Я только его подтвердил, причём не только я. Словесной реакции разрабов там нет. Есть только метка P2 Important и Unresolved. Баг подтвержден в 4.7.0, 4.8.0, 5.3.3, 5.4.7. То есть дырка историческая.
Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #11 : Ноябрь 27, 2015, 07:29 »

Ну и слава богу.

А по поводу исчезновения - предполагаю что он всё таки проходит, show, но так же быстро он и затирается основным окном Улыбающийся
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #12 : Ноябрь 27, 2015, 12:16 »

Ну и слава богу.

А по поводу исчезновения - предполагаю что он всё таки проходит, show, но так же быстро он и затирается основным окном Улыбающийся

Неа. Затертое может быть не видно, но виртуально оно присутствует. Тогда основное окно должно было бы блокироваться. Но этого не происходит. Бокс не исчезает - он не появляется.
« Последнее редактирование: Ноябрь 27, 2015, 12:19 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #13 : Ноябрь 27, 2015, 14:30 »

А как он будет блокироваться, если бокс принадлежит родителю и следовательно события для родителя не перестают приходить.

Как то сумбурно думается, но ведь если он отрисовывается на окне, то и блокировка должна распространяться на окно, к которому принадлежит класс messageBox, или нет? По идее всё правильно, блокируются все события, которые идут НЕ окну messageBox. В случае если окно messageBox == окно родителя, то блокировка на него действовать не будет, не?
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


Просмотр профиля
« Ответ #14 : Ноябрь 27, 2015, 14:43 »

В случае если окно messageBox == окно родителя, то блокировка на него действовать не будет, не?

Нигде такого нет "messageBox == окно родителя". Откуда это взялось? Я устанавливаю родителем messageBox.setParent( dataWindow ). Соответственно, dataWindow по иерархии выше messageBox, и при отправке ему событий они должны упираться в блокировку, при условии что messasgeBox видим, то есть у него hidden == false. Раз события для родителя не блокируются, а messageBox не видим даже после messageBox.show(), значит у него при этом hidden == false так и осталось.

Записан

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


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