在Qt中使用Tree显示表单

时间:2011-10-18 06:41:07

标签: forms qt treeview multiple-forms treewidget

我正在构建一个包含多种形式的Qt插件。我有一个主窗体,它在窗体的左侧放置了一个树窗口小部件。

我想在此树中添加项目,以便单击这些项目将在相同的表单上加载相应的表单。但我希望树窗口小部件处于活动状态,以便我也可以选择任何其他窗体。

我能够使用以下代码在主表单上显示表单:

Form1 *myform;
myform=new Form1(this);
myform->show();

其中Form1是我打算显示的表单的类。然而,这也掩盖了树小部件。我必须对单击树中的项目进行字符串比较,以显示相应的表单。

有人可以帮助我,因为我对Qt编程很陌生。

由于

2 个答案:

答案 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