Почему атрибут setspacing не работает?

Я новичок в 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;

}

И мой вывод выглядит так.введите описание изображения здесь

Я хочу, чтобы ширина моей строки была уменьшена, поэтому я раскомментировал строку 99, и мой вывод выглядит следующим образом.введите описание изображения здесь

Атрибуты setspacing и setContentsMargins в этом случае не работают. Куда я иду не так. Любая помощь будет очень полезна.

1

Решение

Если у вас автоматическая раскладка, что-то должно занимать пустое место. Если политика виджета (ов) установлена ​​на QSizePolicy :: Расширение это виджет (ы), который будет расширен, чтобы заполнить пробел. Если вы сделаете размер виджета (ов) фиксированным (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);, Чтобы центрировать виджеты по горизонтали, добавьте еще один участок, чтобы до и один после их. Так же, как вы могли бы центрировать виджеты вертикально, добавляя layoutMain->addStretch(); до for (int n = 0; n < 3; n++),

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;
}
2

По вопросам рекламы [email protected]