QT。向 QLayout 添加新布局
QT. Add new layout to QLayout
我在应用程序为 运行 时动态创建界面。
1) 我有带有 4 个预定义选项卡的 QTabWidget。但我必须只显示 1 或 2 个选项卡,以防用户选择。在 Whosebug 上我了解到,我必须将所有选项卡保留在 collection 中以添加和销毁它。
我有 QHash:twInputMethodsTabs = new QHash< int, QPair<QWidget*, QString> >();
第一个参数=索引;第二 = 选项卡小部件;第三 = 选项卡小部件标题文本;
2) 我这样填写 collection:
for(int i = 0; i < ui->twInputMethods->children().length(); i++)
{
twInputMethodsTabs->insert(i, QPair<QWidget*, QString>(ui->twInputMethods->widget(i), ui->twInputMethods->tabText(i)));
}
3) 我像这样在选项卡中添加新的小部件:
twInputMethodsTabs->value(1).first->layout()->addWidget(cmbbCommands);
4) 如何向此小部件添加新布局?我想这样做:
QHBoxLayout *hblParams =new QHBoxLayout();
twInputMethodsTabs->value(1).first->layout()->addLayout(hblParams);
但是不行,因为layout()
returnsQLayout
没有addLayout()
的功能。我该怎么做?
或者我应该如何更改代码架构来执行此操作?
我希望,我得到你想要做的事情:
twInputMethodsTabs->value(1).first->layout()->addWidget(cmbbCommands);
QHBoxLayout *hblParams =new QHBoxLayout();
QWidget *w = new QWidget(twInputMethodsTabs->value(1).first);
twInputMethodsTabs->value(1).first->layout()->addWidget(w);
w->addLayout(hblParams);
我只是在这里写代码,所以还没有测试。但是,它应该让您了解我在评论中试图解释的内容。
在下面的代码中,您将获得一个小部件 (.first
),然后 select 该小部件的布局 ->layout()
,然后向该布局添加一个小部件 ->addWidget()
。
twInputMethodsTabs->value(1).first->layout()->addWidget(cmbbCommands);
在下面的代码中,您将获得一个小部件 (.first
),然后 select 该小部件的布局 ->layout()
并尝试在布局上设置布局。
twInputMethodsTabs->value(1).first->layout()->addLayout(hblParams);
替换 QLayout
要在父控件上设置布局,您需要删除 ->layout()
:
twInputMethodsTabs->value(1).first->addLayout(hblParams);
请注意,由于您现在向小部件添加了一个空布局,因此先前布局中的所有当前小部件都将丢失,因此您可能需要将小部件重新添加到布局。
在现有 QLayout 中添加新的 QLayout
如果要将布局添加到现有布局中,则不能直接执行此操作。 QLayout
只能通过 .addWidget()
接受 QWidget
。但是,您可以将布局应用于空 QWidget()
,然后将 that 添加到布局。例如:
QWidget *w = new QWidget();
w.addLayout(hblParams);
twInputMethodsTabs->value(1).first->layout()->addWidget(w);
另一种方法是将 QWidget
上的布局设置为支持 .addLayout()
的布局,例如 QHBoxLayout
或 QVBoxLayout
。例如:
QVBoxLayout *l = new QVBoxLayout();
cmbbCommands.setLayout(l); // Now has a layout that supports .addLayout
twInputMethodsTabs->value(1).first->layout()->addWidget(cmbbCommands);
现在下面应该可以工作了,因为 ->layout()
returns a QVBoxLayout
:
QHBoxLayout *hblParams =new QHBoxLayout();
twInputMethodsTabs->value(1).first->layout()->addLayout(hblParams);
从 "working" 申请中截取:
WidgetA::WidgetA(QWidget *parent) : QWidget(parent)
{
QVBoxLayout *pLayout = new QVBoxLayout();
buildWidget(pLayout);
this->setLayout(pLayout);
}
void WidgetA::buildWidget(QVBoxLayout *layout){
for(int i=0; i<4; ++i){
this->buildSegments(layout);
}
}
void WidgetA::buildSegments(QVBoxLayout *layout){
QHBoxLayout *pHbl = new QHBoxLayout();
QLabel *pSegmentSize = new QLabel(this);
pSegmentSize->setText(tr("Segment Size(1,N)"));
QSpinBox *pSegments = new QSpinBox(this);
pHbl->addWidget(pSegmentSize);
pHbl->addWidget(pSegments);
layout->addItem(pHbl);
}
我在应用程序为 运行 时动态创建界面。
1) 我有带有 4 个预定义选项卡的 QTabWidget。但我必须只显示 1 或 2 个选项卡,以防用户选择。在 Whosebug 上我了解到,我必须将所有选项卡保留在 collection 中以添加和销毁它。
我有 QHash:twInputMethodsTabs = new QHash< int, QPair<QWidget*, QString> >();
第一个参数=索引;第二 = 选项卡小部件;第三 = 选项卡小部件标题文本;
2) 我这样填写 collection:
for(int i = 0; i < ui->twInputMethods->children().length(); i++)
{
twInputMethodsTabs->insert(i, QPair<QWidget*, QString>(ui->twInputMethods->widget(i), ui->twInputMethods->tabText(i)));
}
3) 我像这样在选项卡中添加新的小部件:
twInputMethodsTabs->value(1).first->layout()->addWidget(cmbbCommands);
4) 如何向此小部件添加新布局?我想这样做:
QHBoxLayout *hblParams =new QHBoxLayout();
twInputMethodsTabs->value(1).first->layout()->addLayout(hblParams);
但是不行,因为layout()
returnsQLayout
没有addLayout()
的功能。我该怎么做?
或者我应该如何更改代码架构来执行此操作?
我希望,我得到你想要做的事情:
twInputMethodsTabs->value(1).first->layout()->addWidget(cmbbCommands);
QHBoxLayout *hblParams =new QHBoxLayout();
QWidget *w = new QWidget(twInputMethodsTabs->value(1).first);
twInputMethodsTabs->value(1).first->layout()->addWidget(w);
w->addLayout(hblParams);
我只是在这里写代码,所以还没有测试。但是,它应该让您了解我在评论中试图解释的内容。
在下面的代码中,您将获得一个小部件 (.first
),然后 select 该小部件的布局 ->layout()
,然后向该布局添加一个小部件 ->addWidget()
。
twInputMethodsTabs->value(1).first->layout()->addWidget(cmbbCommands);
在下面的代码中,您将获得一个小部件 (.first
),然后 select 该小部件的布局 ->layout()
并尝试在布局上设置布局。
twInputMethodsTabs->value(1).first->layout()->addLayout(hblParams);
替换 QLayout
要在父控件上设置布局,您需要删除 ->layout()
:
twInputMethodsTabs->value(1).first->addLayout(hblParams);
请注意,由于您现在向小部件添加了一个空布局,因此先前布局中的所有当前小部件都将丢失,因此您可能需要将小部件重新添加到布局。
在现有 QLayout 中添加新的 QLayout
如果要将布局添加到现有布局中,则不能直接执行此操作。 QLayout
只能通过 .addWidget()
接受 QWidget
。但是,您可以将布局应用于空 QWidget()
,然后将 that 添加到布局。例如:
QWidget *w = new QWidget();
w.addLayout(hblParams);
twInputMethodsTabs->value(1).first->layout()->addWidget(w);
另一种方法是将 QWidget
上的布局设置为支持 .addLayout()
的布局,例如 QHBoxLayout
或 QVBoxLayout
。例如:
QVBoxLayout *l = new QVBoxLayout();
cmbbCommands.setLayout(l); // Now has a layout that supports .addLayout
twInputMethodsTabs->value(1).first->layout()->addWidget(cmbbCommands);
现在下面应该可以工作了,因为 ->layout()
returns a QVBoxLayout
:
QHBoxLayout *hblParams =new QHBoxLayout();
twInputMethodsTabs->value(1).first->layout()->addLayout(hblParams);
从 "working" 申请中截取:
WidgetA::WidgetA(QWidget *parent) : QWidget(parent)
{
QVBoxLayout *pLayout = new QVBoxLayout();
buildWidget(pLayout);
this->setLayout(pLayout);
}
void WidgetA::buildWidget(QVBoxLayout *layout){
for(int i=0; i<4; ++i){
this->buildSegments(layout);
}
}
void WidgetA::buildSegments(QVBoxLayout *layout){
QHBoxLayout *pHbl = new QHBoxLayout();
QLabel *pSegmentSize = new QLabel(this);
pSegmentSize->setText(tr("Segment Size(1,N)"));
QSpinBox *pSegments = new QSpinBox(this);
pHbl->addWidget(pSegmentSize);
pHbl->addWidget(pSegments);
layout->addItem(pHbl);
}