QMainWindow - проблема изменения размера с QGraphicsView - PullRequest
1 голос
/ 22 июня 2011

Использование Qt 4.6 в Ubuntu 10.4

У меня есть центральный виджет QGraphicsView в моем MainWindow.Каждый раз, когда программа переключается на новый уровень (игра Sokoban), я хочу, чтобы главное окно адаптировалось к новому размеру представления.Я в основном достигал этого, устанавливая максимальную и минимальную ширину / высоту главного окна и вида на одно и то же, и это работает большую часть времени, но на некоторых меньших уровнях MainWindow сжимается только в одном измерении и оставляет белое поле нас одной стороны вот так:

my Sokoban game

Так будет до тех пор, пока я не нажму на вид, и в этот момент MainWindow сжимается до вида.Я могу вводить нажатия клавиш до этого, чтобы переместить моего парня и выполнить другие команды, и поле останется, для его сжатия требуется щелчок мыши.Я придумал хакерское исправление на

move( geometry().x() + 1, geometry().y() ); // force mainWindow to update
move( geometry().x() - 1, geometry().y() ); // hackish but only thing that works

, но это кажется слабым и, скорее всего, не переносимым, хотя я не уверен, что эта проблема существует на других платформах.Есть идеи?

Ответы [ 3 ]

0 голосов
/ 22 июня 2011

Вот весь код, который я использовал при создании и настройке представления / сцены из MainWindow

m_scene->setSceneRect( -width/2, -height/2, width, height );

m_view = new QGraphicsView( m_scene );
m_view->setRenderHint( QPainter::Antialiasing );
m_view->setResizeAnchor( QGraphicsView::AnchorViewCenter );
m_view->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
m_view->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
m_view->setFixedWidth( width );
m_view->setFixedHeight( height );
setMaximumWidth( width );
setMinimumWidth( width );
setMaximumHeight( height );
setMinimumHeight( height );
setCentralWidget( m_view );
m_view->show();
move( geometry().x() + 1, geometry().y() ); // force mainWindow to update
move( geometry().x() - 1, geometry().y() ); // hackish but only thing that works
m_view->setFocus();

Редактировать: единственный макет в моей программе (о котором я знаю) - это неявно созданный макет MainWindowЯ не использовал QGraphicsLayouts или тому подобное.

0 голосов
/ 23 июня 2011

Я нашел лучшее решение по следующему:

...
setCentralWidget( m_view );
m_view->show();
activateWindow();
raise();
m_view->setFocus();

Я заметил, что поля не сжимаются, когда отображаемый вид нового уровня имеет те же размеры х, что и предыдущий, но меньший размер у (или наоборот), поэтому очевидно, что QMainWindow подстраивает свой размер под дочернее содержимое только тогда, когда изменяется ширина и высота дочернего виджета или когда MainWindow получает событие перемещения (по крайней мере, в GNOME 2.x).Вызов ActivWindow () и Raise () в MainWindow, кажется, делает свое дело, и тогда я могу вернуть фокус на представление.

0 голосов
/ 22 июня 2011

Когда вы используете изменить размер или setGeometry , ваш прямоугольник будет ограничен минимальным размером виджета.

По умолчанию это0,0 но есть ли вероятность, что вы устанавливаете минимальный размер в вашем коде, возможно, с помощью макета, чтобы метод resize отклонял заданный вами параметр?

...