gpt4 book ai didi

QTreeView 仅显示父目录,而不是父目录及其所有兄弟目录

转载 作者:行者123 更新时间:2023-12-04 13:32:21 26 4
gpt4 key购买 nike

我正在尝试让 QTreeView(使用底层 QFileSystemModel)显示目录树。如果我将 RootPath 设置为父目录,那么我会看到所有子目录,但看不到父目录。如果我将 RootPath 设置为父目录的父目录,那么我会看到父目录及其所有兄弟目录。有没有办法让它显示没有 sibling 的 parent 和所有 child ?

谢谢

最佳答案

这对我来说适用于 Linux。我并不是说它是最好的实现,我不确定使用反斜杠分隔符是否可以在 Windows 上运行。我知道 Qt 将它们转换为 native 分隔符,但我不知道它是否是来自模型的 data 方法的 native 分隔符。

#include <QApplication>
#include <QFileSystemModel>
#include <QSortFilterProxyModel>
#include <QTreeView>

class FilterModel : public QSortFilterProxyModel
{
public:
FilterModel( const QString& targetDir ) : dir( targetDir )
{
if ( !dir.endsWith( "/" ) )
{
dir += "/";
}
}

protected:
virtual bool filterAcceptsRow( int source_row
, const QModelIndex & source_parent ) const
{
QString path;
QModelIndex pathIndex = source_parent.child( source_row, 0 );
while ( pathIndex.parent().isValid() )
{
path = sourceModel()->data( pathIndex ).toString() + "/" + path;
pathIndex = pathIndex.parent();
}
// Get the leading "/" on Linux. Drive on Windows?
path = sourceModel()->data( pathIndex ).toString() + path;

// First test matches paths before we've reached the target directory.
// Second test matches paths after we've passed the target directory.
return dir.startsWith( path ) || path.startsWith( dir );
}

private:
QString dir;
};

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

const QString dir( "/home" );
const QString targetDir( dir + "/sample" );

QFileSystemModel*const model = new QFileSystemModel;
model->setRootPath( targetDir );

FilterModel*const filter = new FilterModel( targetDir );
filter->setSourceModel( model );

QTreeView*const tree = new QTreeView();
tree->setModel( filter );
tree->setRootIndex( filter->mapFromSource( model->index( dir ) ) );
tree->show();

return app.exec();
}

关于QTreeView 仅显示父目录,而不是父目录及其所有兄弟目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6496776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com