gpt4 book ai didi

c++ - 使用 QStackedWidget 的分层 QTreeView 映射

转载 作者:行者123 更新时间:2023-11-30 05:27:16 25 4
gpt4 key购买 nike

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

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);
}

例如:下面是 View :

-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 的小部件 0,依此类推。 E1-E7 应该如何与 widget6-12 进行映射,以便正确的 widget 显示在右侧堆叠的 widget 上?

最佳答案

正确的做法是不使用 QStackedWidget,而只显示一个。为此,您只需:

  1. 使用 QStandardItem::setData 将小部件添加到项目中
  2. 在 ui 中,不用 QStackedWidget,只需使用简单的 QWidget(水平/垂直布局没有边距)
  3. 将选择模型索引更改信号连接到一个插槽,该插槽从简单小部件中删除所有子项,并添加与项目一起存储的子项。您可以使用 QStandardItem::data 检索它函数(或模型数据函数)

这里是这些步骤的一个最小示例:

#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);
}

关于c++ - 使用 QStackedWidget 的分层 QTreeView 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37476262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com