我使用 Qt Design 工具创建了QTabWidget
(没有标签页),现在我需要创建标签并动态添加小部件。
我可以使用以下代码创建选项卡并添加小部件:
MyCustomWidget *myCustomWidget = new MyCustomWidget(this);
ui->myTabWidget->addTab(myCustomWidget, "New Tab");
问题是小部件停留在QTabWidget
的左上角,但我需要将其对齐QTabWidget
的中心(水平)。
如何为创建的新标签设置水平布局?
注1 :我的小部件(MyCustomWidget
)的大小固定。
注2 :我正在使用Qt 5.3。
答案 0 :(得分:2)
它始终位于左上角。您可以在您的上方添加另一个小部件,然后将小部件放在该小部件的中间,或者使小部件与选项卡的大小相同,并将其内容放在中间。您可以使用QWidget的setLayout
方法来设置窗口小部件布局。
答案 1 :(得分:1)
你不需要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");
答案 2 :(得分:0)
按照@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");
它有效,但如果有人有更优雅的方式,请与我们分享。
答案 3 :(得分:0)
我使用基于QT 5.11.1的QT Creator 4.7.0。 我无法使用QT设计器更改QTabWidget选项卡的布局。 “布局”中的所有项目均被禁用。我很奇怪解决此问题的唯一方法是编辑ui文件(在我的情况下为mainwindow.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的选项卡的布局已更改。 谢谢。
答案 4 :(得分:0)
您可以使用QT设计器。 选择QTabWidget,并使需要更改其布局的Tab可见(并且它必须包含元素,例如QLabel等。) 右键单击->布局->垂直布局 问题在于,在Qwidget上执行此操作很直观,而在QTabWidget上必须执行此操作