在这里,我尝试创建一个 Qt 模型/视图,根据模型中的表视图显示不同的数据子集,具体取决于在
QTreeView
中选择/单击的子项,但我对此和我的示例都很陌生。我发现并没有做任何接近于此的事情。另外,我也没有发现 Qt 文档非常清楚如何做到这一点。
我将数据存储在
QMap
中作为示例数据,并用它来填充表的模型,但是我应该怎么做才能使树和表一起工作?如何告诉模型仅显示我在树视图中单击的子项的数据?我读过一些有关代理的内容,但我不确定它是否适用于这种情况。请帮助我提出您的建议。
当时我使用一个模型作为树视图,另一个模型作为表视图,这就是为什么我有两个
QMap
。
QMap<QString,QList<QString>> namesMap;
namesMap = {{"Parent #1", {"Child 1-1", "Child 1-2", "Child 1-3"}},
{"Parent #2", {"Child 2-1", "Child 2-2"}},
{"Parent #3", {"Child 3-1"}}};
QMap<QString,QList<QList<QString>>> dataMap;
dataMap = {{"Child 1-1", {{"Name 1", "00000000000000", "1-1"},{"Name 2", "00000000000000", ""}}},
{"Child 1-2", {{"Name 1", "00000000000000", "1-2"},{"Name 2", "00000000000000", ""}}},
{"Child 1-3", {{"Name 1", "00000000000000", "1-3"},{"Name 2", "00000000000000", ""}}},
{"Child 2-1", {{"Name 1", "00000000000000", "2-1"},{"Name 2", "00000000000000", ""}}},
{"Child 2-2", {{"Name 1", "00000000000000", "2-2"},{"Name 2", "00000000000000", ""}}},
{"Child 3-1", {{"Name 1", "00000000000000", "3-1"},{"Name 2", "00000000000000", ""}}}};
这就是我设置用于处理表视图的模型和树视图的模型的方法:
tableModel = new QStandardItemModel(3,3,this);
QMap<QString,QList<QList<QString>>>::iterator itr;
for (itr = dataMap.begin(); itr != dataMap.end(); ++itr)
{
int row = 0;
// iterating through the Qlist
QListIterator<QList<QString>> i(itr.value());
while (i.hasNext())
{
QList list = i.next();
for (int col = 0; col < list.size(); ++col)
{
QModelIndex index = tableModel->index(row, col, QModelIndex());
tableModel->setData(index, list.at(col));
}
++row;
}
}
treeModel = new QStandardItemModel(this);
QStandardItem *root = treeModel->invisibleRootItem();
QList<QStandardItem*> rowItems;
QMap<QString,QList<QString>>::iterator iter;
for (iter = namesMap.begin(); iter != namesMap.end(); ++iter)
{
QString parentName = QString(iter.key());
QStandardItem *parent = new QStandardItem(parentName);
parent->setEditable(false);
rowItems << parent;
root->appendRow(rowItems);
rowItems.clear();
QListIterator<QString> i(iter.value());
while (i.hasNext())
{
QString childName = QString(i.next());
QStandardItem *item = new QStandardItem(childName);
item->setEditable(false);
rowItems << item;
parent->appendRow(rowItems);
rowItems.clear();
}
}
treeView = new QTreeView(this);
treeView->setModel(treeModel);
dataTable = new QTableView(this);
dataTable->setModel(tableModel);
您应该使用的是
QSortFilterProxyModel
。
请参阅Qt 文档中的示例。
您将视图与 QSortFilterProxyModel 派生类连接,并将当前模型作为后端放入 QSortFilterProxyModel 中。因此,您只需扩展当前的代码,无需重写所有内容。