Можно ли установить минимальное пространство между виджетами в QGridLayout? - PullRequest
3 голосов
/ 05 марта 2020

Я хочу создать окно с изменяемым размером, которое содержит некоторые значки, которые изменяют размеры в соответствии с окном. Я создал окно и поместил значки в сетку, это работало так, как я хотел до сих пор.

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

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

I попытался использовать spacer, поле виджета, интервал макета и свойство MinimRowHeight.

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

Они все уменьшаются и по-прежнему отсутствуют. пространство между виджетами.

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

Так что мой вопрос:

  1. Интересно, есть ли разница (или интервал) между виджеты в макете, которые никогда не сжимаются. Если это так, я просто помещаю свои значки в большой размер окна и устанавливаю поле, которое не уменьшается, поэтому минимальный размер окна можно определить самостоятельно.

  2. Если нет Какой лучший способ сделать то, что я хочу? это минимальный размер окна? Если тогда, как мне определить наилучший минимальный размер?

Любые советы или документы будут высоко оценены.

Добавить:

  1. Это то, что я хочу. Я установил минимальную высоту окна на 380 пикселей.

Если я не установил минимальную высоту, значки перекрываются, как указано выше

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

Вот некоторый код:

verticalLayout = new QVBoxLayout(widget); // window layout

labelTime = new QLabel(widget);
verticalLayout->addWidget(labelTime);

gridLayout1 = new QGridLayout(); // grid layout at top
gridLayout1->setSpacing(15);
labelIcon1 = new QLabel(widget);
labelIcon1 ->setMinimumSize(QSize(40, 40));
labelIcon1 ->setPixmap(QPixmap(path));
gridLayout1->addWidget(labelIcon1, 0, 0, 1, 1);

... // create icons and add to gridlayout1

verticalLayout->addLayout(gridLayout1);

line = new QFrame(widget);  // just line.
verticalLayout->addWidget(line); // add to vertical layout, not grid layout.

... // create grid layout, icons at bottom and add it to vertical layout, same as top

Структура выглядит следующим образом: QLabel, QGridLayout, Line, QGridLayout2 размещены в вертикальной компоновке.

-------------vertical layout
[   text   ]
-------------grid layout
[icon][text]
[icon][text]
-------------grid layout
[   line   ]
-------------grid layout 2
[icon][text]
[icon][text]
[icon][text]
-------------grid layout 2
-------------vertical layout

1 Ответ

1 голос
/ 06 марта 2020

Проблема в том, что вы установили минимальный размер для QLabel, но не для QPixmap, поскольку вы хотите, чтобы значки изменяли размер в зависимости от размера окна, тогда вы можете установить для свойства scaledContents QLabel значение true.

С другой стороны, я бы рекомендовал использовать QGridLayout для всех элементов, чтобы сохранить выравнивание значков, в следующей части приведен пример:

#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    QGridLayout *layout = new QGridLayout(&w);

    QLabel *title = new QLabel("2020-01-01 00:00:00");
    title->setAlignment(Qt::AlignHCenter);
    layout->addWidget(title, 0, 0, 1, 2);

    QLabel *icon1 = new QLabel;
    icon1->setAlignment(Qt::AlignCenter);
    icon1->setPixmap(QPixmap(":/icon1.png"));
    icon1->setMinimumSize(40, 40);
    icon1->setScaledContents(true);
    layout->addWidget(icon1, 1, 0);
    QLabel *text1 = new QLabel("Disconnected");
    text1->setAlignment(Qt::AlignCenter);
    layout->addWidget(text1, 1, 1);

    QLabel *icon2 = new QLabel;
    icon2->setAlignment(Qt::AlignCenter);
    icon2->setPixmap(QPixmap(":/icon2.png"));
    icon2->setMinimumSize(40, 40);
    icon2->setScaledContents(true);
    layout->addWidget(icon2, 2, 0);
    QLabel *text2 = new QLabel("HDD 0%");
    text2->setAlignment(Qt::AlignCenter);
    layout->addWidget(text2, 2, 1);

    QFrame *line = new QFrame;
    line->setFrameShape(QFrame::HLine);
    line->setFrameShadow(QFrame::Sunken);
    layout->addWidget(line, 3, 0, 1, 2);

    QLabel *icon3 = new QLabel;
    icon3->setAlignment(Qt::AlignCenter);
    icon3->setPixmap(QPixmap(":/icon3.png"));
    icon3->setMinimumSize(40, 40);
    icon3->setScaledContents(true);
    layout->addWidget(icon3, 4, 0);
    QLabel *text3 = new QLabel("0");
    text3->setAlignment(Qt::AlignCenter);
    layout->addWidget(text3, 4, 1);

    QLabel *icon4 = new QLabel;
    icon4->setAlignment(Qt::AlignCenter);
    icon4->setPixmap(QPixmap(":/icon4.png"));
    icon4->setMinimumSize(40, 40);
    icon4->setScaledContents(true);
    layout->addWidget(icon4, 5, 0);
    QLabel *text4 = new QLabel("0 ( 0% )");
    text4->setAlignment(Qt::AlignCenter);
    layout->addWidget(text4, 5, 1);

    QLabel *icon5 = new QLabel;
    icon5->setAlignment(Qt::AlignCenter);
    icon5->setPixmap(QPixmap(":/icon5.png"));
    icon5->setMinimumSize(40, 40);
    icon5->setScaledContents(true);
    layout->addWidget(icon5, 6, 0);
    QLabel *text5 = new QLabel("0 ( 0% )");
    text5->setAlignment(Qt::AlignCenter);
    layout->addWidget(text5, 6, 1);

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

enter image description here

Если вы хотите изменить пространство между строками, столбцами или обоими, вы должны использовать layout->setVerticalSpacing(spacing), layout->setHorizontalSpacing(spacing) и layout->setSpacing(spacing) соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...