QML仪表未从Python更新
我仍在努力解决QT。。。我制作了一个python文件和一个QML文件。Python文件根据通过UDP获取的数据更新仪表值 但这只起作用一次。。。第一个UDP数据包进入并更新量表,但当它获得下一个数据包时,尽管值在更新,量表本身却不会 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
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
- 可以使用
再次导出值,除非重新加载QML,否则不会更改以前的值setContextProperty()
- 如果希望“itt”修改QML中的任何值,它必须是兼容的类型,在这种情况下,CircularGauge的值是“real”,因此python中支持的数据类型是float
导入操作系统
随机输入
导入系统
导入线程
导入时间
从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
}
}