Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QML仪表未从Python更新_Python_Qml_Pyside2 - Fatal编程技术网

QML仪表未从Python更新

QML仪表未从Python更新,python,qml,pyside2,Python,Qml,Pyside2,我仍在努力解决QT。。。我制作了一个python文件和一个QML文件。Python文件根据通过UDP获取的数据更新仪表值 但这只起作用一次。。。第一个UDP数据包进入并更新量表,但当它获得下一个数据包时,尽管值在更新,量表本身却不会 QML Python: def configureApplication(): # Set up the application window app = QGuiApplication(sys.argv) view = QQuickVie

我仍在努力解决QT。。。我制作了一个python文件和一个QML文件。Python文件根据通过UDP获取的数据更新仪表值

但这只起作用一次。。。第一个UDP数据包进入并更新量表,但当它获得下一个数据包时,尽管值在更新,量表本身却不会

QML

Python:

def configureApplication():

    # Set up the application window
    app = QGuiApplication(sys.argv)
    view = QQuickView()
    view.setResizeMode(QQuickView.SizeRootObjectToView)
    view.setTitle("my title")

    # Load the QML file
    qml_file = os.path.join(os.path.dirname(__file__), "maingui.qml")
    view.setSource(QUrl.fromLocalFile(os.path.abspath(qml_file)))

    # load the slots into the QML file
    view.rootContext().setContextProperty("itt1value", 0)


    t = threading.Thread(target=receivedata, args=(view,))
    t.start()

    # Show the window
    if view.status() == QQuickView.Error:
        sys.exit(-1)
    view.show()

    # execute and cleanup
    app.exec_()
    del view

在线程方法receivedata()中,我从UDP获取数据,对其进行处理,然后将其发送到仪表,如下所示:

view.rootContext().setContextProperty("itt1value", itt)
receivedata()中有一个包含上述详细信息的while循环,但仪表实际上只更新一次。如果我在QML文件中放入一条语句来显示ITT1值,它总是具有正确的值,那么我是否需要输入一种方法来检测该值的变化并重新绘制仪表

编辑:有人向我询问receivedata()的详细信息,因此我将其附在这里:

def receivedata(view):
    print("Starting UDP server...")
    UDP_IP = "192.168.0.14"
    UDP_PORT = 49000
    sock = socket.socket(socket.AF_INET,  # Internet
                         socket.SOCK_DGRAM)  # UDP
    sock.bind((UDP_IP, UDP_PORT))
    olditt = 0
    loopruns = 0 # for debugging

    while True:
        rawstring = sock.recv(1024)
        hexarray = []

        #lots of irrelevent formatting here, result is int(value)


        itt = float(hextoint(value, olditt))
        olditt = itt

        itt = format(itt, '.3f')

        current = str(loopruns) # for debugging
        view.setTitle(current) # for debugging
        view.rootContext().setContextProperty("itt1value", itt)
        loopruns = loopruns + 1
        print(itt)


您有以下错误:

  • 您不能直接从另一个线程修改GUI

  • 可以使用
    setContextProperty()
    再次导出值,除非重新加载QML,否则不会更改以前的值

  • 如果希望“itt”修改QML中的任何值,它必须是兼容的类型,在这种情况下,CircularGauge的值是“real”,因此python中支持的数据类型是float

考虑到上述情况,我创建了一个QObject,因为它可以通过信号通知更改,因为它是线程安全的,并使用连接导出QObject进行连接

main.py

导入操作系统
随机输入
导入系统
导入线程
导入时间
从PySide2.QtCore导入QObject、QUrl、Signal
从PySide2.QtGui导入qgui应用程序
从PySide2.QtQuick导入QQuickView
类连接(QObject):
titleChanged=Signal(str,arguments=[“title”])
valueChanged=信号(浮点,参数=[“值”])
def接收数据(接头):
#配置
循环运行=0
尽管如此:
#其他东西
睡眠时间(0.1)
itt=随机均匀(0.01200.0)
连接器.valueChanged.emit(itt)
connector.titleChanged.emit(str(loopruns))
循环运行次数+=1
def主(args):
app=qgui应用程序(args)
view=QQuickView(title=“我的标题”,resizeMode=QQuickView.SizerootObject视图)
连接器=连接()
connector.titleChanged.connect(view.setTitle)
view.rootContext().setContextProperty(“连接器”,连接器)
#加载QML文件
qml\u file=os.path.join(os.path.dirname(\uu file\uuuu),“maingui.qml”)
view.setSource(QUrl.fromLocalFile(os.path.abspath(qml_文件)))
#起始线程
threading.Thread(target=receivedata,args=(connector,).start()
#显示窗口
如果view.status()==QQuickView.Error:
返回-1
view.show()
#执行和清理
ret=app.exec
德尔维尤
回程网
如果名称=“\uuuuu main\uuuuuuuu”:
系统出口(主(系统argv))
maingui.qml

import QtQml 2.13
import QtQuick.Extras 1.4
import QtQuick.Controls.Styles 1.4

CircularGauge {
    id: circularGauge
    value: 100
    minimumValue: 0
    maximumValue: 1200
    tickmarksVisible: false
    style: CircularGaugeStyle {
        maximumValueAngle: 400
        minimumValueAngle: 90
    }

    Connections{
        target: connector
        onValueChanged: circularGauge.value = value
    }
}
import QtQml 2.13
import QtQuick.Extras 1.4
import QtQuick.Controls.Styles 1.4

CircularGauge {
    id: circularGauge
    value: 100
    minimumValue: 0
    maximumValue: 1200
    tickmarksVisible: false
    style: CircularGaugeStyle {
        maximumValueAngle: 400
        minimumValueAngle: 90
    }

    Connections{
        target: connector
        onValueChanged: circularGauge.value = value
    }
}