Как установить макет на вкладку в QTabWidget?

Я создал QTabWidget (без вкладок) с помощью инструмента Qt Design, и теперь мне нужно создавать вкладки и динамически добавлять виджеты.

Я могу создать вкладку и добавить виджет, используя следующий код:

MyCustomWidget *myCustomWidget = new MyCustomWidget(this);
ui->myTabWidget->addTab(myCustomWidget, "New Tab");

Проблема в том, что виджет остается в верхнем левом углу моего QTabWidget, но мне нужно выровнять его по центру (горизонтально) моего QTabWidget.

Как я могу установить горизонтальный макет для этой новой созданной вкладки?

Примечание 1. Мой виджет (MyCustomWidget) имеет фиксированный размер.

Примечание 2. Я использую Qt 5.3.


person KelvinS    schedule 29.03.2017    source источник


Ответы (5)


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

person Rinat Veliakhmedov    schedule 29.03.2017

Вы можете использовать конструктор QT. Выберите QTabWidget и сделайте видимой вкладку, для которой необходимо изменить макет (и она должна содержать элементы, например, QLabel и т. д.). Щелчок правой кнопкой мыши->Макет->Макет по вертикали. вы должны сделать это на QTabWidget

person Philippe Bourrez    schedule 16.12.2020
comment
Большое спасибо. Это сводило меня с ума, пытаясь добавить макет в виджет. Дизайн Qt Designer ужасно плохой. - person Patrick Parker; 30.03.2021

Вам не нужен QFrame, простой QWidget и макет по центру сделают это:

auto w = new QWidget;

auto txtEdit = new QTextEdit; // Replace with whatever custom widget
txtEdit->setFixedSize(150, 150); // Only here to simulate your fixed size

auto layout = new QVBoxLayout;
layout->addWidget(txtEdit, 0, Qt::AlignHCenter);
w->setLayout(layout);

ui->tabWidget->addTab(w, "MyTab");
person ymoreau    schedule 20.07.2017

Я использую QT Creator 4.7.0 на основе QT 5.11.1. Я не могу изменить макет вкладки QTabWidget с помощью конструктора QT. Все элементы из макета отключены. Я очень странный. Единственный способ решить эту проблему - отредактировать файл пользовательского интерфейса (в моем случае файл mainwindow.ui). От:

<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>Insert Object</string>
</attribute>
</widget>

To:

<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>Insert Object</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout">
</layout>
</widget>

В результате макет вкладки QTabWidget изменился. Спасибо.

person Dong He Zheng    schedule 27.07.2018

Следуя идее @Satus, я создаю новый QFrame, устанавливаю минимальный размер как размер myTabWidget, устанавливаю горизонтальное расположение и добавляю внутрь него myCustomWidget, добавляя два QSpacerItem (слева и правильно):

QFrame *frame= new QFrame(this);
frame->setMinimumWidth(ui->myTabWidget->width());
frame->setMinimumHeight(ui->myTabWidget->height());

MyCustomWidget *myCustomWidget = new MyCustomWidget(frame);

QHBoxLayout *hLayout = new QHBoxLayout();

hLayout->addItem(new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Expanding));
hLayout->addWidget(myCustomWidget);
hLayout->addItem(new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Expanding));

frame->setLayout(hLayout);

ui->myTabWidget->addTab(frame, "New Tab");

Это сработало, но если у кого-то есть более элегантный способ, поделитесь с нами.

person KelvinS    schedule 29.03.2017