QTableView/QTableWidget 缓存不同的视图
QTableView/QTableWidget caching different views
我正在编写一个应用程序来读取和显示来自 QTableView/QTableWidget 中网络服务器的数据。
每个条目将有多个列和 SetData 以在每个条目 (QVariant) 中保存隐藏信息(来自 UI)。
要点是,QTableView/QTableWidget 的内容会根据用户从 ListBox 中选择的内容而变化,因此每次 ListBox 的选择发生变化时,QTableView/QTableWidget 中的所有条目都将被清除并显示与其相关的项目.
我想缓存用户单击的列表框项目的所有条目,因此如果用户 return 回到同一项目,只需显示 QTableView/QTableWidget 中的先前条目,而无需再次向网络服务器发送请求以获取内容。
缓存数据以在 QTableView/QTableWidget 中显示的最佳方式是什么?
1) 使用QTableView 并动态创建QAbstractTableModel,然后将QAbstractTableModels 保存在一个数组中。因此,每次用户更改列表框中的项目时,我都会在相关的 TableModel 项目上调用 setModel。可能吗?如果有怎么办?
2) 使用 QTableWidget,然后使用 hashmap 之类的东西来存储每个列表框选择的所有数据,然后当用户在项目之间切换时,清除 QTableWidget 并循环遍历地图并每次添加项目?
在Qt model/view 框架中我们可以使用多态性。这是什么意思?我们可以轻松地使用一些容器来存储指向基 class(在我们的例子中是 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));
}
我正在编写一个应用程序来读取和显示来自 QTableView/QTableWidget 中网络服务器的数据。 每个条目将有多个列和 SetData 以在每个条目 (QVariant) 中保存隐藏信息(来自 UI)。
要点是,QTableView/QTableWidget 的内容会根据用户从 ListBox 中选择的内容而变化,因此每次 ListBox 的选择发生变化时,QTableView/QTableWidget 中的所有条目都将被清除并显示与其相关的项目.
我想缓存用户单击的列表框项目的所有条目,因此如果用户 return 回到同一项目,只需显示 QTableView/QTableWidget 中的先前条目,而无需再次向网络服务器发送请求以获取内容。
缓存数据以在 QTableView/QTableWidget 中显示的最佳方式是什么?
1) 使用QTableView 并动态创建QAbstractTableModel,然后将QAbstractTableModels 保存在一个数组中。因此,每次用户更改列表框中的项目时,我都会在相关的 TableModel 项目上调用 setModel。可能吗?如果有怎么办?
2) 使用 QTableWidget,然后使用 hashmap 之类的东西来存储每个列表框选择的所有数据,然后当用户在项目之间切换时,清除 QTableWidget 并循环遍历地图并每次添加项目?
在Qt model/view 框架中我们可以使用多态性。这是什么意思?我们可以轻松地使用一些容器来存储指向基 class(在我们的例子中是 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));
}