Qt 在布局中等距放置按钮,但有一个空插槽

Qt 在布局中等距放置按钮,但有一个空插槽,qt,layout,qpushbutton,qlayout,Qt,Layout,Qpushbutton,Qlayout,我正在尝试创建一个按钮面板,其中包含4个按钮、一个空格和另一个按钮,所有按钮的空格相等,如下所示: 我曾经尝试过使用,但似乎这些都需要特定的高度和重量,我希望这个布局足够动态,能够正确地显示在任何分辨率上,所以固定大小的间隔将不起作用 我试着按照下面的代码,但这只是将前4个按钮挤压到顶部,最后一个按钮挤压到底部,并且没有将它们均匀地隔开 QVBoxLayout *layout = new QVBoxLayout; layout->setMargin(15); layout->set

我正在尝试创建一个按钮面板,其中包含4个按钮、一个空格和另一个按钮,所有按钮的空格相等,如下所示:

我曾经尝试过使用,但似乎这些都需要特定的高度和重量,我希望这个布局足够动态,能够正确地显示在任何分辨率上,所以固定大小的间隔将不起作用

我试着按照下面的代码,但这只是将前4个按钮挤压到顶部,最后一个按钮挤压到底部,并且没有将它们均匀地隔开

QVBoxLayout *layout = new QVBoxLayout;
layout->setMargin(15);
layout->setSpacing(15);
layout->addWidget(button1, 1);
layout->addWidget(button2, 1);
layout->addWidget(button3, 1);
layout->addWidget(button4, 1);
layout->addWidget(button5, 2, Qt::AlignBottom);
layout->addStretch();

buttonPnl->setLayout(layout);
我还尝试使用QGridLayout并指定每行的高度,但这看起来与前面的示例相同

QGridLayout *gridLayout = new QGridLayout;
gridLayout->setMargin(15);
gridLayout->setSpacing(15);
gridLayout->addWidget(button1, 0, 0);
gridLayout->addWidget(button2, 1, 0);
gridLayout->addWidget(button3, 2, 0);
gridLayout->addWidget(button4, 3, 0);
gridLayout->addWidget(button5, 5, 0);
gridLayout->setRowStretch(0, 1);
gridLayout->setRowStretch(1, 1);
gridLayout->setRowStretch(2, 1);
gridLayout->setRowStretch(3, 1);
gridLayout->setRowStretch(4, 1);
gridLayout->setRowStretch(5, 1);

我如何才能创建一个动态布局,以任何合理的分辨率正确显示我的按钮?

这有点“粗斜杠”,但。。。获得所需行为的最简单方法可能是定义一个间隔类,该间隔类继承自
QPushButton
,但具有空的
paintEvent
定义

class spacer: public QPushButton {
  using super = QPushButton;
public:
  using super::super;
protected:
  virtual void paintEvent (QPaintEvent *event) override
    {
    }
};
然后确保使用与其他按钮保持一致的文本字符串对其进行实例化,以便它具有来自
sizeHint()
的适当返回值。所以(根据你自己的例子)

这让我有点像

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
layout->addWidget(button4);

/*
 * Add a spacer using the text from button4 as a reference.
 */
layout->addWidget(new spacer(button4->text()));
layout->addWidget(button5);
layout->addStretch();

buttonPnl->setLayout(layout);