我正在构建一个具有多种形式的Qt插件。我有一个主表单,它有一个树形小部件放置在表单的左侧。
我想向这棵树添加项目,这样点击这些项目就会在同一表单上加载相应的表单。但我想要的树小部件是活跃的,这样我就可以选择任何其他形式也。
我可以使用下面的代码在主表单上显示一个表单:Form1 *myform;
myform=new Form1(this);
myform->show();
,其中Form1是我要显示的表单的类。然而,这也掩盖了树小部件。我必须做一个字符串比较的项目在树被单击,以显示适当的形式。
有人可以帮助我这个,因为我是非常新的Qt编程。
谢谢
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。它让生活变得简单多了。如果你想了解更多,请点击这个链接。
我不完全理解你想要实现什么,但你所显示的代码位建议你不使用Qt提供的布局。
如果您的目标是能够根据在树中单击的项目动态加载表单,您可以通过拥有一个布局(让我们说QHBoxLayout)来实现这一点,您可以在其中插入您的树和QStackedWidget,您可以在其中"存储"每个表单(通过使用addWidget()),并通过调用setCurrentIndex()来选择要显示哪个。