Я новичок в 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 в этом случае не работают. Где я ошибаюсь. Anyhelp будет действительно полезен.
Я установил интервал = 0; чтобы не было пробелов между меткой и LineEdit. Pls относятся к последним строкам
Какая у вас линия комментарий / раскомментировать?
echoLineEdit-> setMaximumWidth (120); // строка: 99





Вы должны добавить разделитель для каждой строки (см. 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 в дополнение к политике размера?
Если у вас автоматический макет, что-то должно занимать пустое место. Если политика виджета (-ов) установлена на 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 Совершенно верно. Он работает, но вы видите больше места, чем вы установили, потому что это интервал + - распределенное пустое пространство.
@adi, попробуйте мой код с layoutRow->setSpacing(6); и закомментируйте все строки layoutRow->addStretch();, и вы увидите, что расстояние между метками и строками редактирования никогда не будет меньше 6.
"распределенное пустое пространство" - не могли бы вы поделиться некоторыми ссылками на qt для этого: это кажется интересным !!
@adi, мне очень жаль! Я не могу найти это написанное явно.
это ! вот фин @ scopchanov .. не могли бы вы дать мне представление о том, как добавить полосу прокрутки для основного макета?
@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..Одна небольшая проблема, я могу добавить полосу прокрутки; я попытался добавить больше виджетов, и все они находятся внутри полосы прокрутки, но полоса прокрутки ограничивается половиной размера виджета. какое-то исправление !!
@adi, попробуйте добавить виджеты не в полосу прокрутки напрямую, а в layoutMain.
мне задать это как отдельный вопрос?
@adi, я думаю, что это было бы более подходящим, и я был бы рад попытаться помочь вам, если бы мог.
пожалуйста, обратитесь к stackoverflow.com/questions/51844426/…
Не могли бы вы мне сказать, что вы имели в виду под "автоматическим макетом"?
@adi, я расскажу об этом позже сегодня, как ответ на ваш другой вопрос.
@adi, задайте об этом отдельный вопрос, т.е. как работает автоматическая верстка в Qt.
Какой интервал вы установили? Я не вижу, как ты настроен