c++ - 是否可以在 QGridLayout 中设置小部件之间的最小空间?

标签 c++ qt qgridlayout

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

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

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

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

但 Qt 似乎窗口大小的优先级高于小部件的最小大小或边距或其他。

它们都缩小了,小部件之间仍然没有任何空间。

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

所以我的问题是:

  1. 我想知道布局中的小部件之间是否存在永不缩小的边距(或间距)。 如果有,我只是将我的图标放在一个宽大的窗口大小并设置一个不缩小的边距,这样窗口的最小大小可以自行确定。

  2. 如果不是,制作我想要的东西的最佳方法是什么?那是窗口的最小尺寸吗? 如果是这样,我如何确定最佳的最小尺寸?

如有任何建议或文档,我们将不胜感激。

添加:

  1. 这就是我想要的。我将窗口的最小高度设置为 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 设置,因为您希望图标根据窗口的尺寸改变尺寸,那么您可以将 QLabel 的 scaledContents 属性设置为 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->setHorizo​​ntalSpacing(spacing)layout->setSpacing(spacing),分别。

关于c++ - 是否可以在 QGridLayout 中设置小部件之间的最小空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60547518/

相关文章:

c++ - 为什么在 "release "模式下生成的可执行文件给出了错误的结果?

c++ - 调用默认构造函数没有匹配的函数

qt - QGridLayout 中包含在多个单元格中的小部件未居中

c++ - 将小部件插入 QGridLayout 的问题

c++ - 在资源文件中使用宏

c++ - 即使在 C++20 中 std::memcpy 也不是 constexpr 的原因是什么?

c++ - 如何从 C++/Qt Linux 应用程序逐行读取 FIFO/命名管道?

c++ - QButtonGroup setExclusive() 问题

python - PythonQt 被弃用了吗?

python - 如何创建分离器网格