我在运行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()
功能。我怎么能这样做?
或者我怎样才能改变代码架构来做到这一点?
答案 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);
要在父窗口小部件上设置布局,您需要删除->layout()
:
twInputMethodsTabs->value(1).first->addLayout(hblParams);
请注意,由于您现在要向窗口小部件添加空布局,因此先前布局中当前的所有窗口小部件都将丢失,因此您可能需要将窗口小部件重新添加到布局中。
如果要在现有布局中添加布局,则无法直接执行此操作。 QLayout
只能通过QWidget
接受.addWidget()
。但是,您可以将布局应用于空QWidget()
,然后将 添加到布局中。例如:
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()
会返回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);
}