具有自定义TreeModel的Qt QSortFilterProxyModel

时间:2018-12-24 11:57:13

标签: qt sorting tree treeview qtreeview

我从Qt:Editable TreeModel

中强加了这个可编辑TreeModel。

所有功能都按预期工作,然后我针对我的特殊需要对其进行了修改,并且我不存储字符串,而是存储X509证书以及它的一些常规数据,例如颁发者和主题。所以我的treeview结构看起来像这样:

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时,我每次都获得存储在证书A下的证书数据。但是我需要获取存储在正确条目(行)下的数据。我的问题在哪里?

1 个答案:

答案 0 :(得分:0)

根据Simons的评论,该问题的解决方案是传递父索引(树结构),以便我的代码看起来像这样:

 QVariant data = m_proxy->data(m_proxy->index(index.row(), 4, index.parent()));
相关问题