2

私はしばらくこれに苦労してきました。

アイコンの取得アルゴリズムが非常に悪いため、 QtQFileSystemModelは数百のファイルを取得すると非常に遅くなります。

アイコンを完全に無効にしたい。それらはQFileSystemModel::data仮想ではないメソッドで取得されます (QFileSystemModel のソースはここから入手できます: 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

アップデート

私は関数をオーバーライドすることができました。これが私が今持っているものです:

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

4

2 に答える 2

5

「アイコンプロバイダー」を設定する方法があるため、これは予想されていたようです。

http://doc.qt.io/archives/qt-4.7/qfilesystemmodel.html#setIconProvider

パラメータaは、 (基本的にはファイル名)QFileIconProviderからアイコンをフェッチするメソッドを使用して、自分のインスタンスを実装できる非常に単純なクラスのように見えます。QFileInfo

http://doc.qt.io/archives/qt-4.7/qfileinfo.html

すべてに同じアイコンを返すだけのこれらの1つを実装できます。それでも問題が解決しない場合は、次のコンパイルで問題ありません... 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);
    }
};
于 2012-04-20T13:27:34.423 に答える
2

基本クラスの関数が仮想である場合、派生クラスでも仮想です。以下は「C」を出力します。

#include <iostream>

class A {
public:
  virtual void data() = 0;
};

class B: public A {
public:
  void data() { std::cout << "B\n"; }
};

class C: public B {
public:
  void data() { std::cout << "C\n"; }
};

int
main() {
  C c;
  A *a = &c;
  a->data();

  return 0;
}

QFileSystemDialogは純粋な仮想から派生しQAbstractItemModelます。独自の実装でdata()オーバーライドしないと、前者をインスタンス化することさえできませんでした。data()

http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#dataを参照してください

于 2012-04-20T14:25:00.370 に答える