FolderListModel は内部でスレッドを使っている

FolderListModel は Qt 4 の時代から実験的に使うことができる QtQuick のエレメントで、以下のように指定されたフォルダを走査してファイルの一覧を取ってくるのに使うことができる。

import QtQuick 2.0
import Qt.labs.folderlistmodel 1.0

ListView {
    width: 200; height: 400

    FolderListModel {
        id: folderModel
        nameFilters: ["*.qml"]
    }

    Component {
        id: fileDelegate
        Text { text: fileName }
    }

    model: folderModel
    delegate: fileDelegate
}

Silk の中で使えないか試してみたところ、デッドロック状態になって使うことができなかった。

FolderListModel の内部ではスレッドを使って非同期でファイルの一覧を取得しているので、取得の処理まで到達していないか、取得後にイベントループ経由で呼ばれるシグナル/スロットの接続がうまくいってないかだと思うけれど、詳細は追ってない。

QtQuick の場合はなるべく描画やアニメーションの処理を止めないように、こういう処理を別スレッドで行うのが正しいけれど、Silk の場合はなるべくイベントループを動かさないで一ミリ秒でも速く処理を完了させたいので、結局同じような API を持つエレメントを独自で作ることになるのかな。

余談だけど、Qt 5 では QThread のサブクラスを作るのは推奨されなくなった のだけど、FolderListModel の内部では思いっきりサブクラス作ってた

あわせて読みたい