par , 02/01/2015 à 22h49 (1830 Affichages)
Il y a quelques mois j'ai rédigé un article présentant Qt Quick dans le but ensuite d'en présenter l'utilisation avec PyQt.
Par manque de temps je n'ai pas pu (pour l'instant) travailler sur les articles suivants.
Ayant du retravailler sur un petit projet, j'en profite pour donner un code exemple qui montre, dans les grandes lignes comment interagir entre un document QML et un script Python.
Si vous avez déjà utilisé Python et QML, les morceaux de codes proposés doivent être assez explicites. Dans le cas contraire je vous invite à consulter les cours que vous trouverez sur DVP et notamment mon introduction à Qt Quick
Code Python :
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
| #!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtCore import QObject, QUrl, pyqtSlot, QVariant
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQuick import QQuickView
from PyQt5.QtQml import QQmlApplicationEngine
class MainApp(QObject):
def __init__(self, parent=None):
super(MainApp, self).__init__(parent)
self.win = parent
self.win.findChild(QObject,"myButton").clicked.connect(self.test3)
@pyqtSlot(QVariant)
def test(self, ctx):
txt = "Test by contextProperty"
ctx.setContextProperty("retour", txt)
return 0
@pyqtSlot(result=QVariant)
def test2(self):
return 'Test by direct call'
def test3(self):
txt = self.win.findChild(QObject, "myTextField")
txt.setProperty("text", "Test by name")
return 0
if __name__ == "__main__":
app = QApplication(sys.argv)
engine = QQmlApplicationEngine()
ctx = engine.rootContext()
txt = "Test by ContextProperty"
ctx.setContextProperty("titreBtn", txt)
ctx.setContextProperty("ctx", ctx)
engine.load('gui.qml')
win = engine.rootObjects()[0]
_MainApp = MainApp(win)
ctx.setContextProperty("py_MainApp", _MainApp)
win.showMaximized()
sys.exit(app.exec_()) |
Code QML
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.1
ApplicationWindow {
title: qsTr("Test")
width: 640
height: 480
menuBar: MenuBar {
Menu {
title: qsTr("&File")
MenuItem {
text: qsTr("&Open")
onTriggered: messageDialog.show(qsTr("Open action triggered"));
}
MenuItem {
text: qsTr("E&xit")
onTriggered: Qt.quit();
}
}
}
GridLayout {
id : grid
columns : 6
columnSpacing: 5
anchors.fill: parent
anchors.margins: 10
RowLayout {
id : nav
Layout.fillWidth: true
Layout.columnSpan: grid.columns
TextField{
id : txt
objectName: "myTextField"
Layout.fillWidth: true
}
Button{
objectName: "myButton"
text : "Test byName"
}
Button{
text : titreBtn
onClicked: {
py_MainApp.test(ctx)
txt.text = retour
}
}
Button{
text : "Test de retour"
onClicked: txt.text = py_MainApp.test2()
}
}
TextArea{
id: result
Layout.fillWidth: true
Layout.fillHeight: true
Layout.columnSpan: grid.columns
}
}
MessageDialog {
id: messageDialog
title: qsTr("May I have your attention, please?")
function show(caption) {
messageDialog.text = caption;
messageDialog.open();
}
}
} |