qt - 如何恢复 QTreeView 最后展开的状态?

标签 qt qt4 qtreeview

我有:

  1. QTreeView 带有表数据的类
  2. 并连接QAbstractTableModel模型

问题:如何保存项目的展开状态?有人已经解决了吗?

PS:我知道,我可以自己完成这段代码,但我没有太多时间,这不是我们项目的主要问题,但我们仍然需要它,因为应用程序包含很多这样的代码表,每次扩展树项目都是令人烦恼的过程......

最佳答案

首先,感谢 Razi 提供的 persistentIndexListisExpanded 方式。

其次,这是对我有用的代码:-)

dialog.h文件:

class Dialog : public QDialog
{
    Q_OBJECT;

    TreeModel *model;
    TreeView *view;

public:
    Dialog(QWidget *parent = 0);
    ~Dialog(void);

    void reload(void);

protected:
    void createGUI(void);
    void closeEvent(QCloseEvent *);
    void saveState(void);
    void restoreState(void);
};

dialog.cpp文件:

Dialog::Dialog(QWidget *parent)
{
    createGUI();
    reload();
}

Dialog::~Dialog(void) {};

void Dialog::reload(void)
{
    restoreState();
}

void Dialog::createGUI(void)
{
    QFile file(":/Resources/default.txt");
    file.open(QIODevice::ReadOnly);
    model = new TreeModel(file.readAll());
    file.close();

    view = new TreeView(this);
    view->setModel(model);

    QVBoxLayout *mainVLayout = new QVBoxLayout;
    mainVLayout->addWidget(view);

    setLayout(mainVLayout);
}

void Dialog::closeEvent(QCloseEvent *event_)
{
    saveState();
}

void Dialog::saveState(void)
{
    QStringList List;

    // prepare list
    // PS: getPersistentIndexList() function is a simple `return this->persistentIndexList()` from TreeModel model class
    foreach (QModelIndex index, model->getPersistentIndexList())
    {
        if (view->isExpanded(index))
        {
            List << index.data(Qt::DisplayRole).toString();
        }
    }

    // save list
    QSettings settings("settings.ini", QSettings::IniFormat);
    settings.beginGroup("MainWindow");
    settings.setValue("ExpandedItems", QVariant::fromValue(List));
    settings.endGroup();
}

void Dialog::restoreState(void)
{
    QStringList List;

    // get list
    QSettings settings("settings.ini", QSettings::IniFormat);
    settings.beginGroup("MainWindow");
    List = settings.value("ExpandedItems").toStringList();
    settings.endGroup();

    foreach (QString item, List)
    {
        // search `item` text in model
        QModelIndexList Items = model->match(model->index(0, 0), Qt::DisplayRole, QVariant::fromValue(item));
        if (!Items.isEmpty())
        {
            // Information: with this code, expands ONLY first level in QTreeView
            view->setExpanded(Items.first(), true);
        }
    }
}

祝你有美好的一天!)

<小时/>

PS:此示例基于 C:\Qt\4.6.3\examples\itemviews\simpletreemodel 代码。

关于qt - 如何恢复 QTreeView 最后展开的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3253301/

相关文章:

c++ - QTreeView:如何中止选择更改

c++ - Qt 本地安全网络套接字

qt - 将 QDialog 嵌入到 QWidget 中的简单方法

c++ - 调用子类 QWidget 的方法

qt - 为什么 qSort() 不起作用?

c++ - 在 QTreeview 特定单元格中添加 QCombobox

c++ - Model/View Qt文档中关于排序的描述可能有误?

c++ - QT画多条线

c++ - Qt文本浏览器不能实时显示

QtSql 多查询执行