Как иметь макет фиксированного размера, который также не позволяет изменять размер окна?

У меня есть виджет контейнера.

Политики размера являются "Фиксированными" (как вертикальными, так и горизонтальными). он имеет setMaxmimumWidth и setMaximumHeight.

Я разместил там контейнер QHBoxLayout. добавление к нему виджета (с фиксированной шириной и высотой тоже). Но когда я называю "Шоу", ничто из этого не заслуживает уважения. Высота является случайной почти, не соответствует ни одному из внутренних виджетов в макете, в два раза больше самого высокого элемента, , а ширина моего контейнера растянута далеко за пределы фиксированной ширины, которую я установил.

Что мне не хватает? Почему контейнер не может оставаться с фиксированной шириной/высотой, как я определил его? почему макет вмешивается в него и не соблюдает его ограничения?

Ответы

Ответ 1

Путаница возникает из-за того, что виджеты с фиксированными размерами действительно имеют фиксированные размеры. Имеет место следующее: если макет имеет только видные виджеты фиксированного размера, тогда общий размер макета номинально фиксируется, а виджеты внутри него не могут расти. Если вы установите его как макет в окне, он может ограничить увеличение окна, если вы установите ограничение SetFixedSize на него. Бесполезно устанавливать какие-либо политики размера в окне с макетом, который имеет только фиксированные элементы размера - если вы не хотите увеличить интервал между виджетами.

Если вы хотите, чтобы ваши виджетов сохранялись фиксированным размером, но между ними, чтобы расти, единственное изменение, необходимое для кода ниже, - это установить для всех виджетов политику фиксированного размера. Поскольку они не могут расти, интервал - это единственное, что может. Буквально настройте все политики в примере на QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed), и вы получите это поведение.

Если вам нужны виджеты определенного минимального размера и способности к росту, а также общий виджет контейнера определенного минимального размера, просто установите его так. Это означает:

  • Задайте минимальный, максимальный или фиксированный размер или ширину/высоту виджета контейнера.

  • Задайте минимальные, максимальные или фиксированные размеры или ширину/высоту виджета.

  • Задайте политики размеров в виджетах, чтобы отразить поведение, которое вы хотите. Например, вы можете захотеть, чтобы некоторые из виджетов росли только в определенных направлениях или вообще не были.

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

Нижеследующее работает отлично под Qt 4.8.5 и 5.1.1. Окно может быть расширено, но не сокращено - оно имеет минимальный размер. Вы можете изменить setMinimumSize на SetFixedSize, чтобы получить окно с фиксированным размером, или вы можете установить минимальный и максимальный размеры.

screenshot

#include <QApplication>
#include <QWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QFontDatabase>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget window;
    QHBoxLayout layout(&window);

    QLabel lbl1("one");
    lbl1.setStyleSheet("QLabel { background-color: #FF8080 }");
    lbl1.setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));

    QLabel lbl2("two");
    lbl2.setStyleSheet("QLabel { background-color: #80FF80 }");
    lbl2.setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
    lbl2.setMinimumHeight(300);

    QLabel lbl3("three");
    lbl3.setStyleSheet("QLabel { background-color: #8080FF }");
    lbl3.setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
    lbl3.setMinimumWidth(300);

    layout.addWidget(&lbl1);
    layout.addWidget(&lbl2);
    layout.addWidget(&lbl3);
    window.setMinimumSize(800, 800);
    // Any combination of setMinimumSize and setMaximumSize is OK.
    // If the minimum and maximum are the same, just do setFixedSize

    window.show();
    return a.exec();
}