一、某些情况下,我们需要保存QTreeView的所有节点信息用以恢复原视图
1.节点信息保存
#include <QFile>
#include <QTextStream>
#include <QStandardItemModel>
#include <QTreeView>
#include <QModelIndex>
void saveTreeViewState(QTreeView *treeView, const QString &fileName)
{
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;
QTextStream out(&file);
// 保存展开的节点
QModelIndex rootIndex = treeView->rootIndex();
saveExpandedState(treeView, rootIndex, out);
// 保存选中的项
QItemSelectionModel *selectionModel = treeView->selectionModel();
QModelIndexList selectedIndexes = selectionModel->selectedIndexes();
foreach (const QModelIndex &index, selectedIndexes) {
out << index.row() << "," << index.column() << "\n";
}
file.close();
}
void saveExpandedState(QTreeView *treeView, const QModelIndex &parent, QTextStream &out)
{
QAbstractItemModel *model = treeView->model();
for (int row = 0; row < model->rowCount(parent); ++row) {
QModelIndex index = model->index(row, 0, parent);
if (treeView->isExpanded(index)) {
out << index.row() << "," << index.column() << "\n";
saveExpandedState(treeView, index, out);
}
}
}
2.节点信息恢复
#include <QFile>
#include <QTextStream>
#include <QStandardItemModel>
#include <QTreeView>
#include <QModelIndex>
void restoreTreeViewState(QTreeView *treeView, const QString &fileName)
{
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QTextStream in(&file);
// 恢复展开的节点
QModelIndex rootIndex = treeView->rootIndex();
restoreExpandedState(treeView, rootIndex, in);
// 恢复选中的项
QItemSelectionModel *selectionModel = treeView->selectionModel();
QItemSelection selection;
while (!in.atEnd()) {
QString line = in.readLine();
QStringList parts = line.split(",");
if (parts.size() == 2) {
int row = parts[0].toInt();
int column = parts[1].toInt();
QModelIndex index = treeView->model()->index(row, column, rootIndex);
selection.select(index, index);
}
}
selectionModel->select(selection, QItemSelectionModel::Select);
file.close();
}
void restoreExpandedState(QTreeView *treeView, const QModelIndex &parent, QTextStream &in)
{
QAbstractItemModel *model = treeView->model();
while (!in.atEnd()) {
QString line = in.readLine();
QStringList parts = line.split(",");
if (parts.size() == 2) {
int row = parts[0].toInt();
int column = parts[1].toInt();
QModelIndex index = model->index(row, column, parent);
treeView->setExpanded(index, true);
restoreExpandedState(treeView, index, in);
} else {
break; // 没有更多子节点
}
}
}
二、使用
void MainWindow::saveState()
{
saveTreeViewState(ui->treeView, "treeview_state.txt");
}
void MainWindow::restoreState()
{
restoreTreeViewState(ui->treeView, "treeview_state.txt");
}