Qt QSortFilterProxyModel с пользовательским TreeModel - PullRequest
0 голосов
/ 24 декабря 2018

я улучшил эту редактируемую модель дерева из Qt: редактируемая модель дерева

Все работает нормально, как и ожидалось, тогда я изменил его для своих особых нужд, и там я не храню строки,Я храню сертификаты X509 и некоторые общие данные о нем, такие как эмитент и тема.Моя структура дерева выглядит так:

Subject, Issuer, Valid Till, Certificate Data

Обратите внимание, что данные сертификата не отображаются в виде дерева, только три других поля.Это работает, и поэтому мое древовидное представление может выглядеть так, если есть сертификаты, которые подписаны другим сертификатом:

- Certificate A
    - Certificate B (which was signed by A)
    - Certificate C (which wassigned by B)
- Certificate D
- Certificate E

Итак, я реализовал прослушиватель двойного щелчка, который возвращает данные сертификата (поле 4), чтоотлично работает.

Теперь я хочу сделать сортировку по дереву.Поэтому я хочу использовать QSortFilterProxyModel.Это правильный путь?Или есть другое / лучшее решение?

Итак, я попробовал следующее и настроил свою модель и QSortFilterProxyModel следующим образом:

QVector<X509*> certificates getCertificates(storeName);
m_model = new TreeModel(certificates);
m_proxy = new QSortFilterProxyModel;
m_proxy->setSourceModel(m_model);
ui->treeView->setModel(m_proxy);
ui->treeView->expandAll();

И затем внутри слушателя двойного щелчка я вызываю это:

QVariant data = m_proxy->data(m_proxy->index(index.row(), 4));

Это работает не правильно, потому что когда я нажимаю на Сертификат B или Сертификат C, я каждый раз получаю данные Сертификата, который хранится в Сертификате А. Но мне нужно получить данные, которые хранятся вправильная запись (строка).Где моя проблема?

1 Ответ

0 голосов
/ 24 декабря 2018

Согласно комментарию Саймонса, решение проблемы - передать родительский индекс (древовидную структуру), чтобы мой код выглядел так:

 QVariant data = m_proxy->data(m_proxy->index(index.row(), 4, index.parent()));
...