ซ่อนรายการของ QFileSystemModel/QTreeView ผ่านดัชนีโดยใช้กฎเฉพาะ

ฉันกำลังแสดงเนื้อหาของโฟลเดอร์ในโปรแกรม Qt ของฉันโดยใช้ QTreeView + QFileSystemModel

ตอนนี้ฉันต้องการซ่อนรายการเฉพาะของมุมมองนั้น กฎการแสดงผลไม่ได้ขึ้นอยู่กับชื่อไฟล์ ดังนั้นฉันจึงใช้ setNameFilters() ไม่ได้ สิ่งที่ฉันมีคือรายการง่ายๆ ของ QModelIndex ที่มีรายการทั้งหมดที่ฉันต้องการซ่อน มีวิธีกรองมุมมองโดยใช้เฉพาะรายการนี้หรือไม่?

ในการค้นคว้าของฉัน ฉันได้พบกับคลาส QSortFilterProxyModel แต่ไม่รู้ว่าจะใช้มันอย่างไรเพื่อให้บรรลุสิ่งที่ฉันต้องการ ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม


person Pericles Carvalho    schedule 07.04.2019    source แหล่งที่มา


คำตอบ (1)


คลาสย่อย QSortFilterProxyModel และแทนที่เมธอด filterAcceptsRow เพื่อตั้งค่าตรรกะตัวกรอง

ตัวอย่างเช่น หากต้องการกรองสิทธิ์ การเขียนของผู้ใช้ปัจจุบัน :

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
ขอบคุณมาก! ใช้งานได้ แต่ตัวกรองจะไม่อัปเดตทุกครั้งที่ฉันเปลี่ยนเงื่อนไข ในกรณีของฉัน รายการที่ควรจะซ่อนจะถูกจัดเก็บไว้ในรายการ คุณรู้หรือไม่ว่าฉันจะอัปเดตตัวกรองโดยอัตโนมัติได้อย่างไรเมื่อฉันอัปเดตรายการ - person Pericles Carvalho; 08.04.2019
comment
ลืมไปเลย ฉันเพิ่งเข้าใจ ฉันแค่ต้องปล่อย sourceModel()->dataChanged() เมื่อเปลี่ยนเงื่อนไข ขอบคุณมากอีกครั้ง! - person Pericles Carvalho; 08.04.2019
comment
คุณยังสามารถโทร QSortFilterProxyModel::invalidateFilter() เมื่อคุณต้องการเปลี่ยนพารามิเตอร์ตัวกรอง - person Dimitry Ernot; 08.04.2019