0

QML と PyQt を使用しています。Python のモデルを使用し、そのデータをデリゲートを使用して QML で表示します。

import QtQuick 1.0

Rectangle {
    id: container

    ListView {
        id: tweetListView
        anchors.fill: parent;
        clip: true
        model: mymodel
        delegate: TweetDelegate {
        //...
        }
}

QMLで画像を開く必要があるので、使用します

Image {
   //...
   source: url
   OnClicked: {
       busy_icon = true;
       // mainWindow is a Python object
       mainWindow.fetch_and_open(url);
       busy_icon = false;
   }
}

しかし、fetch_and_open()実行中は UI がフリーズするため、ビジー アイコンになることはありません。別のスレッドで画像を取得するには、ビジー アイコンをオンにし、デリゲートにシグナルを送信LoadFinishedしてビジー アイコンをオフにする必要があります。

しかし、デリゲートの外でデリゲートと通信するにはどうすればよいでしょうか。

4

1 に答える 1

0

残念ながら、コードをより複雑にする必要があります。QML は単一のスレッドで実行され、Python への呼び出しはすべて同期的でブロックされます。答えは、Python コードで最初に新しいスレッドを作成することです。次に、その新しいスレッド内でフェッチおよびオープン操作を実行します。ここで注意が必要なのは、busy_icon にいつ終了するかを伝える方法が必要なことです。これは、読み込みが完了したときに起動できる mainWindow オブジェクトでシグナルを作成することによって実現されます。そこから信号ハンドラーを接続して、忙しいアイコンに停止するように指示するのは簡単です。

于 2013-03-25T14:25:16.987 に答える