QTreeView状态的保存与恢复

一、某些情况下,我们需要保存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");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值