2013-05-09 3 views
7

У меня есть QGLWidget, который я хочу изменить до заданного разрешения (больше, чем содержащее окно). Мое намерение состоит в том, что окно расширяется до тех пор, пока виджет не войдет внутрь, но не сможет найти способ сделать это.Изменить размер окна

Я попробовал несколько команд после изменения размера QGLWidget, чтобы он работал без успеха. Перечислите результаты здесь:

  • ничего не делать: виджет перекрывает все окно. В конце концов, он будет изменен, чтобы соответствовать обратно в окно меньшего размера
  • mainWindow.adjustSize(): Виджет получает изменен на (0, 0)
  • mainWindow.resize(mainWindow.sizeHint()): смотри выше
  • mainWindow.resize(mainWindow.minimumSizeHint()): смотри выше

Я также прочитал в this thread, что перед изменением размера mainWindow я должен запустить цикл событий, чтобы пересчитать новые размеры, поэтому я вставил QCoreApplication::processEvents, чтобы сделать это без видимого эффекта.

Как изменить размер окна через виджет?

Редактировать

GLWidget не только виджет окна. Он встроен в сплиттер вместе с групповым ящиком.

ответ

6

http://qt-project.org/doc/qt-4.8/qwidget.html#sizePolicy-prop

http://qt-project.org/doc/qt-4.8/qsizepolicy.html#Policy-enum

http://qt-project.org/doc/qt-4.8/qwidget.html#setFixedSize

Так если предположить, что у вас есть QGLWidget вложенными внутри вашего QMainWindow в качестве центрального виджета, вы должны установить политику размера вашего QGLWidget.

Например:

QGLWidget * glw; // in your header for QMainWindow 

...

// In your constructor for QMainWindow 
glw = new QGLWidget; 
this->setCentralWidget(glw); 
glw->setFixedSize(500, 500); 

this->adjustSize(); 

Надежда, что помогает.

+0

Хотя это действительно изменяет размер окна для нужного размера он предотвращает от дальнейшего изменения размера пользователя. Из документации: 'Устанавливает как минимальный, так и максимальный размер виджета на s, тем самым не позволяя ему когда-либо увеличиваться или сокращаться.' Я просто попытался сохранить и восстановить старые минимальные и максимальные размеры, но это не приводит к изменениям вообще , – Nobody

+0

Вместо 'setFixedSize()', попробуйте 'setMinimumSize()' и используйте 'setSizePolicy()'. У вас действительно есть большой контроль над тем, как вещи расширяются и реагируют с помощью 'setSizePolicy()'. 'setFixedSize()' делает кучу вещей сразу, поэтому, вероятно, это не то, что вы хотите в этом случае. – phyatt

+0

'minimumSize' кажется, также неправильная вещь для меня. Пользователь должен иметь возможность изменять размер произвольно. Мне просто нужно, чтобы окно появилось до размера, соответствующего размеру запроса 'QGLWidget'. – Nobody

1

У меня есть приложение, которое должно быть очень похоже на ваши требования, поэтому я отправлю свое решение здесь. Изображение, покрывающее окно, которое свободно расширяется и усаживается, и может быть изменено на первоначальный размер и после этого остается расширяемым/термоусадочным.

Я использовал виджет QLabel для отображения изображения, но он также должен работать с другими виджетами. Я создал виджет с начальным размером и QSizePolicy::Ignored.

label->resize (w, h); // initial size 
label->setSizePolicy (QSizePolicy::Ignored, QSizePolicy::Ignored); 

Виджет Ярлык был в QVBoxLayout с несколькими кнопками в окне, но это может работать и с другими типами компоновки тоже.

окно и виджет изображения может быть изменен до оригинального размера изображения с помощью этого кода:

label->resize (w, h); // change to original size 
label->setMinimumSize (w, h); // prevent it from collapsing to zero immediately 
window->adjustSize(); // resize the window 
label->setMinimumSize (0, 0); // allow shrinking afterwards 
+0

К сожалению, это не работает для меня. Виджет изменяется, но 'adjustSize()' в окне сворачивает окно под размером виджета. Возможно, это вызвано сплиттерами, которые я использую. – Nobody

Смежные вопросы