Sembunyikan item QFileSystemModel/QTreeView melalui indeks menggunakan aturan tertentu

Saya menampilkan konten folder di program Qt saya menggunakan QTreeView + QFileSystemModel.

Sekarang saya ingin menyembunyikan item tertentu dari tampilan itu. Aturan tampilan tidak didasarkan pada nama file, jadi saya tidak bisa menggunakan setNameFilters(). Apa yang saya miliki adalah daftar sederhana QModelIndex yang berisi semua item yang ingin saya sembunyikan. Apakah ada cara memfilter tampilan hanya dengan menggunakan daftar ini?

Dalam penelitian saya, saya menemukan kelas QSortFilterProxyModel, tetapi saya tidak tahu cara menggunakannya untuk mencapai apa yang saya inginkan. Bantuan apa pun akan dihargai.


person Pericles Carvalho    schedule 07.04.2019    source sumber


Jawaban (1)


Subkelas QSortFilterProxyModel dan ganti metode filterAcceptsRow untuk menyetel logika filter.

Misalnya, untuk memfilter izin tulis pengguna saat ini :

class PermissionsFilterProxy: public QSortFilterProxyModel
{
public:
    PermissionsFilterProxy(QObject* parent=nullptr): QSortFilterProxyModel(parent)
    {}

    bool filterAcceptsRow(int sourceRow,
            const QModelIndex &sourceParent) const
    {
        QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
        QFileDevice::Permissions permissions = static_cast<QFileDevice::Permissions>(index.data(QFileSystemModel::FilePermissions).toInt());
        return permissions.testFlag(QFileDevice::WriteUser); // Ok if user can write
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QFileSystemModel* model = new QFileSystemModel();
    model->setRootPath(".");

    QTreeView* view = new QTreeView();
    PermissionsFilterProxy* proxy = new PermissionsFilterProxy();
    proxy->setSourceModel(model);
    view->setModel(proxy);
    view->show();
    return app.exec();
}
person Dimitry Ernot    schedule 07.04.2019
comment
Terima kasih banyak! Ini berfungsi, tetapi filter tidak diperbarui setiap kali saya mengubah kondisi. Dalam kasus saya, item yang seharusnya disembunyikan disimpan dalam daftar. Tahukah Anda bagaimana cara memperbarui filter secara otomatis ketika saya memperbarui daftar? - person Pericles Carvalho; 08.04.2019
comment
Lupakan saja, aku baru tahu. Saya hanya perlu memancarkan sourceModel()-›dataChanged() saat mengubah kondisi. Sekali lagi, terimakasih banyak! - person Pericles Carvalho; 08.04.2019
comment
Anda juga dapat menghubungi QSortFilterProxyModel::invalidateFilter() bila ingin mengubah parameter filter. - person Dimitry Ernot; 08.04.2019