2013-03-23 1 views
0

Я использую QML и PyQt. Я использую модель из Python и просматриваю ее в QML с делегатом.Загрузить изображения в другом потоке с прогрессом в 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() работает, интерфейс будет замерзать, поэтому мы никогда не будем это занят значок. Мне нужно включить значок занятости, выбрать изображение в другом потоке и отправить делегату сообщение LoadFinished, чтобы отключить значок занятости.

Но как мне связаться с делегатом вне делегата?

ответ

0

к сожалению, ваш код требует осложнений. QML работает в одном потоке, и любые вызовы в python являются синхронными и блокирующими. Ответ заключается в том, что ваш код python сначала создает новый поток. Затем выполните операцию выбора и открытия в этом новом потоке. Сложная часть - теперь вам нужно указать, когда вы будете заняты. Это достигается путем создания сигнала в вашем объекте mainWindow, который может быть запущен при завершении загрузки. Его тривиально оттуда, чтобы подключить обработчик сигнала, чтобы показать, что ваш загруженный значок остановлен.