在QML中通过另一个线程加载图像并显示进度
我在用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()
这个函数在运行的时候,界面会卡住,这样我们就看不到忙碌的图标。我需要在另一个线程中加载图片,这样才能显示忙碌的图标,并且在加载完成后发送一个信号LoadFinished
给委托,以便关闭忙碌的图标。
但是,我该如何在委托外部与委托进行沟通呢?
1 个回答
0
很遗憾,你的代码需要变得更复杂一些。QML是在一个线程中运行的,任何调用Python的操作都是同步的,也就是说它会阻塞其他操作。解决这个问题的方法是让你的Python代码先创建一个新的线程。然后在这个新线程中执行你的数据获取和打开操作。接下来比较棘手的是,你需要一种方法来告诉你的忙碌图标什么时候可以结束。这可以通过在你的mainWindow对象中创建一个信号来实现,当加载完成时就可以触发这个信号。从这里开始,连接一个信号处理器来告诉你的忙碌图标停止就简单多了。