为什么setspacing属性不起作用?

时间:2018-08-14 09:54:18

标签: c++ qt qlineedit qlayout qt5.9

我是Qt的新手并对其进行实验。我有一个布局,其代码如下:

MainWindow::MainWindow(QWidget *parent) :
QWidget(parent)
{
QVBoxLayout *parentLayout = new QVBoxLayout(this);//MainWindow is a QWidget

this->setStyleSheet("background-color:red");

for(int i=0;i<3;i++){
QHBoxLayout* labelLineEdit = f1();

parentLayout->addLayout(labelLineEdit);
}
parentLayout->setContentsMargins(0,0,40,0);
}

QHBoxLayout* MainWindow::f1()
{

QHBoxLayout *layout = new QHBoxLayout;

QLabel *label = new QLabel("Movie");
label->setStyleSheet("background-color:blue;color:white");
label->setMinimumWidth(300);
label->setMaximumWidth(300);

layout->addWidget(label);

QLineEdit *echoLineEdit = new QLineEdit;
//echoLineEdit->setMaximumWidth(120);//line:99
echoLineEdit->setMaximumHeight(50);
echoLineEdit->setMinimumHeight(50);

echoLineEdit->setStyleSheet("background-color:brown");

layout->addWidget(echoLineEdit);

layout->setSpacing(0);

return layout;

}

我的输出看起来像这样。enter image description here

我希望减小lineedit的宽度,所以我取消了第99行的注释,并且输出如下所示。enter image description here

在这种情况下,setspacing和setContentsMargins属性不起作用。我要去哪里错了。任何帮助都将非常有用。

2 个答案:

答案 0 :(得分:2)

您应该为每行添加一个分隔项(请参阅QSpacerItem

QHBoxLayout* MainWindow::f1()
{

    QHBoxLayout *layout = new QHBoxLayout;

    QLabel *label = new QLabel("Movie");
    label->setStyleSheet("background-color:blue;color:white");
    label->setMinimumWidth(300);
    label->setMaximumWidth(300);

    layout->addWidget(label);

    QLineEdit *echoLineEdit = new QLineEdit;
    echoLineEdit->setMaximumWidth(120);//line:99
    echoLineEdit->setMaximumHeight(50);
    echoLineEdit->setMinimumHeight(50);

    echoLineEdit->setStyleSheet("background-color:brown");

    layout->addWidget(echoLineEdit);

    //add spacer here
    QSpacerItem * item = new QSpacerItem(100, 1, QSizePolicy::Expanding, QSizePolicy::Fixed);
    layout->addItem(item);

    layout->setSpacing(0);

    return layout;
}

答案 1 :(得分:2)

如果您使用自动版式,则应该占用空白空间。如果窗口小部件的策略设置为 QSizePolicy :: Expanding ,则将扩展窗口小部件以填充空白。如果您将小部件的大小固定为( QSizePolicy :: Fixed )或将其大小限制为setMaximum...,则空白空间将分布在整个布局中。如果这不是您所希望的,则应在布局中添加一些内容以占用此空白空间。您有两种选择。我个人将使用QBoxLayout::addStretch而不是 QSpacerItem 。这是解决方案,以及从问题中清除代码的一些地方:

#include "MainWindow.h"
#include <QHBoxLayout>
#include <QLineEdit>
#include <QLabel>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    auto *widget = new QWidget(this);
    auto *layoutMain = new QVBoxLayout(widget);

    for (int n = 0; n < 3; n++)
        f1(layoutMain);

    layoutMain->setContentsMargins(0, 0, 40, 0);
    layoutMain->addStretch();

    setCentralWidget(widget);
    setStyleSheet("background-color: red");
}

void MainWindow::f1(QVBoxLayout *layoutMain)
{
    auto *layoutRow = new QHBoxLayout();
    auto *label = new QLabel("Movie", this);
    auto *lineEdit = new QLineEdit(this);

    label->setStyleSheet("background-color: blue; color: white");
    label->setFixedWidth(300);

    lineEdit->setMaximumWidth(120);
    lineEdit->setFixedHeight(50);
    lineEdit->setStyleSheet("background-color: brown");

    layoutRow->addWidget(label);
    layoutRow->addWidget(lineEdit);
    layoutRow->addStretch();
    layoutRow->setSpacing(0);

    layoutMain->addLayout(layoutRow);
}

这将产生以下结果:

enter image description here

如果希望空白行位于每行的开头,则可以将小部件有效地向右对齐,只需将layoutRow->addStretch();行放在layoutRow->addWidget(label);之前。要使小部件水平居中,请添加另一段拉伸,以使它们在之前和在之后。您可以采用将居中小部件垂直居中的相同方式,在layoutMain->addStretch();之前垂直添加for (int n = 0; n < 3; n++)