#linux #qt #modal-dialog #x11
#linux #qt #модальный диалог #x11
Вопрос:
У меня есть приложение Qt, в котором есть два основных окна. В Linux, когда в одном главном окне появляется модальное диалоговое окно, оно появляется за другим главным окном. Что я могу сделать, чтобы диалоговое окно всегда отображалось поверх ВСЕХ основных окон?
ПРИМЕЧАНИЕ: это происходит только в Linux. Мы также создаем это приложение на MacOSX, и проблема там не возникает.
Вот код, который вызывает диалоговое окно. Материал в #if — это все, что я пытался перенести окно вперед. Я пробовал различные комбинации и порядки этих вещей.
QMessageBox dialog;
dialog.setIcon( QMessageBox::Information );
dialog.setWindowTitle( _documentName );
dialog.setText( tr("This document has unsaved changes. Do you want to save before closing?") );
dialog.setInformativeText( tr("Your changes will be lost if you don't save them.") );
dialog.setStandardButtons( QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel );
dialog.setDefaultButton( QMessageBox::Save );
dialog.setFixedSize( dialog.size() ); // non-resizable window
#if STUFF_I_TRIED
dialog.show();
dialog.setVisible(true);
dialog.open();
dialog.activateWindow();
dialog.raise();
#endif
int result = dialog.exec();
Я понимаю, что exec() должно быть всем, что мне нужно для отображения окна. Моя идея при вызове show() или open() заключалась в том, чтобы просто разрешить activateWindow() или raise() вступать в силу. Просто дурачусь, пытаясь заставить этот чертов диалог появиться.
TIA за любую помощь!
Комментарии:
1. Извините. Я забыл показать вызов dialog.exec(), который я использую для фактического отображения окна. ПОЖАЛУЙСТА, ПОЙМИТЕ: материал в #if предназначен только для иллюстративных целей, чтобы показать, какие вещи я пробовал. Я понимаю, что мне ничего из этого не нужно… этот exec() должен делать все правильно.
2. Не могли бы вы предоставить выдержку из кода, когда и как создаются два основных окна? В любом случае один из них должен быть родительским, верно?
3. Андрейс, ты прав!!! Вот и все! Я пропустил тот факт, что в этом диалоговом окне не было родительского окна. Когда я передаю родительское окно конструктору диалогового окна, все хорошо… затем диалоговое окно появляется в обоих окнах. Я подумал, что, возможно, мне не хватает чего-то основного. Большое спасибо за то, что дали моему мозгу этот удар.
Ответ №1:
Вся последовательность между #if1_ и #endif выглядит для меня довольно странно.
Обычно для отображения модального диалога требуется только exec():
QMessageBox msgBox;
msgBox.setText("They killed Kenny, again.");
int ret = msgBox.exec();
Комментарии:
1. Извините. Вы абсолютно правы. Мне не было ясно, что это за материал в #if. Я исправил текст вопроса.
2. Андрейс дал мне подсказку, которая позволила мне это исправить. Я не передавал родительское окно в конструктор диалогового окна. Это устранило проблему. Андрейс упомянул об этом в качестве комментария к исходному вопросу (см. Выше), но я отдам ему должное через этот его ответ. Спасибо Andrejs!
Ответ №2:
Вы делаете довольно много вещей между вашим #if 1, что, вероятно, сбивает с толку X11.
Вам нужен только ОДИН из них. Поскольку вы работаете с Mac и X11, я подозреваю, что вы хотите использовать open() и получить лист.
IIRC, show() против open() вызывает установку разных флагов окна, поэтому их вызов сразу после друг друга может привести к переводу окна в странное состояние. Также вызов show() или open() всегда должен активировать или открывать окно, если это диалоговое окно, которым является QMessageBox.
Попробуйте использовать только один из них и посмотреть, что произойдет.
Комментарии:
1. Извините, что я не был яснее в своей первоначальной формулировке проблемы. Я попытался просто вызвать show() или open() , но только в надежде, что они могут привести к тому, что вызовы raise() или activateWindow() окажут желаемое влияние. В моем реальном коде (за пределами #if) не было ни того, ни другого.