如何使用 TreeView 子项选择模型中的数据子集以将其显示在 TableView 中?

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

在这里,我尝试创建一个 Qt 模型/视图,根据在 QTreeView 中选择/单击的子项,在 TableView 中显示模型中不同的数据子集,但我对此以及我找到的示例都是新手没有做任何与此接近的事情。另外,我也没有发现 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);

c++ qt qtableview qtreeview qt5.15
1个回答
0
投票

您应该使用的是

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

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