在Qt中使用Tree显示表单



我正在构建一个具有多种形式的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()来选择要显示哪个。

相关内容

  • 没有找到相关文章

最新更新