Partage
  • Partager sur Facebook
  • Partager sur Twitter

Qt C++ | Fonctionnement anormal de SLOT

    8 avril 2019 à 14:49:35

    Bonjour, je viens vous voir aujourd'hui parce que certains des boutons de mon interface ont des comportements très étranges quand je clique dessus. Je n'ai jamais vu de bug du genre et j'ai rien trouvé sur internet je n'ai donc aucune idée pour fixer le soucis (pas très gênant en soit mais ça risque d'être assez étrange pour l'utilisateur après j'aimerais bien régler ça).

    Je vous met un screen de mon interface avec le bug visible (la case du QSoubleSpinButton ou autre qui devient bleue quand je clique sur certains boutons)

    Cette interface doit servir à contrôler les moteurs pas à pas d'un banc de test. Les 4 boutons du haut servent à définir comment on déplace la charge entrainée par un moteur quand on cliquera sur un des bouton "Avance" ou "Recul"

    Le problème c'est que quand je clique sur "Continue", alors la valeur du QDoubleSpinButton "Position Z" devient bleu, si je clique sur 1mm c'est le QLineEdit "Position Y" qui voit sa valeur surlignée en bleu, rien a déclarer quand je clique sur 0.1mm et enfin si je clique sur 0.01mm c'est le QDoubleSpinButton qui devient bleu … J'aimerais donc supprimer ces comportements non prévus 

    Le code complet étant assez long, vous met en dessous les fragments de code qui me semblent pertinents pour étudier mon cas à savoir des morceaux du constructeur de ma fenêtre et les slots des boutons incriminés. N'hésitez pas a m'en demander d'autres morceaux si cela vous semble nécessaire :)

    controlemoteur::controlemoteur(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::controlemoteur)
    {
        ui->setupUi(this);
        this->setWindowTitle("Setup calibration");
        this->setFixedSize(880,440);
    
        arduino = new QSerialPort;
    
        ui->layout_principal->setHorizontalSpacing(20);
    
        ui->layout_principal->setColumnMinimumWidth(2,111);
        ui->layout_principal->setColumnMinimumWidth(3,111);
    
        // Les 4 bouttons d'incréments en haut
        ui->inc_continu->setCheckable(true);
        ui->inc_1mm->setCheckable(true);
        ui->inc_0_1mm->setCheckable(true);
        ui->inc_0_01mm->setCheckable(true);
    
        //Les trois SpinButtons du bas
        ui->setPosX->setSingleStep(0.01);
        ui->setPosY->setSingleStep(0.01);
        ui->setPosZ->setSingleStep(0.01);
    
        //Les trois LineEdit de gauche
        ui->pos_x_display->setReadOnly(true);
        ui->pos_y_display->setReadOnly(true);
        ui->pos_z_display->setReadOnly(true);
    
    //Fonction connect des 4 boutons d'incrément
    connect(ui->inc_continu,SIGNAL(pressed()),this,SLOT(inc_continu_clicked()));
        connect(ui->inc_1mm,SIGNAL(pressed()),this,SLOT(inc_1mm_clicked()));
        connect(ui->inc_0_1mm,SIGNAL(pressed()),this,SLOT(inc_0_1mm_clicked()));
        connect(ui->inc_0_01mm,SIGNAL(pressed()),this,SLOT(inc_0_01mm_clicked()));
    }
    
    // Les slots des boutons
    
    void controlemoteur::inc_continu_clicked()
    {
        ui->inc_continu->setChecked(true);
        ui->inc_continu->setEnabled(false);
    
        ui->inc_1mm->setChecked(false);
        ui->inc_1mm->setEnabled(true);
        ui->inc_0_1mm->setChecked(false);
        ui->inc_0_1mm->setEnabled(true);
        ui->inc_0_01mm->setChecked(false);
        ui->inc_0_01mm->setEnabled(true);
    }
    
    void controlemoteur::inc_1mm_clicked()
    {
        ui->inc_1mm->setChecked(true);
        ui->inc_1mm->setEnabled(false);
    
        ui->inc_continu->setChecked(false);
        ui->inc_continu->setEnabled(true);
        ui->inc_0_1mm->setChecked(false);
        ui->inc_0_1mm->setEnabled(true);
        ui->inc_0_01mm->setChecked(false);
        ui->inc_0_01mm->setEnabled(true);
    }
    
    void controlemoteur::inc_0_1mm_clicked()
    {
        ui->inc_0_1mm->setChecked(true);
        ui->inc_0_1mm->setEnabled(false);
    
        ui->inc_1mm->setChecked(false);
        ui->inc_1mm->setEnabled(true);
        ui->inc_continu->setChecked(false);
        ui->inc_continu->setEnabled(true);
        ui->inc_0_01mm->setChecked(false);
        ui->inc_0_01mm->setEnabled(true);
    }
    
    
    void controlemoteur::inc_0_01mm_clicked()
    {
        ui->inc_0_01mm->setChecked(true);
        ui->inc_0_01mm->setEnabled(false);
    
        ui->inc_1mm->setChecked(false);
        ui->inc_1mm->setEnabled(true);
        ui->inc_0_1mm->setChecked(false);
        ui->inc_0_1mm->setEnabled(true);
        ui->inc_continu->setChecked(false);
        ui->inc_continu->setEnabled(true);
    }

    Et le fichier .h ci nécessaire

    #ifndef CONTROLEMOTEUR_H
    #define CONTROLEMOTEUR_H
    
    #include <QMainWindow>
    #include <QtSerialPort/QSerialPort>
    #include <QtSerialPort/QSerialPortInfo>
    #include <QDebug>
    #include <QMessageBox>
    
    
    namespace Ui {
    class controlemoteur;
    }
    
    class controlemoteur : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit controlemoteur(QWidget *parent = nullptr);
        ~controlemoteur();
    
    private:
        Ui::controlemoteur *ui;
    
        QSerialPort *arduino;
        static const quint16 arduino_due_vendor_id = 9025;
        static const quint16 arduino_due_product_id = 61;
        QString arduino_port_name;
        bool arduino_is_available = false;
    
    
    private slots:
    
        void advance_x_clicked();
        void advance_y_clicked();
        void advance_z_clicked();
    
        void advance_released();
    
        void reverse_x_clicked();
        void reverse_y_clicked();
        void reverse_z_clicked();
    
    
        void inc_continu_clicked();
        void inc_1mm_clicked();
        void inc_0_1mm_clicked();
        void inc_0_01mm_clicked();
    
        void enable_check_clicked();
    
        //void lecture_port();
    
        void report_status();
    
        void go_calibration();
    
        void go_reglage();
    
        void POM();
    };
    
    #endif // CONTROLEMOTEUR_H
    

    Merci a ceux qui prendront le temps de lire et de me répondre :)

    PS : J'ai oublié de préciser que je reprend le travail laissé par un stagiaire précédent. Il avait créer cette interface (sans les 3 SpinButtons du bas d'interface qui est ce que j'ai commencé a rajouter). Il avait tout codé sans passer par QtDesigner et il n'y avait pas ce problème quand on choisissait l'incrément. On m'a demandé de refaire ça un peu plus proprement en utilisant QtDesigner et c'est là que cette bizarrerie est apparue

    -
    Edité par ThibaultVnt 8 avril 2019 à 14:52:52

    • Partager sur Facebook
    • Partager sur Twitter
      8 avril 2019 à 15:55:24

      Bonjour

      si ça ne te dérange pas, pourrais-tu mettre sur OC le code complet ?

      J'aimerais l'exécuter avec tous ses fichiers, afin d'essayer de t'aider.

      Merci

      -
      Edité par pseudo-simple 8 avril 2019 à 16:31:55

      • Partager sur Facebook
      • Partager sur Twitter
        8 avril 2019 à 16:55:26

        Je suis pas sur de l'utilité de rendre des QPushButton checkable et d'appeler setChecked.

        Sinon d'après le code ça n'est pas censé toucher tes spin box. C'est une histoire de focus on dirait.

        • Partager sur Facebook
        • Partager sur Twitter
          9 avril 2019 à 8:50:59

          Bonjour et merci de votre réponse mais j'ai eu la chance de croisé hier soir mon collègue bon en Qt et il a pu m'aider !

          Pour te répondre Maluna, le stagiaire précédent avait fait des setChecked true ou false dans les slots car quand on clique sur les boutons Avancer ou Reculer de l'interface, on avait besoins de tester le quel des 4 boutons d'incrément était checked pour décider du comportement des moteurs.

          Mon collègue n'a pas compris pourquoi les clique de boutons faisaient ce comportement bizarre mais il m'a dit de mettre les 4 boutons dans un groupe de bouton ce qui leur donne le même comportement que ce qui est écrit dans mes 4 slots (j'ai pu complètement supprimé ces 4 slots du coup) et ça a réglé ces histoires de LineEdit et SpinBox qui devenaient bleu.

          En résumé on sait pas d'où venait ce problème mais la façon de procédée dans ces slots étaient de base un peu bizarre, un groupe de bouton était parfait pour l'utilisation voulue et ça a tout réglé !

          • Partager sur Facebook
          • Partager sur Twitter

          Qt C++ | Fonctionnement anormal de SLOT

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown