PyQt5 - 在 QML 中更新图像

Posted

技术标签:

【中文标题】PyQt5 - 在 QML 中更新图像【英文标题】:PyQt5 - Update an Image in QML 【发布时间】:2017-01-24 07:02:33 【问题描述】:

我一直在寻找一种方法来从我的 PyQt 代码更新我的 QML UI 上的图像。我能找到的最接近的答案来自 Grecko Update ImageView in QML

// Code from *** Link 
// MyImage.qml
    Image 
        cache: false
        function reload() 
            var tmpSource = source;
            source = "";
            source = tmpSource;
        
    

我想将该解决方案(或任何解决方案)应用于我的项目。下面是一些与我的实现类似的示例代码。

#test.py
    import sys
    from PyQt5.QtCore import QObject, QUrl
    from PyQt5.QtWidgets import QApplication
    from PyQt5.QtQuick import QQuickView
    from PyQt5.QtQml import QQmlApplicationEngine


    if __name__ == '__main__':
        myApp = QApplication(sys.argv)

        engine = QQmlApplicationEngine()
        context = engine.rootContext()
        context.setContextProperty("main", engine)

        engine.load('main.qml')

        win = engine.rootObjects()[0]
        image = win.findChild(QObject, "myimage")
        #What do with the image here?

        win.show()

        sys.exit(myApp.exec_())

这是 QML 代码。

//test.qml
Image 
        id: image1
        objectName: "myimage"
        x: 384
        y: 403
        width: 100
        height: 100
        source: ""
    

我对 PyQT5 和 QML 还很陌生,所以如果有人有一个基本示例来说明我如何实现它或可以编辑我的基本示例,我将不胜感激。

谢谢你:)

【问题讨论】:

【参考方案1】:

如果您想通过MyImage 类型重新加载所有图像,那么一种选择是使用setContextProperty() 机制来公开带有信号的Python 对象,并在MyImage.qml 中使用该信号来触发reload()函数。

在 Python 中:

reloader = ObjectWithAReloadSignal()
context.setContextProperty("_reloader", reloader);

MyImage.qml

Image 
    id: image

    void reload()  ... 

    Connections 
        target: _reloader
        onReloadImages: image.reload()
    

这里的假设是ObjectWithAReloadSignal 有一个名为reloadImages() 的信号,当 QML 应该触发重新加载时 ti 会发出该信号。

【讨论】:

以上是关于PyQt5 - 在 QML 中更新图像的主要内容,如果未能解决你的问题,请参考以下文章

源更改后 QML 图像未更新

使用更新功能扩展 QML 图像类型

用于更新属性的 QML 条件逻辑

按下鼠标时不会更新 QML 图像源

在 QQuickWidget 中更新/重绘仪表

PyQt5 如何在编译后更新资源文件?