QTableView / QTableWidget缓存不同的视图

时间:2015-01-04 05:50:34

标签: c++ qt

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

在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

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

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