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

Qt Quick Discussion :

Interaction entre Combobox et le C++


Sujet :

Qt Quick

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
    Août 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Août 2015
    Messages : 15
    Par défaut Interaction entre Combobox et le C++
    Bonjour a tous,

    J'avance pas mal sur un projet QT/QML mais je bloque sur un truc qui pourtant me semble simple

    J'ai une interface en QM avec une combobox dedans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ComboBox{
                        id:comboFonction
                        currentIndex: 1
                        anchors.verticalCenter:parent.verticalCenter
                        anchors.left: parent.left
                        anchors.leftMargin: 10
                        model:cbItemsFonctions
                        onActivated: matrix.slot_bFonctionChange(currentIndex)
                   }//fin comboFonction
    J'utilise le signal onActivated pour remonter l'indice qui me sera utile dans partie C++.
    Dans mon slot qui réceptionne les données je veut enregistrer l'indice de la combobox dans une variable private de la classe
    Code qt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Matrix::slot_bFonctionChange(qint16 fonctionchoisie)
    {
        qDebug()<<"MATRIX: Fonction choisie ="<<fonctionchoisie;
        qint16 temp=fonctionchoisie;
        typeFonction= fonctionchoisie;
        qDebug()<<"MATRIX: Fonction choisie ="<<temp;
    }

    Mais a chaque fois que je fait
    Code qt : Sélectionner tout - Visualiser dans une fenêtre à part
    typeFonction= fonctionchoisie;

    Code qt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private:
        qint16 typeFonction;//contient l'indice de la de la fonction choisie dans la combobox
    Mon programme plante. Vous savez pourquoi ?



    Merci

  2. #2
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Par défaut
    Bonjour,

    Ce fonctionnement paraît très étrange. Utilisez-vous des threads qui pourrait accéder à la variable "typeFonction" ?

    A mon avis le problème doit venir d'ailleurs, une simple copie de variable ne devrait pas générer un tel crash. Y'a-t-il un message quelconque dans la sortie de Qt Creator (Application Output) ?

    Avez-vous essayé de lancer le projet en mode debug et de mettre un breakpoint dans la fonction slot_bFonctionChange() ? Cela pourrait aider à la compréhension du problème.

    Est-il possible de voir un peu plus de code ? main.cpp, classe Matrix, QML ?

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Août 2015
    Messages : 15
    Par défaut
    Bonjour,


    Non je n'ai aucun message dans la fenetre sortie de l'application a part :
    QML debugging is enabled. Only use this in a safe environment.
    MATRIX: Fonction choisie = 6
    MATRIX: Fonction choisie = 6
    Le programme s'est terminé subitement.
    C:\ProjetQt\build-MatrixAndroid-Desktop_Qt_5_7_0_MinGW_32bit-Debug\debug\MatrixAndroid.exe crashed.
    Lorsque je retire cette copie de variable le programme ne crash pas.

    Ci dessous le code de la classe Matrix:
    Code Qt : 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
    class Matrix : public QObject
    {
        Q_OBJECT
    public:
        explicit Matrix(QObject *parent = 0);
        void demande_connexion(QString IP,quint64 port);
     
     
    private:
        ClientTCP *clienttcp;
     
    private:
        qint16 typeFonction;//contient le btype de la fonction choisie dans la combobox
        qint16 couleur;//contient la couleur choisie
     
     
     
    signals:
        //signal envoyer a la classe ClientTCP pour se connecter au server
        void signal_demande_connexion(QString IP,quint64 port);
        //signal qui envoie a l'IU que le server c'est deconnecté
        void signal_disconnectedServer();
        //signal qui envoi a l'objet la demande de deconnexion du server
        void signal_demande_deconnexion();
        //signal qui envoi au server des données
        void signal_sendData(QByteArray data);
     
     
    public slots:
        //slot qui recoit la confirmation que ClientTCP est bien connecté au server
        void slot_connectedtoserver(bool resultatconnexion);
        //slot qui recoit l'information que le serveur c'est deconnecté
        void slot_deconnexiondeserver();
        //slot qui recoit un signal de l'interface pour faire la connexion au server
        void slot_demandeConnexion(QString IP,quint64 port);
        //slot qui recoit un signal de l'interface pour faire la deconnexion du server
        void slot_demandeDeconnexion();
        //slot qui recoit un signal de l'interface pour envoyer des données au server
        void slot_sendData(QByteArray data);
        //slot qui recoit un evenement quand l'utilisateur choisie un type de fonction
        void slot_bFonctionChange(qint16 fonctionchoisie);
        //slot qui recoit un evenement quand l'utilisateur choisie une couleur
        //void slot_couleurChange(qint64 couleurchoisie);
        //slot qui recoit l'ordre de lancer la mesure
        void slot_startmesure(QString fonctionchoisie, QString couleurchoisie);
    };
     
    #endif // MATRIX_H

    le main:
    Code qt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main(int argc, char *argv[])
    {
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
        QGuiApplication app(argc, argv);
        Matrix matrix;
     
        QQmlApplicationEngine engine;
        engine.rootContext()->setContextProperty("matrix",&matrix);
        engine.load(QUrl(QLatin1String("qrc:/main.qml")));
        engine.load(QUrl(QLatin1String("qrc:/TestPanel.qml")));
        engine.load(QUrl(QLatin1String("qrc:/Mesure.qml")));
        int a=app.exec();
        return a;
    }

    Le code QML est tres long, mais la partie que je traite :


    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
     ListModel{
            id:cbItemsFonctions
            ListElement { text: "Approche"}//0
            ListElement { text: "Threshold"}//1
            ListElement { text: "Approche"}//2
            ListElement { text: "RCL"}//3
            ListElement { text: "Rwy Edge"}//4
            ListElement { text: "TDZ"}//5
            ListElement { text: "Rwy End"}//6
            ListElement { text: "Twy 1"}//7
            ListElement { text: "Twy 2"}//8
            ListElement { text: "Twy 3"}//9
            ListElement { text: "Twy 4"}//10
     
        }
     
        ListModel{
             id:cbItemsCouleur
             ListElement { text: "White"}//0
             ListElement { text: "Red"}//1
             ListElement { text: "Green"}//2
             ListElement { text: "Yellow"}//3
        }
     
          Rectangle{
                id:rectmesure;
                anchors.top: rectairport.bottom
                anchors.topMargin: 10
                anchors.left: rectairport.left
                anchors.right: parent.right
                anchors.bottom: parent.bottom
                anchors.bottomMargin: 40
                anchors.rightMargin:  290
                color:"darkgrey"
     
                ColumnLayout{
                    id:layoutMesure
                    anchors.fill: parent
     
                    ComboBox{
                        id:comboFonction
                        currentIndex: 1
                        anchors.verticalCenter:parent.verticalCenter
                        anchors.left: parent.left
                        anchors.leftMargin: 10
                        model:cbItemsFonctions
                        onActivated: matrix.slot_bFonctionChange(currentIndex)
                   }//fin comboFonction
     
                   ComboBox{
                       id:comboCouleur
                       currentIndex: 1
                       anchors.verticalCenter: parent.verticalCenter
                       anchors.right: parent.right
                       anchors.rightMargin: 10
                       model:cbItemsCouleur
     
     
                   }//fincomboCouleur
                }
     
            }
    Avec un point df'arret dans le slot : slot_bFonctionChange je peut voir que c'est quand je copie qint16 fonctionchoisie dans qint16 typeFonction que ca deconne, ca ne le fait pas avec une variable créée dans le slot.

    J'ai essayé plusieur truc comme faire passer la variable en string pour la convertir etc mais rien n'y fait. je doit avoir un probleme dans ma logique quelque part ( ca fait longtemps que je n'avait pas de C++) mais je n'arrive pas a le voir.

    Merci de ton aide en tous cas !

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Par défaut
    Concernant QQmlApplicationEngine , je ne pense pas que l'on puisse appelé plusieurs fois "load()" d'affilé, normalement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));
    devrait suffire.

    Définition de la doc
    Loads the root QML file located at url. The object tree defined by the file is created immediately for local file urls. Remote urls are loaded asynchronously, listen to the objectCreated signal to determine when the object tree is ready.

    If an error occurs, error messages are printed with qWarning.
    Je suis un peu pressé mais je regarderai cela plus attentivement ce soir.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Août 2015
    Messages : 15
    Par défaut
    Un grand merci a toi !!!!!!!

    Cela a résolu le problème !!!
    j'ai juste laissé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));
    et hop plus de plantage. Le crash venais que du coup ma classe recevait le signal plein de fois ?

    En tous cas Un grand MERCI !!

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

Discussions similaires

  1. [XL-2003] Aide Interaction entre deux Combobox
    Par zouille dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/03/2011, 14h03
  2. [Language]Interaction entre class
    Par LordBob dans le forum Langage
    Réponses: 10
    Dernier message: 14/12/2005, 10h14
  3. interaction entre mon programme & openOffice
    Par artatum dans le forum C
    Réponses: 4
    Dernier message: 10/10/2005, 22h28
  4. [VB .Net][Forms] Interaction entre deux forms
    Par plasticgoat dans le forum Windows Forms
    Réponses: 7
    Dernier message: 24/08/2005, 13h14
  5. [Collaboration/Interaction] Peut-on schématiser une interaction entre un bouton de commande et un autre objet ?
    Par manel007 dans le forum Autres Diagrammes
    Réponses: 5
    Dernier message: 21/09/2004, 01h01

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