Центральный виджет занимает слишком много места, а док-виджеты после изменения размера занимают мало места.

Я прямо сейчас использую QDockWidget для создания динамического компонента для организации некоторых пользовательских графиков. Участки должны быть изменены по своим размерам и могут быть расположены друг над другом.

Следующий фрагмент кода иллюстрирует, чего я пытаюсь достичь:

#include <QApplication>
#include <QMainWindow>
#include <QLabel>
#include <QDockWidget>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    auto window = new QMainWindow;
    window->setCentralWidget(new QLabel("Central Widget"));

    for (int i = 1; i < 9; i++) {
        auto dock = new QDockWidget(QString("Plot %1").arg(i));
        dock->setWidget(new QLabel(QString("Plot %1").arg(i)));
        dock->setAllowedAreas(Qt::AllDockWidgetAreas);
        window->addDockWidget(Qt::BottomDockWidgetArea, dock);
    }

    window->show();
    return app.exec();
}

Центральный виджет служит просто заполнителем и просто необходим для перетаскивания и перестановки QDockWidget.

Я уже очень доволен достигнутым поведением, за исключением единственного недостатка. После изменения размера window (увеличения) центральный виджет занимает все вновь полученное пространство, в то время как DockWidgets по-прежнему занимают то же место, что и раньше.

Поведение изображено ниже:

Приложение перед изменением размера

Приложение после изменения размера

Это немного раздражает пользователя, так как центральный виджет — это просто заполнитель. На самом деле, я просто хотел, чтобы поведение было обратным, то есть центральный виджет должен сохранять свой размер, а DockWidgets должны быть увеличены.

Как я могу этого добиться?


person Aleph0    schedule 03.06.2016    source источник


Ответы (2)


Просто измените размер центрального виджета до нужного размера. Или, что еще лучше, скройте его (похоже, вы используете только QDockWidget, кроме этого).

QLabel* label = new QLabel("Central Widget");
label->hide();
window->setCentralWidget(label);
window->setDockNestingEnabled(true);
person IAmInPLS    schedule 03.06.2016
comment
Спасибо за быстрый ответ. Я уже пытался скрыть центральный виджет. Но тогда вы больше не сможете перетаскивать виджеты док-станции. Кроме того, установка очень маленького максимального размера, например (0,0), отключает функцию перетаскивания виджетов в док-станции. - person Aleph0; 03.06.2016
comment
Что вы имеете в виду, что больше не можете перетаскивать виджеты док-станции? Конечно вы можете - person IAmInPLS; 03.06.2016
comment
Если я перейду на auto label = new QLabel("Central Widget"); label->setMaximumSize(0, 0);, я все равно смогу перетаскивать виджеты дока. Правильно. Теперь попробуйте выровнять все виджеты слева направо. После этого вы не можете снова выровнять сверху вниз. - person Aleph0; 03.06.2016
comment
О, я вижу. Добавьте эту строку: window->setDockNestingEnabled(true); - person IAmInPLS; 03.06.2016
comment
Прохладный! Использование теперь немного отличается. Я просто спрятал центральный виджет. label->hide(); После этого я могу свободно размещать свои участки, как мне нравится, и вложение, кажется, тоже приятно иметь. Большое спасибо еще раз. - person Aleph0; 03.06.2016

centralWidget()->hide(); // enable full dock space

у меня работает с qt 5.8

person roberto    schedule 01.08.2017