我的构建方式有点像标准文件浏览器 - 左侧窗格用于文件夹树,右侧用于显示所选文件夹中的文件。
QTreeView with QFileSystemModel用于显示文件夹。模型的过滤器设置为QDir::Dirs | QDir::NoDotAndDotDot
,仅列出目录,没有文件。
我想只对包含子文件夹的文件夹显示扩展标记,i。即如果某个目录是空的或只包含文件,则它不应该是可扩展的。但相反,树视图会在空目录上保留扩展标记。这就是问题:如何隐藏它们?
我在谷歌搜索解决方案,在QT示例中搜索 - 没有成功。虽然我认为这个问题很容易回答。 我目前唯一的解决方案是继承QAbstractItemModel。这很痛苦。
QT 4.8,QT Creator,C ++。
以下代码演示:
#include <QApplication>
#include <QFileSystemModel>
#include <QTreeView>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTreeView w;
QFileSystemModel m;
m.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
m.setRootPath("C:\\");
w.setModel(&m);
w.setRootIndex(m.index(m.rootPath()));
w.hideColumn(3);
w.hideColumn(2);
w.hideColumn(1);
w.show();
return a.exec();
}
答案 0 :(得分:2)
我使用
解决了这个问题QFileSystemModel :: fetchMore
在当前级别的每个QModelIndex上。要知道文件夹是否已加载到模型中,您可以使用信号
void directoryLoaded(const QString&amp; path)
答案 1 :(得分:2)
最简单的方法:juste实现hasChildren:
/*!
* Returns true if parent has any children and haven't the Qt::ItemNeverHasChildren flag set;
* otherwise returns false.
*
*
* \remarks Reimplemented to avoid empty directories to be collapsables
* and to implement the \c Qt::ItemNeverHasChildren flag.
* \see rowCount()
* \see child()
*
*/
bool YourModelName::hasChildren(const QModelIndex &parent) const
{
// return false if item cant have children
if (parent.flags() & Qt::ItemNeverHasChildren) {
return false;
}
// return if at least one child exists
return QDirIterator(
filePath(parent),
filter() | QDir::NoDotAndDotDot,
QDirIterator::NoIteratorFlags
).hasNext();
}