Почему не работает атрибут 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;

}

И мой результат выглядит так: Почему не работает атрибут setspacing?

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

Атрибуты setspacing и setContentsMargins в этом случае не работают. Где я ошибаюсь. Anyhelp будет действительно полезен.

Какой интервал вы установили? Я не вижу, как ты настроен

Mohammad Kanan 14.08.2018 12:00

Я установил интервал = 0; чтобы не было пробелов между меткой и LineEdit. Pls относятся к последним строкам

adi 14.08.2018 12:05

Какая у вас линия комментарий / раскомментировать?

Mohammad Kanan 14.08.2018 12:35

echoLineEdit-> setMaximumWidth (120); // строка: 99

adi 14.08.2018 12:38
Я хочу, чтобы моя строка была сокращена ... как долго? вы можете показать, какой результат вы хотите?
Mohammad Kanan 14.08.2018 12:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
911
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 в дополнение к политике размера?

adi 14.08.2018 12:58
Ответ принят как подходящий

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

Спасибо u @ scopchanov .. расширение gr8.one вопрос: вы сказали, что «пустое пространство будет распределено по всему макету - когда мы используем вызовы setMaxim ...», это причина того, что вызовы setSpacing и setContentsMargin не работают?

adi 14.08.2018 13:46

@adi Совершенно верно. Он работает, но вы видите больше места, чем вы установили, потому что это интервал + - распределенное пустое пространство.

scopchanov 14.08.2018 13:48

@adi, попробуйте мой код с layoutRow->setSpacing(6); и закомментируйте все строки layoutRow->addStretch();, и вы увидите, что расстояние между метками и строками редактирования никогда не будет меньше 6.

scopchanov 14.08.2018 13:50

"распределенное пустое пространство" - не могли бы вы поделиться некоторыми ссылками на qt для этого: это кажется интересным !!

adi 14.08.2018 13:51

@adi, мне очень жаль! Я не могу найти это написанное явно.

scopchanov 14.08.2018 15:20

это ! вот фин @ scopchanov .. не могли бы вы дать мне представление о том, как добавить полосу прокрутки для основного макета?

adi 14.08.2018 15:26

@adi рассмотрите этот обновленный код: #include "MainWindow.h" #include <QScrollArea> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { auto *scrollArea = new QScrollArea(this); auto *widget = new QWidget(this); auto *layoutMain = new QVBoxLayout(widget); scrollArea->setWidget(widget); scrollArea->setWidgetResizable(true); setStyleSheet("background-color: red"); layoutMain->addStretch(); for (int n = 0; n < 3; n++) f1(layoutMain); layoutMain->setContentsMargins(0, 0, 0, 0); layoutMain->addStretch(); setCentralWidget(scrollArea); }

scopchanov 14.08.2018 15:33

Спасибо за обновленный код @ scopchanov..Одна небольшая проблема, я могу добавить полосу прокрутки; я попытался добавить больше виджетов, и все они находятся внутри полосы прокрутки, но полоса прокрутки ограничивается половиной размера виджета. какое-то исправление !!

adi 14.08.2018 16:17

@adi, попробуйте добавить виджеты не в полосу прокрутки напрямую, а в layoutMain.

scopchanov 14.08.2018 16:27

мне задать это как отдельный вопрос?

adi 14.08.2018 16:29

@adi, я думаю, что это было бы более подходящим, и я был бы рад попытаться помочь вам, если бы мог.

scopchanov 14.08.2018 16:30

пожалуйста, обратитесь к stackoverflow.com/questions/51844426/…

adi 14.08.2018 16:59

Не могли бы вы мне сказать, что вы имели в виду под "автоматическим макетом"?

adi 16.08.2018 07:41

@adi, я расскажу об этом позже сегодня, как ответ на ваш другой вопрос.

scopchanov 16.08.2018 07:56

@adi, задайте об этом отдельный вопрос, т.е. как работает автоматическая верстка в Qt.

scopchanov 29.08.2018 18:05

Другие вопросы по теме