Qt: какой макет или комбинацию макетов следует использовать в этом случае?

#qt #qwidget #qlayout

#qt #qwidget #qlayout

Вопрос:

Я работаю над проектом Qt, и для этого проекта мне нужно разработать что-то вроде этого:

Дизайн

Я уже разработал в Qt Creator, и у меня есть готовый компонент, но когда я пытаюсь добавить виджет в разные макеты, я не получаю желаемые формы. Что я должен сделать, чтобы изменить размер моего приложения?

Ловит:

  • Боковая панель имеет фиксированную ширину, что означает, что при увеличении размера окна по горизонтали ширина боковой панели по горизонтали не будет увеличиваться. Боковая панель сама по себе является виджетом.
  • вертикальная ширина верхней панели фиксирована (если это возможно). Это означает, что при увеличении размера окна по вертикали верхняя панель не может стать шире по вертикали. И сам он также является виджетом.
  • виджеты рядом с боковой панелью находятся в qstackedwidget .

Комментарии:

1. Я хочу, чтобы ширина боковой панели была фиксированной, по крайней мере. И, если возможно, ширину верхней панели. Что мне делать? Такой дизайн легко возможен с помощью веб-фреймворка, может ли QT что-то сделать?

2. Да, Qt может это сделать. Это делает мой предыдущий ответ полностью устаревшим, я отредактирую его, и, возможно, вам также следует отредактировать свой вопрос, удалив предыдущую версию и прояснив ее. Вы не должны делать такого рода вещи снова, это очень плохой поступок в SO.

3. Полностью извините, я догадался, поскольку боковые панели обычно имеют фиксированную ширину, мне не нужно будет упоминать в явном виде. Я был неправ.

4. Я обновил свой ответ, чтобы он был версией виджета stacked, пожалуйста, проверьте и посмотрите, есть ли у вас какие-либо дополнительные проблемы. Кроме того, боковая панель должна предоставлять некоторые соответствующие сигналы для переключения между различными страницами QStackedWidget .

Ответ №1:

Вложенные макеты:

(зеленый квадрат = QStackedWidget )

введите описание изображения здесь

Шаги:

[Определение]

H(x, y, …) = горизонтальные макеты на x, y, …; где x, y, … — это виджет (W #) или Макет (L #)

V(x, y, …) = горизонтальные макеты на x, y, …; где x, y, … — это виджет (W #) или Макет (L #)

  • Шаг 1: V (W1, W2) = L1
  • Шаг 2: H (W3, L1) = L2
  • Шаг 3: V (W4, L2) = L3
  • Шаг 4: Установите L3 в качестве макета текущей страницы макета StackedWidget
  • Шаг 5: H(W5, StackedWidget) = L4
  • Шаг 6: H (W6, разделитель, W7) = L5
  • Шаг 7: V (L5, L4)

Обратите внимание, что W6 и W7 имеют фиксированный размер по горизонтали (или задают для него максимальный), разделитель между ними действует как единственный изменяемый размер виджета в макете L5.


И вот иерархия:

введите описание изображения здесь

Комментарии:

1. Есть ли какой-либо способ заставить widget_5 иметь фиксированный размер? И могу ли я сделать widget_1, widget_2, widget_3, widget_4 частью окна стека?

2. Что вы имеете в виду под «стековым окном»? Предполагается, что стекированные окна должны быть » сложены «, в то время как на вашем изображении widget_1 ~ 4 являются » отдельными «.

3. @ShakibAhmed Если вы пытаетесь создать новый макет, в котором widget_1 ~ 4 расположены вместе в стекированном окне, ответ — да . Но вы должны были просто запросить версию стекового окна вместо текущей версии в своем вопросе.

4. Извините, во-первых, извините, потому что я написал stacked window, я имел в виду stacked widget. (Ошибаться — это по-человечески) Во-вторых, да, я должен был написать это в своем вопросе.

5. Отличное объяснение, и мой пользовательский интерфейс работает! Впервые макет Qt кажется простым!

Ответ №2:

Просто для удовольствия, версия кода с минимальным оптимизированным кодом…

 #include "mainwindow.h"

#include <QBoxLayout>
#include <QLabel>
#include <QStackedWidget>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
// Ingredients (taken from the mockup from top-left to bottom-right)
QFrame *upperBar = new QFrame;
QLabel *upperIcon = new QLabel("icon");
QLabel *profilePicture = new QLabel("profile picture");

QFrame *sideBar = new QFrame;
QLabel *sideItemA = new QLabel("Item A");
QLabel *sideItemB = new QLabel("Item B");

QStackedWidget *contentStack = new QStackedWidget;

QFrame *contentPage1 = new QFrame;
QLabel *page1WidgetA = new QLabel("I am widget A");
QLabel *page1WidgetB = new QLabel("I am widget B");
QLabel *page1WidgetC = new QLabel("I am widget C");
QLabel *page1WidgetD = new QLabel("I am widget D");

QWidget *centralWidget = new QWidget;

// The needed layouts:
QHBoxLayout *upperBarLayout = new QHBoxLayout;
QVBoxLayout *sideBarLayout = new QVBoxLayout;
QGridLayout *page1GridLayout = new QGridLayout;
QGridLayout *centralLayout = new QGridLayout;

// Let's connect the pieces:

/* First we setup the upperbar: */
upperBarLayout->addWidget(upperIcon, 1, Qt::AlignLeft);
upperBarLayout->addWidget(profilePicture, 3, Qt::AlignRight);
upperBar->setLayout(upperBarLayout);
upperBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

/* Then we setup the sidebar: */
sideBarLayout->addWidget(sideItemA);
sideBarLayout->addWidget(sideItemB);
sideBarLayout->addStretch();
sideBar->setLayout(sideBarLayout);
sideBar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);

/* Then we setup the content stacked widget */
page1GridLayout->addWidget(page1WidgetA, 0, 0, 3, 1);
page1GridLayout->addWidget(page1WidgetB, 0, 1, 1, 1);
page1GridLayout->addWidget(page1WidgetC, 1, 1, 2, 1);
page1GridLayout->addWidget(page1WidgetD, 3, 0, 1, 2);
contentPage1->setLayout(page1GridLayout);

contentStack->addWidget(contentPage1);
contentStack->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

/* Finally we setup the main elements into the central layout... */
centralLayout->addWidget(upperBar, 0, 0, 1, 2);
centralLayout->addWidget(sideBar, 1, 0, 1, 1);
centralLayout->addWidget(contentStack, 1, 1, 1, 1);
centralWidget->setLayout(centralLayout);
setCentralWidget(centralWidget);

/* Let's color it a little to better realize the positioning: */
setStyleSheet("QWidget {"
              "border: 1px solid black;"
              "color: red"
              "}");
}

MainWindow::~MainWindow()
{

}
  

Вот результат:
CombinationLayout, полностью адаптивный: D