PyQt - modifier la valeur d'un widget QML
Bonjour,
J'ai un widget écrit en qml, et je voudrais modifier la valeur via python.
mon qml :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| import QtQuick 2.0
import QtQuick.Controls.Styles 1.4
import QtQuick.Extras 1.4
Rectangle {
width: 400
height: 400
CircularGauge {
property real gauge_value: 45
id: gauge
anchors.fill: parent
value: gauge_value
style: CircularGaugeStyle {
labelInset: outerRadius * 0.2
tickmarkLabel: null
tickmark: Text {
text: styleData.value
Text {
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.bottom
text: styleData.index
color: "blue"
}
}
minorTickmark: Text {
text: styleData.value
font.pixelSize: 8
Text {
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.bottom
text: styleData.index
font.pixelSize: 8
color: "blue"
}
}
}
Text {
id: indexText
text: "Major and minor indices"
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: valueText.top
color: "blue"
}
Text {
id: valueText
text: "Major and minor values"
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
}
}
} |
mon interface (générée par Qt designer, et ensuite je compile le .ui en .py) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| # -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ROVPilot.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(888, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.quickWidget = QtQuickWidgets.QQuickWidget(self.centralwidget)
self.quickWidget.setGeometry(QtCore.QRect(80, 70, 501, 471))
self.quickWidget.setResizeMode(QtQuickWidgets.QQuickWidget.SizeRootObjectToView)
self.quickWidget.setSource(QtCore.QUrl("gauge.qml"))
self.quickWidget.setObjectName("quickWidget")
self.quickWidget_2 = QtQuickWidgets.QQuickWidget(self.centralwidget)
self.quickWidget_2.setGeometry(QtCore.QRect(620, 80, 101, 371))
self.quickWidget_2.setResizeMode(QtQuickWidgets.QQuickWidget.SizeRootObjectToView)
self.quickWidget_2.setSource(QtCore.QUrl("gauge2.qml"))
self.quickWidget_2.setObjectName("quickWidget_2")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 888, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
from PyQt5 import QtQuickWidgets
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_()) |
Ensuite, je crée un fichier python pour gérer les événements :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from PyQt5 import QtCore, QtGui, QtWidgets
from ROVPilot import Ui_MainWindow #note the capitalization
from PyQt5.QtCore import QObject
class MainWindow (QtWidgets.QMainWindow):
def __init__ (self, parent = None):
super (MainWindow, self).__init__ ()
self.ui = Ui_MainWindow ()
self.ui.setupUi (self)
#------------do your custom stuff from here on-----------
gauge=self.findChild(QObject,'quickWidget')
gauge.setProperty('gauge_value',65) |
Et le script principal que je lance :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import sys
#from PyQt4 import QtGui
from PyQt5 import QtCore, QtGui, QtWidgets #works for pyqt5
from mainWindow import MainWindow
def main():
app = QtWidgets.QApplication (sys.argv) #works for pyqt5
#app = QtGui.QApplication (sys.argv) #works for pyqt4
m = MainWindow ()
m.show ()
sys.exit (app.exec_ () )
if __name__ == '__main__':
main () |
Mais mon widget ne se met pas à jour...
Qu'est ce que j'ai oublié? Est-ce la bonne méthode que j'utilise ?
Merci,
Nico