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 :

Objet non déclaré ?

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Objet non déclaré ?
    Bonjour,

    Je m'étais promis de ne pas poser beaucoup de question.
    C'est pourquoi je vous demanderai ici de ne pas m'apporter la réponse brute, mais de me donne quelques pistes de réflexion, si possible une méthode pour résoudre les problèmes par moi-même, voire même me conseiller par exemple des petits exercices adéquat pour bien comprendre et manier les classes si ça ne gêne pas bien sûr.
    Car je compte réellement trouver les chose par moi-même.

    Mon petit souci est le suivant : une fenêtre avec pour nom d'objet "MainwindowClass" déclarée là-dedans, au début à l'intérieur d'un namespace dans le fichier 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
    namespace Ui
    {
        class MainWindowClass;
    }
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();    
     
    private:
        Ui::MainWindowClass *ui;
     
    private slots:    
        void on_lineEdit_textEdited(const QString );
        void on_pushButton_2_pressed();
    maintenant dans l'autre fichier mainwindow.cpp je définis la fonction suivante en signal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    (...)
    void MainWindow::on_pushButton_2_pressed()
    {    
        MainWindowClass.close();
    }
    J'applique la fonction close() à l'objet MainWindowClass (je sais que c'est ce nom là car Qt Creator me le dit), comme j'ai vu dans les tutos.

    Et là l'ordinateur m'insulte en me disant que MainWindowClass n'est pas déclaré : je lui réponds "je regrette Mr l'ordi mais MainWindowClass est bien déclaré dans les fichiers d'entête (voir 2 1ères lignes de mainwindow.cpp)".

    A force d'insister il s'entêtait (comme les fichiers) à me répondre toujours pareil (ça n'a pas été faute d'insister). Après je suis parti et s'on s'est fait la tête toute la nuit :p

    Bref je me suis dis 3 choses :

    => peut-être est-ce un problème d'encapsulation et que MainWindowClass est private donc on ne touche pas

    => peut-être qu'un objet peut être lui-même une classe qui comporte d'autres sous-classes et donc la syntaxe est interdite (mais c'est moi qui l'ai inventé par contre )

    => peut-être que je n'ai pas assez dormi cette nuit pour dire toutes ces bêtises

    Qu'en pensez-vous docteur ? Ca se soigne ?

    Merci bonne journée.

    Cordialement,
    Gizmo.

  2. #2
    Membre confirmé Avatar de sebmag
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Par défaut
    bonjour,

    Pourquoi ne pas utiliser directement les connexions ?

  3. #3
    Membre confirmé
    Avatar de bobti89
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Par défaut
    Une méthode s'appelle sur un objet et pas une classe !

    Donc ou tu fais ui->close() (pas sur que ca fonctionne), ou simplement close() (soit this->close() si tu préfères).

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sebmag Voir le message
    Pourquoi ne pas utiliser directement les connexions ?
    Pour répondre à ta question : il me semble que Qt Creator génère du code automatiquement. Donc quand je clique droit sur l'objet et que je fais go to slot, ça marche. Pas avec le connect certes, mais ça marche.
    Après je ne sais pas laquelle des 2 est la mieux mais il me semble que je me sens plus à l'aise avec du préprogrammé : cela va un peu plus vite.

    ok c'est bien ce qui me semblait : un slot s'adresse à un objet.
    ce qui me surprend le plus dans cette histoire c'est que quand je sélectionne graphiquement la fenêtre Qt Creator indique bel et bien MainWindowClass en tant qu'objet... bizarre non ?

    un truc aussi : quand je tape les instructions à l'intérieur d'une fonction void : je tape par exemple il dit que lineEdit est non-déclaré et pourtant il l'est dans les fichiers entête déclarés au début avec #include : ça sincèrement je ne comprend pas : cela viendrait-il de la ligne "private slots" que j'ai vu dans un autre fichier : si oui comment y acéder ? Car pour l'instant je ne vois pas de solution.

    PS : je viens de mettre ce slot en public : et là je n'ai plus de problème. Mais je ne suis pas sûr de mon coup du tout...
    Dernière modification par Invité ; 10/09/2010 à 10h21.

  5. #5
    Membre confirmé Avatar de sebmag
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Par défaut
    Donc quand je clique droit sur l'objet et que je fais go to slot, ça marche. Pas avec le connect certes, mais ça marche.
    Le fait de faire "go to slot" génère une connexion automatiquement ! (perso je préfère la méthode manuelle car je vois ce que je fais !)

    un truc aussi : quand je tape les instructions à l'intérieur d'une fonction void : je tape par exemple
    Code :
    lineEdit.copy();il dit que lineEdit est non-déclaré et pourtant il l'est dans les fichiers entête déclarés au début avec #include : ça sincèrement je ne comprend pas
    Les includes ne déclarent pas les objets ! En gros ils servent à inclure les fonctions utilisables dans ton code. Pour déclarer un objet tu dois écrire :
    Où malineEdit est le nom de ta QLineEdit !

    Si tu as créer une QLineEdit graphiquement (à la main avec QtCreator) et si tu souhaites y accéder il faudra passer par ton fichier UI !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Je vais remettre le nez dans les cours. Cette ligne me semble familière : c'est pour accéder aux éléments d'une classe ? Le namespace étant ui déclarant la classe MainWindowClass, est-ce ce code aurait été aussi valable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MainWindowClass->maLineEdit.copy()
    ?

  7. #7
    Membre confirmé Avatar de sebmag
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Par défaut
    Le namespace étant ui déclarant la classe MainWindowClass, est-ce ce code aurait été aussi valable :
    Code :
    MainWindowClass->maLineEdit.copy()?
    Non, là c'est pas bon.

    Tu dois accéder aux éléments de ton fichier ui ! C'est-à-dire accéder aux objets que tu as placé à la souris dans ta fenêtre !

  8. #8
    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
    Citation Envoyé par sebmag Voir le message
    Le fait de faire "go to slot" génère une connexion automatiquement ! (perso je préfère la méthode manuelle car je vois ce que je fais !)
    Voir ici : ce mécanisme (que je trouve génial car très lisible) regarde les slots nommés on_<objet>_<signal_objet> et les connecte au signal_objet.

    Exemple : on_bouton1_clicked() sera la méthode exécutée au clic sur 'bouton1'... très intuitif, pas besoin de clic droit > go to slot et tout pour faire ça
    En revanche, à la fin du constructeur, il ne faut pas oublier l'instruction :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    QMetaObject::connectSlotsByName(this);
    pour faire fonctionner ce mécanisme.


    C'est vrai qu'il faut que tu sois clair avec les notions objet, mais concernant la programmation-même, quoi qu'il arrive dans QtCreator tu tapes un point et il te met un point OU une flèche selon la nature de la variable donc pas d'erreur possible normalement.

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

    De retour dans ce topic : sebmag tu as dit que la méthode de connecter les slots et les signaux entre eux permet de voir ce que l'on fait.
    Donc on a le prototype suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(close()));
    Je n'ai pas de souci particulier avec ça, mis à part que s'il y a plusieurs instructions dans le slot, comment faire ?
    Je reprends mon exemple où j'ai fait avec 'go to slot' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void MainWindow::on_pushButton_2_pressed()
    {   
        i=2;
        j=5;
        k=i+j;
        close();
    }
    Là j'ai mis 50 instructions par harsard juste pour l'exemple.
    Donc si je reprend le prototype de connection des signaux et des slots entre eux, cela donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect(pushButton_2, SIGNAL(pressed()), this, SLOT(i=2, j=5, k=i+j, close()));
    ?
    Cordialement,
    Gizmo.
    Dernière modification par Invité ; 26/09/2010 à 17h02.

Discussions similaires

  1. Réponses: 7
    Dernier message: 21/02/2011, 21h36
  2. Objet non déclaré sous une master page
    Par mappy dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 03/11/2009, 10h12
  3. Réponses: 2
    Dernier message: 06/07/2008, 00h52
  4. EmptyParam non déclaré
    Par Tempotpo dans le forum Langage
    Réponses: 2
    Dernier message: 01/08/2005, 14h46
  5. Problème avec des composants non déclarés
    Par vbcasimir dans le forum Bases de données
    Réponses: 1
    Dernier message: 20/01/2005, 11h17

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