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() 的布局,例如 QHBoxLayoutQVBoxLayout。例如:

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);
}   

读这一篇:Widgets Tutorial - Nested Layouts