Voir le flux RSS

Jiyuu

Interaction en PyQt et un document QML

Noter ce billet
par , 02/01/2015 à 22h49 (1341 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 :
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code qml : Sélectionner tout - Visualiser dans une fenêtre à part
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();
        }
    }
}

Envoyer le billet « Interaction en PyQt et un document QML » dans le blog Viadeo Envoyer le billet « Interaction en PyQt et un document QML » dans le blog Twitter Envoyer le billet « Interaction en PyQt et un document QML » dans le blog Google Envoyer le billet « Interaction en PyQt et un document QML » dans le blog Facebook Envoyer le billet « Interaction en PyQt et un document QML » dans le blog Digg Envoyer le billet « Interaction en PyQt et un document QML » dans le blog Delicious Envoyer le billet « Interaction en PyQt et un document QML » dans le blog MySpace Envoyer le billet « Interaction en PyQt et un document QML » dans le blog Yahoo

Mis à jour 01/05/2019 à 21h41 par Jiyuu

Catégories
PyQt , Qt Quick - QML

Commentaires