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é ?

  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 du Club Avatar de sebmag
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

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

    Pourquoi ne pas utiliser directement les connexions ?

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Points : 150
    Points
    150
    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 à 11h21.

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

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Points : 49
    Points
    49
    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 du Club Avatar de sebmag
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Points : 49
    Points
    49
    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
    Invité
    Invité(e)
    Par défaut
    Merci.
    Ceci étant dit ce petit problème m'obnubile : je l'ai vu dans le cours pourtant mais je ne sais plus si c'est lié aux classes ou aux pointeurs.
    Je n'arrive plus à le retrouver.

    Merci d'avance.

    Cordialement,
    Gizmo.

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

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2009
    Messages : 52
    Points : 49
    Points
    49
    Par défaut
    Excuse moi, j'ai fait une erreur monumentale !

    le bon code c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ui->maLineEdit->copy();

  10. #10
    Invité
    Invité(e)
    Par défaut
    Re,

    Je sais que je sui embêtant mais je n'ai toujours pas réussi à trouver à quoi fait référence la flèche '->' dans le cours.
    Est-ce que tu peux expliquer en détail la signification de cette ligne s'il te plaît ?
    De cette manière, je pourrai plus facilement me repérer dans le cours.
    Je suis sûr qu'une fois qu'on a compris le principe la POO est simple et puissante.

    Merci d'avance.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 30
    Points : 36
    Points
    36
    Par défaut
    La flèche c'est comme le point pour accéder aux méthodes/membres d'un objet sauf que là c'est à partir d'un pointeur.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Ah d'accord il me semblait bien aussi...
    Donc quand c'est une simple variable alors on met un point entre l'objet et le slot()
    et quand c'est une variable de style pointeur on met une flèche à la place du point ? C'est ça ?
    Je n'ai pas tout compris au caractère près encore de la partie préprogrammée.
    Mais j'essaye d'abord de comprendre les rouages d'une manière globale, les grandes lignes après de savoir qui fait quoi/intéragit sur quoi dans la partie préprogrammée je ne sais pas bien encore.

    Ce que j'ai compris déjà c'est les signaux et les slots et qu'on les connecte entre eux. Ensuite les classes et les sous classes, quoique certains points sont encore obscurs : je viens juste de dévouvrir la POO il y a à peine quelques jours mdr.

    J'en apprend tous les jours un peu plus mais que j'aimerais arriver au jour où j'aurai compris tout le principe des classes, des namespaces, etc...
    J'aimerais avoir la connaissance que vous autres habitués avez : ça n'est pas de la jalousie, plutôt une forme d'admiration.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 30
    Points : 36
    Points
    36
    Par défaut
    Si tu découvres juste la POO je te conseille de lire des cours de POO théorique avant de commencer directement sur du C++.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Re,
    Oui ya du boulot.
    En fait j'ai déjà regardé quelques cours et tuto de ci de là : c'est pas facile à assimiler tout ça : notamment je pêche dans les constructeurs destructeurs.
    La notation aussi n'est pas évidente de prime abord : pour vraiment savoir il faut que je décompose la chose en "blocs" pour mieux m'y retrouver : ce qui n'est pas chose facile.
    Mais je suis sûr qu'à force d'en faire ça doit couler tout seul.
    De la patience...

    Cordialement,
    Gizmo.

  15. #15
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Salut,

    Je crois que tu n'as pas saisi la différence entre une classe et un objet.

    Une classe définit et décrit une entité, de quoi elle est composée, et ce qu'elle peut faire. Cependant, une classe reste la description de cette entité, et n'est pas l'entité elle même.

    Un objet est quant à lui l'instanciation d'une classe, et son comportement correspond à la définition faite dans la classe. Et c'est sur lui que s'applique les méthodes. (à part les méthodes statiques, mais c'est un autre point).

    En fait j'ai déjà regardé quelques cours et tuto de ci de là : c'est pas facile à assimiler tout ça : notamment je pêche dans les constructeurs destructeurs.
    La notation aussi n'est pas évidente de prime abord : pour vraiment savoir il faut que je décompose la chose en "blocs" pour mieux m'y retrouver : ce qui n'est pas chose facile.
    Comme l'a dit daemon, si tu débutes vraiment en programmation objet, il faut que tu t'intéresses d'abord à la théorie, aux concepts. Les détails techniques tels que les constructeurs, les destructeurs ou la syntaxe sont à voir plus tard. Après, je comprends ton impatience "à créer" des petites applications, mais il faut commencer par le début .

    Bon courage,

    G.

  16. #16
    Membre expérimenté

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    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.

  17. #17
    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 à 18h02.

Discussions similaires

  1. Réponses: 7
    Dernier message: 21/02/2011, 22h36
  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, 11h12
  3. Réponses: 2
    Dernier message: 06/07/2008, 01h52
  4. EmptyParam non déclaré
    Par Tempotpo dans le forum Langage
    Réponses: 2
    Dernier message: 01/08/2005, 15h46
  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, 12h17

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