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

Discussion :

Problème lorsque je clique sur un bouton

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 532
    Par défaut Problème lorsque je clique sur un bouton
    Bonjour à toutes et à tous

    J'ai un problème que je n'arrive pas à comprendre avec mon programme Qt donc je sollicite votre aide.

    Je suis actuellement en train d'essayer de faire un programme pour la communication série. J'avais un programme à l'origine mais le programme ne fonctionne plus et je n'arrive pas à corriger les erreurs (je suis débutant en Qt). J'ai donc décidé de reprendre le programme en le modifiant et en le simplifiant pour l'utilisation que je souhaite avoir.

    J'ai fait mon interface comme je le voulais, pour l'instant aucun problème.
    J'ai créé un bouton 'DetectionPortCOM' où lorsqe l'on clique dessus une fenêtre apparaisse avec la liste des port disponible pour la communication série.
    Afin de ne pas trop me prendre la tête sur la syntaxe et le code à utiliser, j'ai simplement (et bêtement) fait un copier/coller depuis le fichier main du projet enumerator présent dans le dossier QSerialPort (un exemple trouvé à la suite de l'installation de Qt sur l'utilisation du port série). J'ai avant compiler le projet enumerator pour voir ce qu'il faisait et s'il fonctionnait et cela marche.

    Je pense (et je dis bien je pense) avoir bien déclarer ma fonction pour que lorsque l'on clique dessus la fenêtre apparaisse (j'ai aussi bien rajouter les include nécessaires) donc je lance la compilation, je n'ai aucune erreur et lorque ma fenêtre appairait et que je clique sur mon bouton, rien ne ce passe.

    Donc quel est mon problème.
    Pour vous aider à m'aider, je vous donne ci-dessous le code que j'ai actuellement

    mainwindow.h
    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
     
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
    #include <QtSerialPort/QSerialPort>
    #include <QtSerialPort/QSerialPortInfo>
    #include <QMessageBox>
    #include <QWidget>
    #include <QVBoxLayout>
    #include <QLabel>
     
    namespace Ui {
    class MainWindow;
    }
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        void on_pushButton_DetectionPortCOM_clicked();
     
    private:
        Ui::MainWindow *ui;
    };
     
    #endif // MAINWINDOW_H
    mainwindow.cpp
    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
     
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
     
    void MainWindow::on_pushButton_DetectionPortCOM_clicked()
    {
        QWidget w;
        w.setWindowTitle(QObject::tr("Info about all available serial ports."));
        QVBoxLayout *layout = new QVBoxLayout;
     
        foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
            QString s = QObject::tr("Port: ") + info.portName() + "\n"
                        + QObject::tr("Location: ") + info.systemLocation() + "\n"
                        + QObject::tr("Description: ") + info.description() + "\n"
                        + QObject::tr("Manufacturer: ") + info.manufacturer() + "\n"
                        + QObject::tr("Vendor Identifier: ") + (info.hasVendorIdentifier() ? QString::number(info.vendorIdentifier(), 16) : QString()) + "\n"
                        + QObject::tr("Product Identifier: ") + (info.hasProductIdentifier() ? QString::number(info.productIdentifier(), 16) : QString()) + "\n"
                        + QObject::tr("Busy: ") + (info.isBusy() ? QObject::tr("Yes") : QObject::tr("No")) + "\n";
     
            QLabel *label = new QLabel(s);
            layout->addWidget(label);
        }
     
        w.setLayout(layout);
        w.show();
    }
    mainwindow.ui
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
     
    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>628</width>
        <height>344</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralWidget">
       <widget class="QPushButton" name="pushButton_LireTrame">
        <property name="geometry">
         <rect>
          <x>30</x>
          <y>160</y>
          <width>75</width>
          <height>23</height>
         </rect>
        </property>
        <property name="text">
         <string>Lire Trame</string>
        </property>
       </widget>
       <widget class="QWidget" name="verticalLayoutWidget">
        <property name="geometry">
         <rect>
          <x>420</x>
          <y>10</y>
          <width>160</width>
          <height>231</height>
         </rect>
        </property>
        <layout class="QVBoxLayout" name="verticalLayout">
         <item>
          <widget class="QPushButton" name="pushButton_LED1">
           <property name="text">
            <string>LED1</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QPushButton" name="pushButton_LED2">
           <property name="text">
            <string>LED2</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QPushButton" name="pushButton_LED3">
           <property name="text">
            <string>LED3</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QPushButton" name="pushButton_LED4">
           <property name="text">
            <string>LED4</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QPushButton" name="pushButton_LED5">
           <property name="text">
            <string>LED5</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QPushButton" name="pushButton_LED6">
           <property name="text">
            <string>LED6</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QPushButton" name="pushButton_LED7">
           <property name="text">
            <string>LED7</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QPushButton" name="pushButton_LED8">
           <property name="text">
            <string>LED8</string>
           </property>
          </widget>
         </item>
        </layout>
       </widget>
       <widget class="QWidget" name="horizontalLayoutWidget">
        <property name="geometry">
         <rect>
          <x>30</x>
          <y>60</y>
          <width>342</width>
          <height>36</height>
         </rect>
        </property>
        <layout class="QHBoxLayout" name="horizontalLayout">
         <item>
          <widget class="QPushButton" name="pushButton_Connexion">
           <property name="text">
            <string>Connexion</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QPushButton" name="pushButton_DebutCommunication">
           <property name="text">
            <string>Démarrer communication</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QPushButton" name="pushButton_Quitter">
           <property name="text">
            <string>Quitter</string>
           </property>
          </widget>
         </item>
        </layout>
       </widget>
       <widget class="QLabel" name="label">
        <property name="geometry">
         <rect>
          <x>30</x>
          <y>100</y>
          <width>101</width>
          <height>41</height>
         </rect>
        </property>
        <property name="text">
         <string>TextLabel</string>
        </property>
       </widget>
       <widget class="QPushButton" name="pushButton_DetectionPortCOM">
        <property name="geometry">
         <rect>
          <x>30</x>
          <y>20</y>
          <width>111</width>
          <height>23</height>
         </rect>
        </property>
        <property name="text">
         <string>Detection PortCOM</string>
        </property>
       </widget>
      </widget>
      <widget class="QMenuBar" name="menuBar">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
         <width>628</width>
         <height>20</height>
        </rect>
       </property>
      </widget>
      <widget class="QToolBar" name="mainToolBar">
       <attribute name="toolBarArea">
        <enum>TopToolBarArea</enum>
       </attribute>
       <attribute name="toolBarBreak">
        <bool>false</bool>
       </attribute>
      </widget>
      <widget class="QStatusBar" name="statusBar"/>
     </widget>
     <layoutdefault spacing="6" margin="11"/>
     <resources/>
     <connections/>
    </ui>
    et le main.cpp (même si je ne pense pas qu'il soit nécessaire pour la résolution du problème)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include "mainwindow.h"
    #include <QApplication>
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
     
        return a.exec();
    }
    Dans l'attente de vos réponse,
    Cordialement,
    Clairetj

  2. #2
    Membre éclairé

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 532
    Par défaut
    J'ai résolu un premier problème celui de l'apparition de la fenêtre lorsque je clique sur mon bouton DetectionPortCOM: j'avais oublié déclarer en private slots

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
     
    private slots:
        void on_pushButton_DetectionPortCOM_clicked();
    Maintenant, deuxième problème: je vous la fenêtre s'ouvrir mais elle disparait aussitôt, comment faire pour la garder ouvert dans que je n'appuie pas sur le croix pour fermer ?

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 150
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    Pour garder la fenêtre, je vous conseille d'utiliser un pointeur pour votre QWidget. En effet, actuellement, la variable se fait détruire à la sortie de la fonction (car elle est locale à la fonction). Ce cas n'arriverait pas avec un pointeur.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre éclairé

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 532
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Pour garder la fenêtre, je vous conseille d'utiliser un pointeur pour votre QWidget. En effet, actuellement, la variable se fait détruire à la sortie de la fonction (car elle est locale à la fonction). Ce cas n'arriverait pas avec un pointeur.
    J'ai essayé avec un pointeur, j'ai modifié ma déclaration et les lignes qu'il fallait, je compile (aucune erreur) et je lance normalement mon appli mais lorsque j'appuie sur un bouton j'ai un gros problème qui apparait:

    une fenêtre nommée "Débogeur juste-à-temps Visual Studio" s'ouvert et me dit "une exception win32 non gérée s'est produite dans monprogramme.exe"

    Cette erreur, je l'ai déjà rencontré lorsque j'essayais (par erreur) de mettre des mots dans un int.

    Mais là je ne vois pas comment résoudre. Voici le code tel que je l'ai modifié

    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
     
    void MainWindow::on_pushButton_DetectionPortCOM_clicked()
    {
    /*==============================
    * Description : Fonction qui permet de savoir quel port peuvent être utiliser pour
    *               la communication serie, donne differentes informations
    *
    * Created     : 25/09/2013 - 16:30
    *
    * Notes       : Cette fonction (premiere partie) n'a pas été réalisé par moi, ceci est un simple
    *               copier/coller d'une fonction exemple que vous pourrez trouvez
    *               a cette adresse: C:\Qt\Qt5.1.1\5.1.1\mingw48_32\examples\serialport\enumerator
    *               (exemple pour l'utilisation de QSerialPort)
    *=============================*/
     
        //Premiere partie
        QWidget *FenetreDetectionPort;
        FenetreDetectionPort->setWindowTitle(QObject::tr("Info about all available serial ports."));
        QVBoxLayout *layout = new QVBoxLayout;
     
        foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
            QString s = QObject::tr("Port: ") + info.portName() + "\n"
                        + QObject::tr("Location: ") + info.systemLocation() + "\n"
                        + QObject::tr("Description: ") + info.description() + "\n"
                        + QObject::tr("Manufacturer: ") + info.manufacturer() + "\n"
                        + QObject::tr("Vendor Identifier: ") + (info.hasVendorIdentifier() ? QString::number(info.vendorIdentifier(), 16) : QString()) + "\n"
                        + QObject::tr("Product Identifier: ") + (info.hasProductIdentifier() ? QString::number(info.productIdentifier(), 16) : QString()) + "\n"
                        + QObject::tr("Busy: ") + (info.isBusy() ? QObject::tr("Yes") : QObject::tr("No")) + "\n";
     
            QLabel *label = new QLabel(s);
            layout->addWidget(label);
        }
     
        FenetreDetectionPort->setLayout(layout);
        FenetreDetectionPort->show();
    }

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu n'as pas initialisé ton pointeur, il pointe vers une zone mémoire non-allouée quelconque.
    QWidget *FenetreDetectionPort = new QWidget;.

    Remarque : tu n'as pas besoin de QObject:: devant tes tr(...) : ta classe hérite de QObject.

  6. #6
    Membre éclairé

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 532
    Par défaut
    ok merci beaucoup

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

Discussions similaires

  1. afficher une image lorsque je clique sur un bouton
    Par moithibault dans le forum Tkinter
    Réponses: 4
    Dernier message: 06/06/2010, 11h32
  2. Réponses: 0
    Dernier message: 15/09/2009, 18h46
  3. redirection lorsque je clique sur le bouton envoyer
    Par IVIedia dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 22/07/2009, 13h56
  4. Faire des liens lorsqu'on clique sur un bouton
    Par Antoinejdu44 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 14/11/2008, 20h06
  5. Réponses: 4
    Dernier message: 05/01/2008, 23h39

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