【问题标题】:Why does the setspacing attribute not work?为什么设置空间属性不起作用?
【发布时间】:2018-08-14 09:54:18
【问题描述】:

我是 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;

}

我的输出看起来像这样。

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

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

【问题讨论】:

  • 你设置了多少间距?我没看到你设置
  • 我设置了spacing=0;这样Label和LineEdit之间就不会有空格了。请参考最后几行
  • 评论 / 取消评论哪一行?
  • echoLineEdit->setMaximumWidth(120);//line:99
  • 我希望我的 lineedit 减少 ...多长时间?你能显示你想要的输出吗?

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


【解决方案1】:

如果您有自动布局,则应该有一些东西占用空白空间。如果小部件的策略设置为 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);
}

这会产生以下结果:

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

【讨论】:

  • 谢谢你@scopchanov..扩展是gr8。一个问题:你告诉“空白空间将分布在整个布局中 - 当我们使用setMaxim ...调用时”,这就是原因setSpacing 和 setContentsMargin 调用不起作用?
  • @adi 没错。它正在工作,但是您看到的空间比您设置的要多,因为它是间距 + 分布的空白空间。
  • @adi,用layoutRow-&gt;setSpacing(6); 试试我的代码并注释掉所有layoutRow-&gt;addStretch(); 行,你会看到标签和行编辑之间的空间永远不会小于6。跨度>
  • “分布式空白空间”-你能分享一些qt链接吗:看起来很有趣!!
  • @adi,对不起!我找不到明确写的。
【解决方案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;
}

【讨论】:

  • 嘿,谢谢伙计,它的工作原理..你能告诉我添加间隔是如何解决这个问题的吗?除了尺寸政策之外,指定 100 和 1 的意义是什么?
猜你喜欢
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 2019-02-19
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多