QT。将新布局添加到QLayout

时间:2016-04-28 15:28:19

标签: qt qwidget qtablewidget qlayout

我在运行Application时动态创建接口。

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

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

第一个参数=索引;秒= Tab Widget;第三名:Tab Widget Caption Text;

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()返回QLayout没有addLayout()功能。我怎么能这样做?

或者我怎样才能改变代码架构来做到这一点?

3 个答案:

答案 0 :(得分:1)

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

http://website.com/Error/InternalServerError?aspxerrorpath=/
Server Error in '/' Application. Runtime Error. 
Description: An exception occurred while processing your request. 
Additionally, another exception occurred while executing the custom error page for the first exception. 
The request has been terminated.

我刚刚在这里编写了代码,因此未经测试。但是它应该让你知道我在评论中试图解释的内容。

答案 1 :(得分:1)

在下面的代码中,您将获得一个小部件(.first),然后选择该小部件的布局->layout(),然后将Widget添加到该布局->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()会返回QVBoxLayout

QHBoxLayout *hblParams  =new QHBoxLayout();
twInputMethodsTabs->value(1).first->layout()->addLayout(hblParams);

答案 2 :(得分: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);
}   

阅读本文:Widgets Tutorial - Nested Layouts