Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.4.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Probleme de compilation

Bonjour, j'ai un petit souci de compilation et je ne trouve pas d'ou cela peut il venir, le compilateur ne dit rien mais le clic sur le bouton "valider" ne fait rien alors qu'il devrai " inhibé " le groupeBox2 et afficher un QMessage.
Pourtant la vérification du mot de passe fonctionne parfaitement, je ne comprend donc pas pourquoi la suite ne fonctionne pas

voici mon code si quelqu'un voit l'erreur, merci d'avance

.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
#include <QtGui>
#include <QProcess>
#include <QCheckBox>
#include <QSpinBox>
#include <QFormLayout>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QLineEdit>
#include <QPushButton>
#include <string>
#include <QFile>
#include <fstream>
#include <Qfile.h>
#include <Qtextstream.h>
#include <iostream>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->validation, SIGNAL(clicked()), this, SLOT(verifiemdp())); // signal pour vérifier les mots de passe et identifiant
connect(ui->Valider, SIGNAL(clicked()), this, SLOT(valider())); // signal pour valider les données d'entête de la facture

ui->groupBox_2->setEnabled(false);
ui->groupBox_3->setEnabled(false);}

void MainWindow::on_validation_clicked()
{
QString mdpRentre = ui->motDePasse->text();
QString IDRentre = ui->ID->text();
QString *mdp = new QString(" ");
QString *code = new QString(" ");

if (mdpRentre == mdp && IDRentre == code)
{
QMessageBox::information(this, "Accès autorisé", "Débloquage des données !");
ui->ID->setEnabled(false);
ui->motDePasse->setEnabled(false);
ui->validation->setEnabled(false);
ui->pushButton_3->setEnabled(false);
ui->groupBox_2->setEnabled(true);
ui->calendarWidget->setEnabled(true);
}
else
{
QMessageBox::critical(this, "Mot de passe incorrect", "Accès refusé");
}
} // tout fonctionne jusque la
void MainWindow::on_valider_clicked()
{
QMessageBox::information(this, "Données prises en compte", "Les données de facturation ont été prises en compte");
ui->groupBox_2->setEnabled(false);
}

MainWindow::~MainWindow()
{
delete ui;
}

.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QApplication>
#include <QPushButton>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QFormLayout>
#include <QLineEdit>
#include <QSpinBox>
#include <QMessageBox>
#include <QLabel>
#include <QFile>
#include <QComboBox>
#include <QGroupBox>
#include <Qfile.h>
#include <Qtextstream.h>
#include <iostream>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private slots:
void on_validation_clicked();
void on_valider_clicked();

private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

Réponses

  • December 2011 modifié
    Bonjour,
    Juste un détail que je ne piges pas. Dans ton .h et lors de leur implémentation, les 2 slots s'appellent on_validation_clicked() et on_valider_clicked() alors que dans les connexions ils s'appellent verifiemdp() et valider(). Je ne sais pas si c'est vraiment comme ça dans ton code mais tu devrais avoir un message lors de l'éxécution genre : unable to connect, verifiemdp() doesn't exist.
    Le compilateur ne dira rien mais lors de l'éxécution un msg devrait s'afficher comme quoi la connexion n'est pas possible.
    D'ailleurs, toujours dans l'hypothèse que ton code est tel quel, je ne vois pas comment il peut entrer dans le slot de vérification de mot de passe, mais tu dis qu'il le fait. Bizarre bizarre
  • ben c'est cela justement que je ne comprend pas, c'est que pour vérifier le mdp j'utilise la connection ui->validation, SIGNAL(clicked()) et ca fonctionne
    alors que pas avec le 2eme bouton
    je comprend pas
  • December 2011 modifié
    Après, quoi qu'il arrive, je pense qu'il vaut mieux ne pas jouer avec le feu et mettre les connexions proprement :
     connect(ui->validation, SIGNAL(clicked()), this, SLOT(on_validation_clicked()));
    connect(ui->Valider, SIGNAL(clicked()), this, SLOT(on_valider_clicked()));
    Je vais reproduire parce que ça m'intrigue. il devrait être dans les choux dans les deux cas.
  • Bon j'ai reproduis et oui il se passe des trucs. En fait, on dirais qu'une auto résolution se fait entre le nom du bouton et le slot on_bouton_clicked. En fait il me dit bien dans un premier temps que les slots évoqués n'existent pas. Mais le clic sur le bouton nommé "valider" lance le slot on_valider_clicked(). par contre si j'appelle ce même bouton "plop", il ne fait rien.
    Si quelqu'un a connaissance du pourquoi...
  • D'accord, alors en fait on tombe dans un comportement par défaut de Qt qui permet d'alléger le code si besoin. En fait, Qt connecte par défaut un objet qu'on appellera "bouton" et son signal "clicked" vers un slot on_bouton_clicked. Cela permet de s'affranchir de la connexion "à la main". Apparrement cela s'applique à toutes les combinaisons objet-signal. un objet-signal est automatiquement mappé sur un slot on_objet_signal. Après personnellement, je trouves ça un tantinet dangereux, je préfères écrire toutes les connexions.
  • Bonjour, ce système de comportement par défaut s'appelle l'auto-connect et n'est valable que pour les fenêtres crées par QtDesigner et où les slots respectent une convention de nommage comme ceci: on_[nomDuWidget]_[signal] . En fait, il n'est même pas utile de créer les connexions et de ce fait elles sont surement ignorées si les slots ne sont pas déclarés comme ça à l'air d'être le cas ici. L'auto-connect étant dépendant du nom du widget, le renommer ne permettra plus la connexion. Donc, ceux qui n'utilisent pas QtDesigner (comme moi) ne sont pas concernés par cette fonctionnalité. En espérant avoir donné quelques éléments de réponses ;)
  • je comprend bien mais cela ne résoud rien, j'ai beau tourner ca dans tous les sens je ne vois pas, j'ai fait des modif a tout va, mais rien n'y fait
  • December 2011 modifié
    Normalement tous les éléments de réponse a ton problème sont dans cette discussion.

    Solution 1 : tu veux utiliser l'auto-connect expliqué par Maestro
    ton bouton "Valider" doit être renommé "valider" (sans majuscule) dans QtDesigner et tu peux supprimer les 2 lignes de connect. (solution 1 bis : renommer le slot "on_valider_clicked" en "on_Valider_clicked")

    Solution 2 : tu ne veux pas utiliser l'auto-connect
    tu renommes tes 2 slots (.h et .cpp) comme les noms utilisés dans les connect (verifiemdp() et valider()).
  • Super, un tres grand merci a dwarfylo pour la solution 1

    ca fonctionne en effet, pas besoin de connect, j'ai donc supprimer ces deux ligne la et effectivement renommé mon QPushButton en "valider" sans majuscule et maintenant ca fonctionne parfaitement

    connect(ui->validation, SIGNAL(clicked()), this, SLOT(on_validation_clicked()));
    connect(ui->Valider, SIGNAL(clicked()), this, SLOT(on_valider_clicked()));
    Mais une petite question d'ordre plutot " apprentissage " : Pour l'auto-connect, les majuscules sont interdites ?
  • Les majuscules ne sont pas interdites mais il faut respecter la casse. "Valider" et "valider" sont deux variables différentes et donc ton slot doit correspondre à l'un ou l'autre pour que la connexion se fasse. @dwarfylo te l'explique.
  • ok je prend note, je vous remerci tous pour votre aide, j'ai, grace a vous, pu avancer dans mon programme
    encore merci
Connectez-vous ou Inscrivez-vous pour répondre.