布局中的空格按钮均等,但有一个空插槽

时间:2018-08-01 16:29:05

标签: qt layout qpushbutton qlayout

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

0_1533139279983_73cdd4a9-1f62-419e-9a84-3cb4013cfad5-image.png

我曾尝试使用Spacers,但似乎它们需要特定的高度和重量,并且我希望此布局具有足够的动态性,可以在任何分辨率下正确显示,因此固定大小的Spacer不会工作。

我尝试遵循以下代码,但这只是将前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);

如何创建动态布局,以合理的分辨率正确显示按钮?

1 个答案:

答案 0 :(得分:0)

有点“ hacky-slash”,但是...获得所需行为的最简单方法可能是定义一个从QPushButton继承但具有空paintEvent的spacer类定义...

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);

这给了我类似...

enter image description here