如何在 QTabWidget 中为选项卡设置布局

How can I set a layout to a tab in QTabWidget?

本文关键字:选项 设置 布局 QTabWidget      更新时间:2023-10-16

我已经使用Qt设计工具创建了一个QTabWidget(没有选项卡(,现在我需要动态创建选项卡并添加小部件。

我可以使用以下代码创建选项卡并添加小部件:

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

问题是小部件停留在QTabWidget的左上角,但我需要将其对齐在QTabWidget的中心(水平(。

如何为创建的这个新选项卡设置水平布局?

注1:我的小部件(MyCustomWidget(具有固定大小。

注2:我使用的是Qt 5.3。

您可以使用 QT 设计器。选择 QTabWidget 并让需要更改其布局的选项卡可见(并且它必须包含元素,例如 QLabel 等(。垂直右键单击>布局>布局问题是在Qwidget上做这件事很直观,而你必须在QTabWidget上做。

它将始终位于左上角。您可以在您的小部件上添加另一个小部件,他们将您的小部件放在该小部件的中间,或者使您的小部件大小与选项卡相同并将其内容放置在中间。您可以使用QWidget setLayout方法来设置小部件布局。

你不需要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");

我使用的是基于 QT 5.11.1 的 QT Creator 4.7.0。我无法使用QT设计器更改QTabWidget选项卡的布局。布局中的所有项目均被禁用。我很奇怪。我解决此问题的唯一方法是编辑 ui 文件(在我的情况下,主窗口.ui 文件(。从:

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

自:

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

因此,QTabWidget选项卡的布局已更改。谢谢。

按照

@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");

它奏效了,但如果有人有更优雅的方式,请与我们分享。