2012-04-20 19 views
2

私はしばらくの間これを苦労してきました。QFileSystemModelでメンバ関数をオーバーライド(再実装)する方法

QtのQFileSystemModelは、本当に悪いアイコンフェッチアルゴリズムのために数百のファイルをフェッチすると実際には遅いです。

アイコンを完全に無効にしたい。これは私が実行しようとしているコードである

class FileModel : public QFileSystemModel { 
    using QFileSystemModel::data; 
public: 
    QVariant QFileSystemModel::data(const QModelIndex &index, int role) const 
    { 
    // my own implementation here 
    } 
} 

それは

で失敗します。彼らは( http://qt.gitorious.org/qt/qt/blobs/4.7/src/gui/dialogs/qfilesystemmodel.cpp QFileSystemModelのソースはこちらです)仮想ではない QFileSystemModel::data方法でフェッチされます

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(); 
} 
}; 

しかし、このコードはコンパイルされません。これは、私はエラーを取得します

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

パラメータ、QFileIconProviderになりそうだ、:これは予想されたように、「アイコン・プロバイダー」を設定する方法があるよう 'const QFileSystemModelPrivate* QFileSystemModel::d_func() const' is private

+2

も一部を使用して入れていない、あなたの宣言からQFileSystemModel ::一部を除去を参照してください。ここには必要ない。 –

+0

'data'は仮想でなければならない。 'QFileSystemModel'は' QAbstractItemModel'から派生し、そのクラス 'data'は純粋仮想関数です。 http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#data –

+0

カミルの言葉を参照してください。 Moritz:基本が既に仮想関数、純粋関数、その他の関数を宣言している場合は、virtualキーワードは必要ありません。 –

答えて

5

は、ルックスあなたは(基本的には、ファイル名)QFileInfoからアイコンを取り出す方法で、自分自身のインスタンスを実装することができ、かなり単純なクラス:

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); 
    } 
}; 
+0

ありがとうございますが、動作しません。 QFileSystemModelは、QFileIconProviderを使用してフォルダと一般ファイルのアイコンを作成し、 'QFileSystemNode :: icon()'の呼び出しに失敗した場合にのみ使用します。QFileSystemNodeクラスが見つからなくても、QFileSystemModeクラスを変更するよりもずっと難しくなりました。 – Alex

+0

ソースを見て...ここで(あなたにとっては遅い) 'd-> icon'のパスを通ってプロバイダを呼び出さないという装飾的な役割を果たしているのですか?それとも別のものだと思いますか?これはオーバーライドしようとしているメソッドのソースにあります:http://qt.gitorious.org/qt/qt/blobs/4.8/src/gui/dialogs/qfilesystemmodel.cpp#line708 – HostileFork

+0

はい、d-> icon ()は 'QFileSystemNode :: icon'を呼び出し、これは約2ミリ秒かかる。 QIconはメインのUIスレッドでのみ使用できるので、5000ファイルを乗算するとUIのフリーズが10秒間発生します。 – Alex

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; 
} 

QFileSystemDialogdata()は純粋仮想であるQAbstractItemModelから派生しています。独自の実装でdata()をオーバーライドしなかった場合でも、前者を導入することはできませんでした。

http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#data

+0

あなたは正しい、それは仮想です。しかし、私はこのエラーが発生しています: '不完全な型の無効な使用 'const struct QFileSystemModelPrivate'' – Alex

+0

実際のコードを見ることができ、気にする必要がないように、あなたのクラスに完全なソースコードを投稿してみませんあなたが書いたものを読んでいますか? –

関連する問題