如何使用 QTreeView 子级选择模型中的数据子集以将其显示在 QTableView 中?

问题描述 投票:0回答:1

在这里,我尝试创建一个 Qt 模型/视图,根据模型中的表视图显示不同的数据子集,具体取决于在

QTreeView
中选择/单击的子项,但我对此和我的示例都很陌生。我发现并没有做任何接近于此的事情。另外,我也没有发现 Qt 文档非常清楚如何做到这一点。

This is how it looks

我将数据存储在

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);
c++ qt qtableview qtreeview qt5.15
1个回答
0
投票

您应该使用的是

QSortFilterProxyModel
。 请参阅Qt 文档中的示例。 您将视图与 QSortFilterProxyModel 派生类连接,并将当前模型作为后端放入 QSortFilterProxyModel 中。因此,您只需扩展当前的代码,无需重写所有内容。

© www.soinside.com 2019 - 2024. All rights reserved.