我正在构建一个包含多种形式的Qt插件。我有一个主窗体,它在窗体的左侧放置了一个树窗口小部件。
我想在此树中添加项目,以便单击这些项目将在相同的表单上加载相应的表单。但我希望树窗口小部件处于活动状态,以便我也可以选择任何其他窗体。
我能够使用以下代码在主表单上显示表单:
Form1 *myform;
myform=new Form1(this);
myform->show();
其中Form1是我打算显示的表单的类。然而,这也掩盖了树小部件。我必须对单击树中的项目进行字符串比较,以显示相应的表单。
有人可以帮助我,因为我对Qt编程很陌生。
由于
答案 0 :(得分:0)
我并不完全理解您要实现的目标,但您显示的代码位表明您不使用Qt提供的布局。
如果您的目标是能够根据树中单击的项目动态加载表单,您可以通过布局(比方说QHBoxLayout)来插入树和{{3您可以在其中“存储”每个表单(通过使用addWidget())并通过调用setCurrentIndex()选择要显示的表单。
答案 1 :(得分:0)
ixM有一个很好的建议。第一步绝对应该是在主窗口中使用布局 - 将树与窗口的其余部分分开 - 您将在何处放置表单。我建议使用分离器,因为用户可以调整两半的大小。您可以在主窗口中将拆分器设置为CentralWidget的主窗口小部件。
QSplitter splitter = new QSplitter(CentralWidget);
splitter->setOrientation(Qt::Horizontal);
splitter->setHandleWidth(3);
splitter->setChildrenCollapsible(false);
MyTree= new QTreeWidget(splitter);
splitter->addWidget(MyTree);
然后将您的树窗口小部件添加到分割器,该分割器将位于左侧。
下一步是在拆分器的右侧添加占位符小部件。我们还将在该窗口小部件中添加布局。这种布局非常重要,我们稍后会使用它。
QWidget WidgetRightSide = new QWidget(splitter);
QVBoxLayout setupLayout= new QVBoxLayout(WidgetRightSide);
setupLayout->setSpacing(0);
setupLayout->setContentsMargins(0, 0, 0, 0);
现在,在这一点上,这是我的答案与前一个答案真正不同的地方。您可以使用QStackedWidget。这当然是一种选择。问题在于您必须在开头创建并加载所有表单。这会占用更多内存,启动时间会更长。如果你有2-5个表格,那就不是那么糟糕了,但是当我们谈论20个,30个或更多的表格时,真的很难看。
所以我建议的是,当用户在树中选择某些内容时,我们将删除旧表单,并在该点添加新选择的表单。
当树中的所选项目发生变化时,这就是我们现在要做的事情。
首先,从之前的选择表单中删除所有内容。
QLayoutItem *_Item;
while ((_Item = setupLayout->takeAt(0)))
delete _Item;
接下来,找出接下来要显示的形式,并创建它。
QWidget *ActiveSetupForm = NULL;
if ( I need to load form 1)
{
ActiveSetupForm = new YourNewForm( WidgetRightSide);
}
else ...
最后,将新表单添加到我们的布局中。
if(ActiveSetupForm)
{
setupLayout->addWidget(pActiveSetupForm);
}
正如旁注。布局很难手工完成。我强烈建议您在创建表单时考虑使用QtDesigner。它让生活更轻松。如果您想了解更多信息,请查看link。