我已经为此苦苦挣扎了一段时间。
Qt's QFileSystemModel
由于图标获取算法非常糟糕,在获取数百个文件时速度非常慢。
我想完全禁用图标。它们被提取到QFileSystemModel::data
方法不是虚拟的(QFileSystemModel 的源代码可以在这里找到:http://qt.gitorious.org/qt/qt/blobs/4.7/src/gui/dialogs/qfilesystemmodel.cpp http://qt.gitorious.org/qt/qt/blobs/4.7/src/gui/dialogs/qfilesystemmodel.cpp)
这是我试图运行的代码:
class FileModel : public QFileSystemModel {
using QFileSystemModel::data;
public:
QVariant QFileSystemModel::data(const QModelIndex &index, int role) const
{
// my own implementation here
}
}
但它失败了
cannot define member function QFileSystemModel::data witin FileModel
UPDATE
我已经成功地重写了该函数,这就是我现在所拥有的:
class FileModel : public QFileSystemModel {
public:
QVariant data(const QModelIndex &index, int role) const
{
// Here goes Qt's implementation
Q_D(const QFileSystemModel);
if (!index.isValid() || index.model() != this)
return QVariant();
switch (role) {
case Qt::EditRole:
case Qt::DisplayRole:
switch (index.column()) {
case 0: return d->name(index);
case 1: return d->size(index);
case 2: return d->type(index);
case 3: return d->time(index);
default:
qWarning("data: invalid display value column %d", index.column());
break;
}
break;
case FilePathRole:
return filePath(index);
case FileNameRole:
return d->name(index);
case Qt::DecorationRole:
if (index.column() == 0) {
QIcon icon = d->icon(index); // This is the part I need to change
if (icon.isNull()) {
if (d->node(index)->isDir())
icon = d->fileInfoGatherer.iconProvider()->icon(QFileIconProvider::Folder);
else
icon = d->fileInfoGatherer.iconProvider()->icon(QFileIconProvider::File);
}
return icon;
}
break;
case Qt::TextAlignmentRole:
if (index.column() == 1)
return Qt::AlignRight;
break;
case FilePermissions:
int p = permissions(index);
return p;
}
return QVariant();
}
};
但是这段代码无法编译。这是我得到的错误:'const QFileSystemModelPrivate* QFileSystemModel::d_func() const' is private
看起来这是预料之中的,因为有一种设置“图标提供程序”的方法:
http://doc.qt.io/archives/qt-4.7/qfilesystemmodel.html#setIconProvider http://doc.qt.io/archives/qt-4.7/qfilesystemmodel.html#setIconProvider
参数,aQFileIconProvider
,看起来是一个相当简单的类,您可以实现自己的实例,并使用从QFileInfo
(基本上是文件名):
http://doc.qt.io/archives/qt-4.7/qfileinfo.html http://doc.qt.io/archives/qt-4.7/qfileinfo.html
您可以实现其中之一,只为所有内容返回相同的图标。如果您发现这不能解决您的问题,下面的编译对我来说很好......FWIW:
class FileModel : public QFileSystemModel {
public:
QVariant data(const QModelIndex &index, int role) const
{
if (role == Qt::DecorationRole) {
return QVariant (QIcon ());
}
return QFileSystemModel::data(index, role);
}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)