Программное позиционирование элемента
Есть окно, на которое добавляется QHBoxLayout:
Суть вопроса - необходимо программно, посредством кода - выровнять элемент QLineEdit* searchLine; - в компоновщике QHBoxLayout.
Уточнение: изначально, через дизайнер форм - компоновщик не добавлялся, т.е просто, полностью пустая форма, на которую нужно програмно все добавлять и выравнивать.
.h файл:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QHBoxLayout* mainLayout;
QLineEdit* searchLine;
// QSpacerItem* LeftSerchSpacer;
// QSpacerItem* RightSerchSpacer;
};
Что уже пробовал делать:
.cpp файл:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
mainLayout = new QHBoxLayout(this);
searchLine = new QLineEdit(this);
Пытался выровнять весь Layout:
mainLayout->setAlignment(Qt::AlignVCenter);
Пытался добавлять "распорки":
// LeftSerchSpacer = new QSpacerItem(2000,10);
// RightSerchSpacer = new QSpacerItem(*LeftSerchSpacer);
// mainLayout->addItem(LeftSerchSpacer);
Добавлять пустое пространство:
// mainLayout->addSpacing(this->width()/2);
// mainLayout->setSpacing(this->width()/2);
// mainLayout->setMargin(this->width()/2);
// mainLayout->addStretch(100);
Обращаться к конкретному виджету и выравнивать его:
При добавлении:
//mainLayout->addWidget(searchLine,20,Qt::AlignCenter);
После добавления:
mainLayout->setAlignment(searchLine,Qt::AlignVCenter);
// mainLayout->addItem(RightSerchSpacer);
// mainLayout->addSpacing(100);
// mainLayout->addWidget(searchLine);
this->setLayout(mainLayout);
searchLine->setVisible(true);
ui->setupUi(this);
}
- ни один, их приведенных вариантов для выравнивания элемента - не сработал.
P.S - не предлагать использовать конструктор форм. Проект - учебный, с целью освоения создания и компоновки элементов интерфейса посредством написания кода. Я знаю, что на реальных проектах - таким, никто не страдает.
UPD: Попробовал варианты из ответов:
mainLayout->addStretch();
mainLayout->addWidget(searchLine);
mainLayout->addStretch();
и
mainLayout->setAlignment(Qt::AlignVCenter);
searchLine->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
mainLayout->addWidget(searchLine);
mainLayout->setAlignment(searchLine,Qt::AlignVCenter);
- оба не дали эффекта.
Вот, как выглядит проблемная форма:

(отметил красным, где примерно должен быть виджет QLineEdit)
Ответы (3 шт):
Подозреваю, что ты хочешь сделать нечто такое:
searchLine = new QLineEdit(this);
mainLayout->addStretch();
mainLayout->addWidget(searchLine);
mainLayout->addStretch();
Так должно работать:
ui->setupUi(this);
auto layout = new QHBoxLayout(ui);
// Это эквивалентно
// auto layout = new QHBoxLayout
// ui->setLayout(layout)
auto widget = new QLineEdit(this);
widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
layout->addWidget(widget);
layout->setAlignment(widget, Qt::AlignVCenter);
Причем при такой постановке ui вообще не нужен, можно установить layout напрямую на пустой QWidget, и установить его в окно через setCentralWidget
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// Создание и заполнение горизонтального лейаута
QHBoxLayout* hlay = new QHBoxLayout();
// Левый спейсер (давит на QLineEdit слева)
hlay->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding));
// Сам QLineEdit - будет в центре, обещаю
hlay->addWidget(new QLineEdit());
// Правый спейсер
hlay->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding));
// Создание вертикального лейаута
QVBoxLayout* vlay = new QVBoxLayout(this->centralWidget());
// Верхний виджет, на котором располагается hlay, на котором QLineEdit
QWidget* wTop = new QWidget();
wTop->setLayout(hlay);
// Нижний виджет, который подпирает верхний
QWidget* wBottom = new QWidget();
wBottom->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
// добавление виджетов в вертикальный лейаут
vlay->addWidget(wTop);
vlay->addWidget(wBottom);
}
