2011-10-18 51 views
0

我正在构建一个具有多种形式的Qt插件。我有一个主窗体,在窗体的左边放置了一个树小部件。在Qt中使用树显示表格

我想添加项目到这棵树,这样点击这些项目将加载相同的窗体上的相应表单。但我希望树小部件处于活动状态,以便我还可以选择任何其他形式。

我能够用下面的代码在主窗体上显示的一种形式:

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

其中Form1中是I类打算显示的形式。但是,这也掩盖了树形控件。我必须对被点击的树中的项目进行字符串比较以显示适当的表单。

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

感谢

回答

0

我完全不明白你想什么来实现,但你正在显示的代码位建议您不要使用Qt提供的布局。

如果您的目标是能够根据树中点击的项目动态加载表单,您可以通过布局(假设QHBoxLayout)来实现该目的,您可以在其中插入树并在其中插入一个QStackedWidget您可以“存储”每个表单(通过使用addWidget()),并通过调用setCurrentIndex()来选择要显示的表单。

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