我是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属性不起作用。我要去哪里错了,Anyhelp会非常有用。
最佳答案
如果您具有自动版式,则应该占用空白空间。如果小部件的策略设置为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->addStretch();
行放在layoutRow->addWidget(label);
之前。要使小部件水平居中,请添加另一段拉伸(stretch),以使它们之前和之后都有一个。您可以使用相同的方式将小部件垂直居中,在layoutMain->addStretch();
之前添加for (int n = 0; n < 3; n++)
。关于c++ - 为什么setspacing属性不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51838687/