0

我在运行应用程序时动态创建接口。

1) 我有带有 4 个预定义选项卡的 QTabWidget。但我必须只显示 1 或 2 个选项卡,以防用户选择。在 StackOverflow 上我了解到,我必须将所有选项卡保存在集合中才能添加和销毁它。

我有 QHash:twInputMethodsTabs = new QHash< int, QPair<QWidget*, QString> >();

第一个参数 = 索引;第二 = 选项卡小部件;第三 = 选项卡小部件标题文本;

2)我这样填写集合:

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()返回QLayoutwhich haventaddLayout()函数。我怎么能这样做?

或者我应该如何改变代码架构来做到这一点?

4

3 回答 3

1

我希望,我得到你想做的事:

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

我只是在这里写了代码,所以它是未经测试的。但是,它应该让您了解我在评论中试图解释的内容。

于 2016-04-28T15:58:36.340 回答
1

在以下代码中,您将获得一个小部件 ( .first),然后选择该小部件的布局->layout(),然后将一个小部件添加到该布局->addWidget()

twInputMethodsTabs->value(1).first->layout()->addWidget(cmbbCommands);

在以下代码中,您将获得一个小部件 ( .first),然后选择该小部件的布局->layout()并尝试在布局上设置布局。

twInputMethodsTabs->value(1).first->layout()->addLayout(hblParams);

替换 QLayout

要在父小部件上设置布局,您需要删除->layout()

twInputMethodsTabs->value(1).first->addLayout(hblParams);

请注意,由于您现在正在向小部件添加一个空布局,因此之前布局中的任何当前小部件都将丢失,因此您可能需要将小部件重新添加到布局中。

在现有 QLayout 中添加新 QLayout

如果要将布局添加到现有布局中,则不能直接执行此操作。QLayout只能QWidget通过接受.addWidget()。但是,您可以将布局应用于空白QWidget(),然后将其添加布局中。例如:

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()返回 a QVBoxLayout

QHBoxLayout *hblParams  =new QHBoxLayout();
twInputMethodsTabs->value(1).first->layout()->addLayout(hblParams);
于 2016-04-29T09:31:04.300 回答
0

从“工作”应用程序中删除:

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

阅读这个:小部件教程 - 嵌套布局

于 2018-04-04T08:54:14.953 回答