Название: Фиксированный размер диалога под Windows Отправлено: GreatSnake от Март 09, 2010, 11:16 Столкнулся с проблемой установки фиксированной высоты диалога под виндой. Кто-то глючит или Qt или Win API.
В определенных случаях требуется не позволять изменять размер окна диалога. Под Х-ами всё ок, а под виндой окно получается большего размера, но стоит кликнуть без драга на левый или правый край рамки окна и размер выставляется как нужно. Может кто сталкивался с таким глюком? Название: Re: Фиксированный размер диалога под Windows Отправлено: cya-st от Март 09, 2010, 15:35 Ты устанавливал свойства диалога setFixedHeight() и setFixedWidth()?
Название: Re: Фиксированный размер диалога под Windows Отправлено: alexman от Март 09, 2010, 15:39 void QWidget::setFixedSize ( const QSize & s )
Название: Re: Фиксированный размер диалога под Windows Отправлено: GreatSnake от Март 09, 2010, 15:58 Мде, так и думал, что сглупил, что не сказал, что setMinimumHeight()+setMaximiumHeight() или setFixedHeight() вызываю.
Всё выставляется. Со стороны Qt геометрия верная, т.е. dialog->height(), dialog->minimumHeight() и dialog->maximumHeight() возвращают верное выставленное мной значение. И под X11 всё замечательно работает. Проблема вылезает только под виндой, а именно под WS2003. Визуально окно диалога выглядит так, как будто заданная фиксированная высота не была принята Win API. Но стоит единожды кликнуть на рамку окна и окно становится заданного размера. Название: Re: Фиксированный размер диалога под Windows Отправлено: cya-st от Март 09, 2010, 17:06 WS2003 - это что?
Название: Re: Фиксированный размер диалога под Windows Отправлено: GreatSnake от Март 09, 2010, 17:09 WS2003 - это что? Microsoft Windows Server 2003Название: Re: Фиксированный размер диалога под Windows Отправлено: cya-st от Март 09, 2010, 17:12 Как ты вызываеш диалог?
Название: Re: Фиксированный размер диалога под Windows Отправлено: GreatSnake от Март 09, 2010, 17:16 Как всё делается:
Есть класс, который динамически строит диалог из .ui файла через QUiLoader. Диалог универсальный и при определенных условиях некоторые его части требуется убирать. На этот класс навешивается eventFilter(), в котором при QEvent::Show вызывается некий чекер, который прячет/показывает части диалога и изменяет соответственно размер диалога. Диалог показывается через QDialog::exec(). Название: Re: Фиксированный размер диалога под Windows Отправлено: pastor от Март 10, 2010, 05:05 Какая версия Qt?
Название: Re: Фиксированный размер диалога под Windows Отправлено: GreatSnake от Март 10, 2010, 11:01 4.6 и 4.6.2
Название: Re: Фиксированный размер диалога под Windows Отправлено: GreatSnake от Март 10, 2010, 13:27 Мде, проблема решилась добавочным вызовом dialog->adjustSize() в обработчике QEvent::Show перед вызовом моего чекера.
Для чего это нужно делать под виндой большая загадка, хотя adjustSize() вызывается после построения диалога. Похоже под виндой события как-то не так отрабатываются. Название: Re: Фиксированный размер диалога под Windows Отправлено: GreatSnake от Март 15, 2010, 12:28 На самом деле считаю такую политику Qt, что о том,
что отработали все geometry/layout managers, мы можем узнать уже только в QEvent::Show, ущербной. Мне раньше довольно-таки много приходилось писать на Xt/Motif. Так вот в Xt у виджета есть очень полезное свойство mappedWhenManaged, отключив которое можно заставить отработать все geometry managers без появления самого окна. Очень жалко, что в Qt такого нет. Название: Re: Фиксированный размер диалога под Windows Отправлено: pastor от Март 15, 2010, 14:16 Мне раньше довольно-таки много приходилось писать на Xt/Motif. Так вот в Xt у виджета есть очень полезное свойство mappedWhenManaged, отключив которое можно заставить отработать все geometry managers без появления самого окна. Очень жалко, что в Qt такого нет. Напиши саггест по этому поводу, посмотрим что ответят: http://bugreports.qt.nokia.com Название: Re: Фиксированный размер диалога под Windows Отправлено: GreatSnake от Март 15, 2010, 17:33 Цитировать Напиши саггест по этому поводу, посмотрим что ответят: http://bugreports.qt.nokia.com Покапавшись в исходниках Qt обнаружил нужный мне атрибут Qt::WA_DontShowOnScreen.Т.е. у Qt всё нужное уже есть, только не для нас :( Перед show() достаточно выставить этот атрибут и окно не появится. Только вот, чтобы заставить его появиться одно выключение сего атрибута не помогает :( Помимо этого нужно сбросить Qt::WA_WState_ExplicitShowHide выставленный в QWidget::setVisible() и уже после этого по-новой вызывать QWidget::setVisible( true ). Вот так я избавился от глюка при восстановлении панелей главного окна: Код
|