IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

Passer d'une page QML à une autre depuis Python


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2017
    Messages : 29
    Par défaut Passer d'une page QML à une autre depuis Python
    bonjour
    en faite je suis débutant en QML et PyQt, j'ai trouvé un souci de passé d'une page QML a une autre puis on utilisent QObject (property et setproperty).
    donc moi j'ai reussit a afficher la 2eme page QML puis quand j'utilise le setproperty j'aurai cette erreur: AttributError: 'NoneType' object has no attribute 'setProperty'.

    et voici mon code :

    Code : 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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
     
        import Classe
        import sys
        from PyQt5.QtWidgets import QApplication
        from PyQt5.QtQml import QQmlApplicationEngine
     
        from PyQt5.QtCore import QObject, pyqtSlot, QVariant
     
     
     
    # Classe servant dans l'interaction.
    class MainApp(QObject):
        def __init__(self, context, parent=None):
            super(MainApp, self).__init__()
            # Recherche d'un enfant appelé myButton dont le signal clicked sera connecté à la fonction test3
            self.win = parent
            self.win.findChild(QObject, "ObjClasse").clicked.connect(self.test3)
     
            self.ctx = context
     
        def test3(self):
     
     
     
            engine.load('Classe.qml')
     
            self.win.findChild(QObject, "labelCo").setProperty("text", "hello world")         ##l'erreur est ici
     
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        engine = QQmlApplicationEngine()
        ctx = engine.rootContext()
        engine.load('main.qml')
        win = engine.rootObjects()[0]
        py_mainapp = MainApp(ctx,win)
        ctx.setContextProperty("py_MainApp", py_mainapp)
        win.show()
        sys.exit(app.exec())

    si vous avez un petit exemple qui peux m'aidez merci de me le transférez

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    L'erreur signifie simplement que findChild() n'a pas trouvé le widget que tu cherches.

    Mais si tu connais le nom du widget, pourquoi diable utilises-tu findChild() ?

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2017
    Messages : 29
    Par défaut
    en faite ma deuxième page qml "Classe.qml" contient un champs de text, ce que je veux faire que quand je click sur le button de ma première page "main.qml" il y'aura la deuxième page qui apparaisse puis le champ de texte change, on ecrit "hello world".

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    La question n'est pas là, ce que je veux dire c'est que self.win.findChild(QObject, "labelCo") retourne None et non pas le widget que tu cherches.

    Est-ce bien le nom du QLabel ?

    Et, si tu connais le nom du widget, tu peux faire self.win.monWidget.setProperty(...) directement.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2017
    Messages : 29
    Par défaut
    non je connais pas le nom de widget
    voici mon code qml (main.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
     
    import QtQuick 2.5
    import QtQuick.Controls 1.4
     
    ApplicationWindow {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
     
        Button {
            id: button
            x: 241
            y: 203
            width: 158
            height: 75
            objectName: "ObjClasse"
            text: qsTr("Button")
        }
     
     
     
    }

    "classe.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
     
    import QtQuick 2.5
    import QtQuick.Controls 1.4
     
    ApplicationWindow {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
     
        Rectangle {
            id: rectangle
            x: 220
            y: 118
            width: 200
            height: 200
            color: "#d41414"
            border.color: "#361b1b"
        }
     
        Text {
            id: text1
            x: 102
            y: 28
            width: 76
            objectName: "labelCo"
            height: 14
            text: qsTr("hello")
            font.pixelSize: 12
        }
     
        Button {
            id: button
            x: 246
            y: 380
            width: 149
            objectName: "ok"
            height: 42
            text: qsTr("Button")
        }
     
    }

    j'ai essayé de crie une autre classe mais sa n'a pas marché, ce que j'ai compris peut-être que le parent de MainApp prend en considération que le main.qml et non pas la classe.qml

  6. #6
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    De toute manière self.win est l'instance du premier qml.

    Donc, en suivant ton code, j'essayerais plutôt ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        def test3(self):
            self.alt_win = engine.load('Classe.qml')
            self.alt_win.findChild(QObject, "labelCo").setProperty("text", "hello world")
    Et il suffit de faire engine.load(machin) pour qu'elle s'affiche ? Il ne manque pas un show() ou quelque chose de ce genre pour la deuxième page ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/08/2010, 14h02
  2. Réponses: 3
    Dernier message: 25/02/2008, 09h14
  3. afficher une page PHP dans une page PHP ?
    Par sirbaldur dans le forum Langage
    Réponses: 4
    Dernier message: 05/05/2006, 19h42
  4. diriger une page web vers une page php
    Par moonia dans le forum Langage
    Réponses: 7
    Dernier message: 11/04/2006, 11h41
  5. [XHTML11] Comment insérer une page externe dans une page ?
    Par Invité dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 17/03/2005, 19h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo