在QML中通过另一个线程加载图像并显示进度

0 投票
1 回答
534 浏览
提问于 2025-04-17 20:04

我在用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对象中创建一个信号来实现,当加载完成时就可以触发这个信号。从这里开始,连接一个信号处理器来告诉你的忙碌图标停止就简单多了。

撰写回答