QTableView/QTableWidget 缓存不同的视图

QTableView/QTableWidget caching different views

本文关键字:视图 缓存 QTableWidget QTableView      更新时间:2023-10-16

我正在编写一个应用程序,该应用程序可以在QTableView/QTableWidget中读取和显示来自Web服务器的数据。每个条目将有几列,并且还有 SetData 来保存每个条目中的隐藏信息(来自 UI)(QVariant)。

关键是,QTableView/QTableWidget 的内容会根据用户从 ListBox 中选择的内容而变化,因此每次 ListBox 选择更改时,QTableView/QTableWidget 中的所有条目都将被清除,并显示与之相关的项目。

我想缓存用户单击的列表框项目的所有条目,因此如果用户返回到同一项目,只需在QTableView/QTableWidget中显示以前的条目,而无需再次向Web服务器发送请求以获取内容。

缓存数据以显示在 QTableView/QTableWidget 中的最佳方法是什么?

1)使用QTableView并动态创建QAbstractTableModel,然后将QAbstractTableModels保存在数组中。因此,每次用户更改列表框中的项时,我都会在相关的表模型项上调用 setModel。可能吗?如果是这样,怎么办?

2)使用QTableWidget,然后使用hashmap之类的东西来存储每个列表框选择的所有数据,然后当用户在项目之间切换时,清除QTableWidget并循环映射并每次添加项目?

在Qt模型/视图框架中,我们可以使用多态性。什么意思?我们可以轻松地使用一些容器来存储指向基类的指针(在我们的例子中QAbstractItemModel),并在程序中的每个位置使用此容器来获取模型或获取数据或 setData 等。在我的示例中,我使用了QVector:

QVector<QAbstractItemModel*> mdlVec;//in header (private section)

创建不同的模型并用数据填充这些模型,但将指针附加到我们的向量:

 QStandardItemModel *ListModel = new QStandardItemModel;
 QStandardItem *its = new QStandardItem("just example");
 ListModel->setItem(0,its);
 mdlVec.append(ListModel);
 //...
 QDir dir("G:/2");
 QStringList dirContents = dir.entryList(QStringList(), QDir::Files);
 QStringListModel *mdl = new QStringListModel(dirContents,this);
 mdlVec.append(mdl);
 //and so on

接下来,我们创建连接到某个信号的插槽,这使我们能够知道哪一行现在是当前的(例如QListWidget currentRowChanged):

void MainWindow::on_listWidget_currentRowChanged(int currentRow)
{
    if(currentRow <= mdlVec.size())
        ui->tableView->setModel(mdlVec.at(currentRow));
}

我们可以轻松地设置新数据并使用模型做其他事情。再举一个例子:

if(currentRow <= mdlVec.size())
{
    QAbstractItemModel *tmp = mdlVec.at(currentRow);
    tmp->setData(tmp->index(0,0),QString("%1 was changed").arg(currentRow+1));
    ui->tableView->setModel(mdlVec.at(currentRow));
}