Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: GreatSnake от Март 09, 2010, 11:16



Название: Фиксированный размер диалога под 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 ).

Вот так я избавился от глюка при восстановлении панелей главного окна:

Код
C++ (Qt)
void MainWindow::setVisible( bool set )
{
if( set )
setAttribute( Qt::WA_DontShowOnScreen, true );
 
restoreGeometry( g );
restoreState( s )
 
QWidget::setVisible( set );
 
if( set && testAttribute( Qt::WA_DontShowOnScreen ) )
{
setAttribute( Qt::WA_DontShowOnScreen, false );
setAttribute( Qt::WA_WState_ExplicitShowHide, false );
QTimer::singleShot( 5, this, SLOT( show() ) );
}
}