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 :

QMainwindow et membre QString

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Par défaut QMainwindow et membre QString
    Bonjour à tous,

    Je suis nouveau sur le forum et débutant en programmation Qt donc je viens vous solliciter pour un petit "bug" de mon programme.

    Je vous présente ce que je souhaite faire:
    -Une première QMainwindow (Mainwindow) qui fera office d'interface d'authentification composé de 2 QLineEdit (ID et MDP) + un QPushButton qui ouvrira une deuxième QMainwindow.
    -Cette deuxième QMainwindow (Backup) "stock" l'ID dans un membre QString. Et qui permettra à l'utilisateur de dire s'il est en ligne ou hors ligne (au lancement de l'application il sera par défaut en ligne).
    -L'état en ligne ou hors ligne correspondra au champs "isOnline" de ma BDD (1 en ligne, 0 hors ligne), j'utilise le QString User pour concaténer dans ma requête SQL.

    Voici le code de Mainwindow.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void MainWindow::on_pushButton_Backup_clicked()
    {
        if(Identification(ui->lineEdit_CUID->text(),ui->lineEdit_MDP->text()))  // Si l'identification a reussie
        {
            Backup* backup = new Backup();
            backup->User = ui->lineEdit_CUID->text().toUpper(); // on stock le CUID dans le membre "User" qui est une QString
            db.close();
            backup->show(); // On ouvre l'interface Backup
            close();
        }
        else ui->textEdit_Log->append("Erreur de login");
    }
    (je n'ai mis que la partie qui me semblait pertinente mais si besoin je mettrais le reste)

    Le code de backup.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
    31
    32
    33
    34
    35
    36
    37
    38
    #ifndef BACKUP_H
    #define BACKUP_H
     
    #include <QtSql\QSqlDatabase.h>
    #include <QSqlError>
    #include <QSqlQuery>
    #include <QTextEdit>
    #include <mypushbutton.h>
    #include <QMessageBox>
    #include <QTime>
    #include <QtNetwork>
     
    #include <QMainWindow>
     
    class MainWindow;
     
    namespace Ui {
    class Backup;
    }
     
    class Backup : public QMainWindow
    {
        Q_OBJECT
        MainWindow *Parent;
    public:
        explicit Backup(QWidget *parent = 0);
        ~Backup();
        QSqlDatabase db;
        QString User;
     
    private slots:
        void on_comboBox_currentIndexChanged(const QString &arg1);
     
    private:
        Ui::Backup *ui;
    };
     
    #endif // BACKUP_H
    Et le code de backup.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
    #include "backup.h"
    #include "ui_backup.h"
     
    #include "mainwindow.h"
     
    Backup::Backup(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::Backup)
    {
        Parent = (MainWindow*)parent;
        ui->setupUi(this);
     
        db = QSqlDatabase::addDatabase("QODBC","MaBD2");
        db.setDatabaseName("MaBD");
        db.open();
     
        QSqlQuery Query(db);
        if(Query.exec("UPDATE Utilisateurs SET isOnline = 1 WHERE CUID = '"+User+"';"))
            ui->textEdit_Log->append("<strong>"+QTime::currentTime().toString("hh:mm")+":</strong> Disponible");
    }
     
    Backup::~Backup()
    {
        db.close();
        delete ui;
    }
     
    void Backup::on_comboBox_currentIndexChanged(const QString &arg1)
    {
        // ui->textEdit_Log->append(User);
        QSqlQuery Query(db);
        if(arg1 == "Disponible")
            if(Query.exec("UPDATE Utilisateurs SET isOnline = 1 WHERE CUID = '"+User+"';"))
                ui->textEdit_Log->append("<strong>"+QTime::currentTime().toString("hh:mm")+":</strong> "+arg1);
        if(arg1 == "Indisponible")
            if(Query.exec("UPDATE Utilisateurs SET isOnline = 0 WHERE CUID = '"+User+"';"))
                ui->textEdit_Log->append("<strong>"+QTime::currentTime().toString("hh:mm")+":</strong> "+arg1);
    }
    (vu comme ça perso ça m'a l'air pas mal )

    Sauf que ça ne marche pas tout à fait!

    Le champs "isOnline" ne se met pas à 1 au démarrage, pourtant j'ai bien le message disponible dans TextEditLog (ce qui devrait dire que la requête a fonctionné?!).
    J'ai essayé d'entrer un ID "en dur" dans la première requête et la ça fonctionne. C'est ce qui me fait penser que c'est bien le membre QString User qui déconne.
    En le testant avec les méthodes .isEmpty() et .isNull() j'ai dans les deux cas TRUE! C'est possible ça?

    Sinon les requêtes qui sont dans le slot du QCombobox fonctionnent bien (et pourtant elles utilisent ce membre QString!).

    Bref du coup je sais plus trop quoi faire.
    J'espère que j'aurais été assez clair, merci d'avoir lu mon pavé et merci pour vos futures réponses.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Bonjour,

    Débutant en programmation objet tout court apparemment, pas qu'en Qt Je te conseille la lecture d'une introduction à l'objet et au C++ (parce que mettre des membres en publique ça me chiffonne).

    Sinon, ton problème est tout simple : le code dans le constructeur, il est exécuté quand ? Que vaut User à ce moment-là ? (tu l'as d'ailleurs vérifié).

    Réponses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        if(Identification(ui->lineEdit_CUID->text(),ui->lineEdit_MDP->text()))  // Si l'identification a reussie
        {
            Backup* backup = new Backup(); // => Constructeur appelé ici, User vaut QString::Null
            backup->User = ui->lineEdit_CUID->text().toUpper(); // on stock le CUID dans le membre "User" qui est une QString
            db.close();
            backup->show(); // On ouvre l'interface Backup
            close();
        }
    Concernant isNull/isEmpty, la doc est très claire dessus. Qt a une documentation exemplaire, très bien intégrée dans l'IDE Qt Creator (infobulle + F1), il faut en user et en abuser !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Par défaut
    Bonjour,

    Tout d'abord merci pour ta réponse et désolé si je remonte un peu le sujet qui date (j'ai eu de la lecture entre temps ^^).

    Je pense que la solution serait de passer par un constructeur paramétré alors?

    Voici ce que j'ai mis en place:

    Mainwindow.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void MainWindow::on_pushButton_Backup_clicked()
    {
        if(Identification(ui->lineEdit_CUID->text(),ui->lineEdit_MDP->text()))  // Si l'identification a reussie
        {
            Backup* backup = new Backup(0,ui->lineEdit_CUID->text().toUpper()); // On appelle le constructeur paramétré
            db.close();
            backup->show(); // On ouvre l'interface Backup
            close();
        }
        else ui->textEdit_Log->append("Erreur de login");
    }
    Backup.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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #ifndef BACKUP_H
    #define BACKUP_H
     
    #include <QtSql\QSqlDatabase.h>
    #include <QSqlError>
    #include <QSqlQuery>
    #include <QTextEdit>
    #include <mypushbutton.h>
    #include <QMessageBox>
    #include <QTime>
    #include <QtNetwork>
     
    #include <QMainWindow>
     
    class MainWindow;
     
    namespace Ui {
    class Backup;
    }
     
    class Backup : public QMainWindow
    {
        Q_OBJECT
        MainWindow *Parent;
     
    public:
        explicit Backup(QWidget *parent = 0);	// Le constructeur par défaut (j'ai pas bien compris le sens du "explicit"?)
        Backup(QWidget *parent = 0,QString Utilisateur = "");	// Le constructeur paramétré (pourquoi est ce que Qt m'oblige à avoir des paramètres par défaut?)
        ~Backup();
     
    	// Un getter et un setter pour le membre User
        QString GetUser() {return User;}
        void SetUser(QString Utilisateur) {Utilisateur = User;}
     
    // Les membres que j'ai défini moi même
    private:
        QString User;
        QSqlDatabase db;
     
    private slots:
        void on_comboBox_currentIndexChanged(const QString &arg1);
     
    private:
        Ui::Backup *ui;
    };
     
    #endif // BACKUP_H
    Backup.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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #include "backup.h"
    #include "ui_backup.h"
     
    #include "mainwindow.h"
     
    Backup::Backup(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::Backup)
    {
        Parent = (MainWindow*)parent;
        ui->setupUi(this);
     
        db = QSqlDatabase::addDatabase("QODBC","MaBD2");
        db.setDatabaseName("MaBD");
        db.open();
     
        QSqlQuery Query(db);
        if(Query.exec("UPDATE Utilisateurs SET isOnline = 1 WHERE CUID = '"+User+"';"))
            ui->textEdit_Log->append("<strong>"+QTime::currentTime().toString("hh:mm")+":</strong> Disponible");
    }
     
    // Ici le prototype du constructeur paramétré
    Backup::Backup(QWidget *parent, QString Utilisateur)
    {
        Parent = (MainWindow*)parent;
        ui->setupUi(this);
     
    	User = Utilisateur;
     
        db = QSqlDatabase::addDatabase("QODBC","MaBD2");
        db.setDatabaseName("MaBD");
        db.open();
     
        QSqlQuery Query(db);
        if(Query.exec("UPDATE Utilisateurs SET isOnline = 1 WHERE CUID = '"+User+"';"))
            ui->textEdit_Log->append("<strong>"+QTime::currentTime().toString("hh:mm")+":</strong> Disponible");
    }
     
    Backup::~Backup()
    {
        db.close();
        delete ui;
    }
     
    void Backup::on_comboBox_currentIndexChanged(const QString &arg1)
    {
        QSqlQuery Query(db);
        if(arg1 == "Disponible")
            if(Query.exec("UPDATE Utilisateurs SET isOnline = 1 WHERE CUID = '"+User+"';"))
                ui->textEdit_Log->append("<strong>"+QTime::currentTime().toString("hh:mm")+":</strong> "+arg1);
        if(arg1 == "Indisponible")
            if(Query.exec("UPDATE Utilisateurs SET isOnline = 0 WHERE CUID = '"+User+"';"))
                ui->textEdit_Log->append("<strong>"+QTime::currentTime().toString("hh:mm")+":</strong> "+arg1);
    }
    Le problème c'est que le programme "plante" à l'ouverture de la fenêtre backup ("ne répond pas...").

    Autre question, si les membres sont protected rien ne m’empêche de les utiliser "normalement" dans le .cpp n'est ce pas? Les getter/setter ne seront utiles qu'aux classes extérieures?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    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 129
    Billets dans le blog
    149
    Par défaut
    Les membres protected ne sont accessibles que dans les fonctions de la classe qui implémente les membres et dans les enfants (héritage).

    Pour le bogue, avez vous essayé de lancer le programme dans un débogueur ? Pour voir où il crashait ?
    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.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Par défaut
    Voici ce que j'obtiens au moment du crash en debuggage:
    http://img15.hostingpics.net/pics/70...pturedebug.png

    le fichier ui_backup.h n'est pas un fichier que je connais mais apparemment le problème se situerait à la ligne 45 (ligne dont je ne suis pas auteur).

    EDIT: Merci c'est résolu, en fait j'avais mal fait l'héritage de QMainwindow sur le constructeur paramétré.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/02/2013, 09h24
  2. Passer QString d'une QDialog vers QMainWindow
    Par piero53 dans le forum Débuter
    Réponses: 5
    Dernier message: 18/02/2012, 00h52
  3. Réponses: 1
    Dernier message: 15/07/2008, 13h27
  4. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

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