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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Фиксированный размер диалога под Windows  (Прочитано 14295 раз)
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« : Март 09, 2010, 11:16 »

Столкнулся с проблемой установки фиксированной высоты диалога под виндой. Кто-то глючит или Qt или Win API.
В определенных случаях требуется не позволять изменять размер окна диалога. Под Х-ами всё ок, а под виндой окно получается большего размера, но стоит кликнуть без драга на левый или правый край рамки окна и размер выставляется как нужно.
Может кто сталкивался с таким глюком?
Записан

Qt 5.11/4.8.7 (X11/Win)
cya-st
Гость
« Ответ #1 : Март 09, 2010, 15:35 »

Ты устанавливал свойства диалога setFixedHeight() и setFixedWidth()?
Записан
alexman
Гость
« Ответ #2 : Март 09, 2010, 15:39 »

void QWidget::setFixedSize ( const QSize & s )
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Март 09, 2010, 15:58 »

Мде, так и думал, что сглупил, что не сказал, что setMinimumHeight()+setMaximiumHeight() или setFixedHeight() вызываю.

Всё выставляется.
Со стороны Qt геометрия верная, т.е. dialog->height(), dialog->minimumHeight() и dialog->maximumHeight() возвращают верное выставленное мной значение.
И под X11 всё замечательно работает. Проблема вылезает только под виндой, а именно под WS2003.
Визуально окно диалога выглядит так, как будто заданная фиксированная высота не была принята Win API.
Но стоит единожды кликнуть на рамку окна и окно становится заданного размера.
« Последнее редактирование: Март 09, 2010, 16:05 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
cya-st
Гость
« Ответ #4 : Март 09, 2010, 17:06 »

WS2003 - это что?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Март 09, 2010, 17:09 »

WS2003 - это что?
Microsoft Windows Server 2003
Записан

Qt 5.11/4.8.7 (X11/Win)
cya-st
Гость
« Ответ #6 : Март 09, 2010, 17:12 »

Как ты вызываеш диалог?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Март 09, 2010, 17:16 »

Как всё делается:

Есть класс, который динамически строит диалог из .ui файла через QUiLoader.
Диалог универсальный и при определенных условиях некоторые его части требуется убирать.
На этот класс навешивается eventFilter(), в котором при QEvent::Show вызывается некий чекер, который прячет/показывает части диалога и
изменяет соответственно размер диалога.
Диалог показывается через QDialog::exec().


« Последнее редактирование: Март 09, 2010, 17:31 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Март 10, 2010, 05:05 »

Какая версия Qt?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Март 10, 2010, 11:01 »

4.6 и 4.6.2
Записан

Qt 5.11/4.8.7 (X11/Win)
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Март 10, 2010, 13:27 »

Мде, проблема решилась добавочным вызовом dialog->adjustSize() в обработчике QEvent::Show перед вызовом моего чекера.
Для чего это нужно делать под виндой большая загадка, хотя adjustSize() вызывается после построения диалога. Похоже под виндой события как-то не так отрабатываются.
Записан

Qt 5.11/4.8.7 (X11/Win)
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Март 15, 2010, 12:28 »

На самом деле считаю такую политику Qt, что о том,
что отработали все geometry/layout managers, мы можем узнать уже только в QEvent::Show, ущербной.
Мне раньше довольно-таки много приходилось писать на Xt/Motif.
Так вот в Xt у виджета есть очень полезное свойство mappedWhenManaged, отключив которое можно заставить
отработать все geometry managers без появления самого окна.
Очень жалко, что в Qt такого нет.
Записан

Qt 5.11/4.8.7 (X11/Win)
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #12 : Март 15, 2010, 14:16 »

Мне раньше довольно-таки много приходилось писать на Xt/Motif.
Так вот в Xt у виджета есть очень полезное свойство mappedWhenManaged, отключив которое можно заставить
отработать все geometry managers без появления самого окна.
Очень жалко, что в Qt такого нет.

Напиши саггест по этому поводу, посмотрим что ответят: http://bugreports.qt.nokia.com
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Март 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() ) );
}
}
 
« Последнее редактирование: Март 15, 2010, 17:35 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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