使用QStackedWidget进行层次结构QTreeView映射

时间:2016-05-27 06:25:56

标签: c++ qt

我正在使用QTreeView创建一个UI,表示项目列表(可能有孩子也可能没有孩子),并使用QStackedWidget在右侧显示相应的小部件。以前我的数据或上面提到的项目列表的行为是平的,因此我使用的是QListView,但是当数据必须有子项时,我用QTreeView替换了QListView,所以我也可以添加子项。我通过以下方式实现了上述目标:

for(std::vector<AWidget* >::iterator it=widgets.begin(); it!=widgets.end(); ++it)
            { 
                AWidget* w = *it;
                QStandardItem *parent = new QStandardItem(w->Name());
                model->setItem(i, 0, parent);

                QWidget *PageWidget = w->getWidget();
                QScrollArea * pScrollArea = new QScrollArea();
                pScrollArea->setWidget(PageWidget);
                m_ui.AStackedWidget->addWidget(pScrollArea);

                if(!w->hasChildren())
                    {
                    std::vector<AWidget*> children = w->getChildren();

                    for(std::vector<AWidget*>::iterator iChild=children.begin(); iChild!=children.end(); ++iChild)
                        {
                        AWidget* childWidget = *iChild;
                        QStandardItem *child = new QStandardItem(childWidget->Name());

                        parent->appendRow(child);
                        QWidget *childPageWidget = childWidget->getWidget();
                        QScrollArea * pChildScrollArea = new QScrollArea();
                        pChildScrollArea->setWidget(childPageWidget);
                        pChildScrollArea->setWidgetResizable(true);
                        m_ui.AStackedWidget->addWidget(pChildScrollArea);

                        }
                    }
                i++;
            }
            m_ui.ATreeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
            m_ui.ATreeView->setTabKeyNavigation(true);
            m_ui.ATreeView->setModel(model);

            QModelIndex index = m_ui.ATreeView->model()->index(0,0);
            QItemSelectionModel * selModel = m_ui.ATreeView->selectionModel();
            if(selModel)
            {
                connect(selModel, SIGNAL( currentChanged(const QModelIndex &, const QModelIndex &) ), this , SLOT(slotOptionSelectedForChangeUI(const QModelIndex & )) );

                selModel->select(index,QItemSelectionModel::Select);
            }
            slotOptionSelectedForChangeUI(index);

Definition of slotOptionSelectedForChangeUI() is as follows:

    void slotOptionSelectedForChangeUI(const QModelIndex & indx)
            {
                int rowNum = indx.row();
                if(m_ui.AStackedWidget)
                    m_ui.AStackedWidget->setCurrentIndex(rowNum);
            }

例如:以下是视图:

-A -> widget1
-B -> widget2
-C -> widget3
-D -> widget4
-E -> widget5
 -E1 -> widget6
 -E2 -> widget7
 -E3 -> widget8
 -E4 -> widget9
 -E5 -> widget10
 -E6 -> widget11
- E7 -> widget12

A,B,C,D,E在QStackedWidget的右侧显示正确的相应小部件。然而,E1,E2,E3,E4,E5,E6,E7分别显示小部件widget1,2,3,4,5,6,7。这意味着E1的索引从0再次开始,堆叠的窗口小部件显示索引0的widget0,依此类推。应该如何使用widget6-12映射E1-E7,以便在右侧堆叠的小部件上显示正确的小部件?

1 个答案:

答案 0 :(得分:1)

这样做的正确方法是不使用QStackedWidget,而只显示一个QStackedWidget。要做到这一点,您所要做的就是:

  1. 使用QStandardItem::setData
  2. 将小部件添加到项目中
  3. 在ui中,而不是QWidget,只需使用简单的#define MyRole Qt::UserRole + 42 //... //adding the item AWidget* w = *it; QStandardItem *parent = new QStandardItem(w->Name()); parent->setData(QVariant::fromValue(w), MyRole); model->setItem(i, 0, parent); //... //the index changed slot void slotOptionSelectedForChangeUI(const QModelIndex & indx) { AWidget *w = model->data(index, MyRole).value<AWidget*>();//will internally call QStandardItem::data //remove old children QList<QWidget*> children = m_ui.containerWidget->findChildren<QWidget*>(QString(), Qt::FindDirectChildrenOnly); foreach(QWidget *child, children) child->deleteLater(); //add the new one QWidget *PageWidget = w->getWidget(); ScrollArea * pScrollArea = new QScrollArea(m_ui.containerWidget); pScrollArea->setWidget(PageWidget); m_ui.containerWidget->layout()->addWidget(pScrollArea); } (水平/垂直布局没有边距)
  4. 将选择模型索引更改的信号连接到从简单窗口小部件中删除所有子项的插槽,并添加与项目一起存储的子项。您可以使用QStandardItem::data功能(或模型数据功能)
  5. 来检索它

    这是这些步骤的最小示例:

    UNION ALL