HowTo восстанавливают QTreeView в последний раз расширенное состояние?

Что я имею:

  1. QTreeView класс с данными таблицы
  2. И соединенный QAbstractTableModel модель

Вопрос: как сохранить расширенное состояние объектов? Кто-то, закончили решения?

PS: Я знаю, что я могу сделать этот код один, но у меня нет большого количества времени, и это не основная проблема нашего проекта, но тем не менее нам нужен он, потому что приложение содержит много таких таблиц, и каждый раз, когда расширяющие элементы дерева раздражаются процесс...

18
задан Bill the Lizard 6 June 2011 в 12:59
поделиться

2 ответа

Во-первых, спасибо Рази за persistentIndexList и isExpanded путь.

Во-вторых, вот код, который у меня отлично работает: -)

файл 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 .

13
ответ дан 30 November 2019 в 07:33
поделиться

Эти две функции с использованием цикла должны сделать это за вас:

QModelIndexList QAbstractItemModel::persistentIndexList () const
bool isExpanded ( const QModelIndex & index ) const
7
ответ дан 30 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: