2014-02-18 2 views
25

Я только что портировал свое приложение из Qt 4.8.4 в Qt 5.2.1. У меня проблема с классом FlowLayout, как указано в FlowLayout example code in the Qt docs.Почему FlowLayout ведет себя по-разному в Qt 5.2, по сравнению с Qt 4.8?

У меня есть QMainWindow с QDockWidget, прикрепленным к нижней части центрального виджета. QDockWidget имеет FlowLayout с несколькими дочерними элементами. В Qt 4.8 это работало как шарм, размер дочерних виджетов соответствовал стандартным размерам DockWidget. Однако в Qt 5.2 DockWidget пытается увеличить свой размер до максимума (принимая место от центрального виджета). Изменение его компоновки предотвращает это нежелательное поведение. Но, конечно, я использую FlowLayout нарочно.

Чтобы проиллюстрировать эту проблему, я создал минимальный пример:

Конструктор DockWidget:

QGroupBox *generalBox = new QGroupBox(""); 
    generalBoxLayout = new FlowLayout; 
    generalBox->setLayout(generalBoxLayout); 

    for(int i=0; i<10; ++i) 
    { 
     QPushButton *button = new QPushButton("Test", this); 
     button->setMinimumWidth(100); 
     button->setMinimumHeight(100); 
     generalBoxLayout->addWidget(button); 
    } 

    this->setWidget(generalBox); 

Кто-то знает, в чем проблема и как я могу решить эту проблему?

Редактировать Я создал новый минимальный рабочий пример и, к сожалению, не может воспроизвести несоответствие между Qt 4.8 и Qt 5.2. Та же проблема проявляется в Qt 4.8, так что я все еще хотел бы представить его здесь:

Первоначальный вид, показывающий нижний док прикрепляемый принимая все пространство по вертикали: Initial view showing the bottom-docked dockwidget

Вид после изменения размера прикрепляемый с помощью мыши View after resizing the dockwidget with the mouse

Вид после изменения размера MainWindow с помощью мыши View after resizing the mainwindow with the mouse

Эти скриншоты показывают, что док-виджеты ведут себя так, как ожидается, после изменения размера док-виджет вручную. Однако при инициализации виджет занимает все свободное место из центрального виджета, что нежелательно.

Кто-нибудь знает о решении/обходном пути?

+2

Я пробовал его с Qt 4.8.1, 5.0.1, 5.2.1, и я не заметил никакой разницы. Вам нужно вставить несколько снимков экрана, чтобы объяснить, в чем проблема. –

+0

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

+3

Я вижу проблему сейчас. Я провел несколько экспериментов и исследований. Это похоже на ошибку в Qt. 'FlowLayout :: heightForWidth' всегда вызывается с одинаковым значением' width' (в моем случае 103) независимо от размера основного окна, и это приводит к тому, что высота больше желаемого (обычно окно намного шире). Также он не вызывается, когда меняется ширина главного окна (предполагается, что он обновляет высоту области док-станции). –

ответ

3

Это ответ, заданный Marek R. Я помещаю его здесь, чтобы этот вопрос получил ответ. Слишком долго он маскировался как вопрос без ответа.

Я вижу проблему сейчас. Я провел несколько экспериментов и исследований. Он выглядит , как ошибка в Qt. FlowLayout::heightForWidth всегда называется с таким же значением width (в моем случае 103) независимо от основного окна размер и эта высота ведет больше, чем желательно (обычно окно очень много шире). Также он не вызывается, когда меняется ширина главного окна (предполагается, что он обновляет высоту области док-станции).

+0

Это действительно ответ на первую часть вопроса. Я никогда не добавлял его в качестве ответа, потому что на часть решения не ответили. Однако я согласен, что имеет смысл называть этот ответ сейчас. –