バックグラウンドスレッドでQFileSystemModelのカスタムアイコンを作成する方法

ミカリス

いくつかのカスタムデザインファイル用にqtでファイルブラウザを作成しています。プレビューをサムネイルとしてロードしたいのでQIconProvider、アイコンに戻すために使用していQFileSystemModelます。

問題は、作成するアルゴリズムにQIconいくつかのリソースが必要であり、その結果、すべてのサムネイルの読み込みが完了するまでアプリケーションが応答しないことです。

QIconProviderアプリケーションをレスポンシブにするために、バックグラウンドスレッドに自分を置く方法があるかどうか疑問に思っています。

アンスランダーモニカ

残念ながら、QFileIconProviderAPIとモデルAPIの間にはインピーダンスの不一致があります。はQFileSystemModel、状況が変化したときにビューに非同期通知を提供しますが、アイコンプロバイダーは、アイコンが変更されたとき、または認識されたときにモデルに非同期的に通知することはできません。

ファイルシステムモデルとビューの間にIDプロキシをインストールできます。そのプロキシのdataメソッドは、アイコンを非同期的にクエリします。その場合、モデルの同期アイコンプロバイダーは未使用で不要です。

// https://github.com/KubaO/stackoverflown/tree/master/questions/icon-proxy-39144638
#include <QtWidgets>
#include <QtConcurrent>

/// A thread-safe function that returns an icon for an item with a given path.
/// If the icon is not known, a null icon is returned.
QIcon getIcon(const QString & path);

class IconProxy : public QIdentityProxyModel {
    Q_OBJECT
    QMap<QString, QIcon> m_icons;
    Q_SIGNAL void hasIcon(const QString&, const QIcon&, const QPersistentModelIndex& index) const;
    void onIcon(const QString& path, const QIcon& icon, const QPersistentModelIndex& index) {
        m_icons.insert(path, icon);
        emit dataChanged(index, index, QVector<int>{QFileSystemModel::FileIconRole});
    }
public:
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const override {
        if (role == QFileSystemModel::FileIconRole) {
            auto path = index.data(QFileSystemModel::FilePathRole).toString();
            auto it = m_icons.find(path);
            if (it != m_icons.end()) {
                if (! it->isNull()) return *it;
                return QIdentityProxyModel::data(index, role);
            }
            QPersistentModelIndex pIndex{index};
            QtConcurrent::run([this,path,pIndex]{
                emit hasIcon(path, getIcon(path), pIndex);
            });
            return QVariant{};
        }
        return QIdentityProxyModel::data(index, role);
    }
    IconProxy(QObject * parent = nullptr) : QIdentityProxyModel{parent} {
        connect(this, &IconProxy::hasIcon, this, &IconProxy::onIcon);
    }
};

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

クロス スレッド アクセス例外をスローするウィンドウ クロムを使用したカスタム ウィンドウ スタイルのバックグラウンド STA スレッド

分類Dev

プロットグラフでカスタムモードバーボタンアイコンを作成する

分類Dev

ストライプカスタムチェックアウトトークンをフラスコバックエンドにPOSTする方法

分類Dev

プラグインなしのカスタムワードプレステーマにアイコン付きの検索ボックスを追加する方法

分類Dev

タイムアウトを与えるワードプレスプラグインをデバッグする方法

分類Dev

バックグラウンドタスクでPathGeometryを作成する方法

分類Dev

PSPDFKitチェックの使用方法はバックグラウンドスレッドでメインスレッドコードを使用しますか?

分類Dev

バックグラウンドスレッドからコレクション内のアイテムプロパティを更新するときの例外

分類Dev

バックグラウンドスレッドをブロックしながら、バックグラウンドスレッドのメインスレッドでコードを実行する

分類Dev

jsf Webサイトのバックグラウンドでスレッドを実行する方法は?

分類Dev

ウィンドウスプレッドのような小さなタスクのカスタムインジケーターを作成する方法は?

分類Dev

シリアルバックグラウンドスレッドを作成および管理する方法

分類Dev

woocommerceチェックアウトでカスタム支払いプラグインのカスタムjsコードを実行します

分類Dev

バックグラウンドスレッドvb.netからランタイムWebブラウザコントロールを操作する

分類Dev

Pythonでバックグラウンドスレッドを停止する方法

分類Dev

asycioバックグラウンドスレッドでaiohttpを使用する方法

分類Dev

バックグラウンドタスクからメインアプリで関数を実行する方法

分類Dev

Windowsのバックグラウンドでタスクを実行する方法

分類Dev

ノックアウトカスタムバインディングハンドラー:$ rootは未定義です

分類Dev

ユーザーがアプリを非表示にするかデバイスの電源を切ると、swiftuiのカスタムタイマーがバックグラウンドフェッチでカウントを停止します

分類Dev

バックグラウンドタスクからコレクションを作成する

分類Dev

jQueryextendメソッドを使用して要素またはクラスセレクターのカスタムプラグインを作成する方法

分類Dev

PyCharmでデバッグするときにカスタムコマンドでファイルにプレフィックスを付ける方法は?

分類Dev

PyCharmでデバッグするときにカスタムコマンドでファイルにプレフィックスを付ける方法は?

分類Dev

DispatchQueueの使用中にSwiftでメインスレッドから実行中のバックグラウンドスレッドの実行を停止する方法

分類Dev

バックグラウンドスレッドからメインスレッドでUIViewを初期化する

分類Dev

IntelliJプラグインでバックグラウンドタスクを作成する

分類Dev

NSFetchedResultsControllerとバックグラウンドスレッドのコアデータ

分類Dev

バックグラウンドプロセスandroidのカスタムROMで中国のデバイスを管理する

Related 関連記事

  1. 1

    クロス スレッド アクセス例外をスローするウィンドウ クロムを使用したカスタム ウィンドウ スタイルのバックグラウンド STA スレッド

  2. 2

    プロットグラフでカスタムモードバーボタンアイコンを作成する

  3. 3

    ストライプカスタムチェックアウトトークンをフラスコバックエンドにPOSTする方法

  4. 4

    プラグインなしのカスタムワードプレステーマにアイコン付きの検索ボックスを追加する方法

  5. 5

    タイムアウトを与えるワードプレスプラグインをデバッグする方法

  6. 6

    バックグラウンドタスクでPathGeometryを作成する方法

  7. 7

    PSPDFKitチェックの使用方法はバックグラウンドスレッドでメインスレッドコードを使用しますか?

  8. 8

    バックグラウンドスレッドからコレクション内のアイテムプロパティを更新するときの例外

  9. 9

    バックグラウンドスレッドをブロックしながら、バックグラウンドスレッドのメインスレッドでコードを実行する

  10. 10

    jsf Webサイトのバックグラウンドでスレッドを実行する方法は?

  11. 11

    ウィンドウスプレッドのような小さなタスクのカスタムインジケーターを作成する方法は?

  12. 12

    シリアルバックグラウンドスレッドを作成および管理する方法

  13. 13

    woocommerceチェックアウトでカスタム支払いプラグインのカスタムjsコードを実行します

  14. 14

    バックグラウンドスレッドvb.netからランタイムWebブラウザコントロールを操作する

  15. 15

    Pythonでバックグラウンドスレッドを停止する方法

  16. 16

    asycioバックグラウンドスレッドでaiohttpを使用する方法

  17. 17

    バックグラウンドタスクからメインアプリで関数を実行する方法

  18. 18

    Windowsのバックグラウンドでタスクを実行する方法

  19. 19

    ノックアウトカスタムバインディングハンドラー:$ rootは未定義です

  20. 20

    ユーザーがアプリを非表示にするかデバイスの電源を切ると、swiftuiのカスタムタイマーがバックグラウンドフェッチでカウントを停止します

  21. 21

    バックグラウンドタスクからコレクションを作成する

  22. 22

    jQueryextendメソッドを使用して要素またはクラスセレクターのカスタムプラグインを作成する方法

  23. 23

    PyCharmでデバッグするときにカスタムコマンドでファイルにプレフィックスを付ける方法は?

  24. 24

    PyCharmでデバッグするときにカスタムコマンドでファイルにプレフィックスを付ける方法は?

  25. 25

    DispatchQueueの使用中にSwiftでメインスレッドから実行中のバックグラウンドスレッドの実行を停止する方法

  26. 26

    バックグラウンドスレッドからメインスレッドでUIViewを初期化する

  27. 27

    IntelliJプラグインでバックグラウンドタスクを作成する

  28. 28

    NSFetchedResultsControllerとバックグラウンドスレッドのコアデータ

  29. 29

    バックグラウンドプロセスandroidのカスタムROMで中国のデバイスを管理する

ホットタグ

アーカイブ