是否可以在 QGridLayout 中的小部件之间设置最小值 space?

Is it possible to set minimum space between widgets in QGridLayout?

我想创建一个可调整大小的 window,其中包含一些根据 window 调整大小的图标。 我创建了一个 window 并将图标放置在网格布局中,到目前为止它按我想要的方式工作。

但问题是当我把window缩小到很小的时候,图标太小了,根本无法识别。 所以我设置了图标的最小尺寸,似乎解决了第一个问题。

现在,问题是当我缩小 window 时图标重叠,看起来很难看。

我尝试使用 spacer、小部件边距、布局间距和 minimumRowHeight 属性。

但 Qt 似乎 window 大小比小部件的最小大小或边距或其他优先级更高。

它们都缩小了,但小部件之间仍然没有 space。

我可以用最小尺寸 window 解决这个问题。 但是,需要多次尝试才能确定最佳外观的最小尺寸。

所以我的问题是:

  1. 我想知道布局中的小部件之间是否有永不缩小的边距(或间距)。 如果有的话,我只是把我的图标放在一个很大的 window 大小,并设置一个不缩小的边距,所以 window 的最小大小可以自己确定。

  2. 如果没有,制作我想要的东西的最佳方法是什么?最小尺寸是 window 吗? 那么,如何确定最佳的最小尺寸?

任何建议或文件将不胜感激。

添加:

  1. 这就是我想要的。我将 window 的最小高度设置为 380px。

  1. 如果我没有设置最小高度,图标会像上面那样重叠

  1. 我多次更改高度,确定图片的高度为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

问题是您为 QLabel 设置了最小尺寸,但没有为 QPixmap 设置,因为您希望图标根据 window 的尺寸改变尺寸,那么您可以设置 scaledContents 属性 的 QLabel 为真。

另一方面,我建议对所有元素使用 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();
}

如果要修改行、列或两者之间的 space,则必须分别使用 layout->setVerticalSpacing(spacing)layout->setHorizontalSpacing(spacing)layout->setSpacing(spacing)