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 :

Les slots pour un débutant

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 102
    Par défaut Les slots pour un débutant
    Bonjour,

    Je débute avec Qt et je cherche à me faire la main avec un truc simple. J'ai bien commencé avec le tuto officiel mais c'est un poil trop basique. Je suis en train de lire celui de Matthieu Brucher (Signaux et slots avec Qt4) mais je bloque. Tous les exemples de code que j'ai trouvé construisent leur interface avec une classe qui hérite de QMainWindow et qui commence avec Q_OBJECT. J'ai voulu faire autrement et évidemment ca ne fonctionne pas. Donc je cherche à comprendre si le modèle que l'on trouve est OBLIGATOIRE ou si je m'y prends simplement mal. Voici donc mon code.

    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
    #include <QApplication>
    #include <QPushButton>
    #include <QtGui>
    #include <QPlastiqueStyle>
    #include <QProgressBar>
     
    class MyProgressBar : public QProgressBar
    {
      // Q_OBJECT
     
    private:
        int toto;
     
    public:
        MyProgressBar(QWidget *parent = 0);
     
    public slots:
        void add(void);
        void sub(void);
     
    };
     
    MyProgressBar::MyProgressBar(QWidget *parent) : QProgressBar(parent)
    {
      ...
    }
     
    void MyProgressBar::add(void)
    {
      ...
    }
     
    void MyProgressBar::sub(void)
    {
      ...
    }
     
    int main(int argc, char *argv[])
     {
         QApplication app(argc, argv);
         app.setStyle(new QPlastiqueStyle);
     
         QWidget window;
         window.resize(410, 40);
     
         QPushButton more("more", &window);
         more.setFont(QFont("Times", 8, QFont::Bold));
         more.setGeometry(10, 4, 40, 20);
     
         MyProgressBar val(&window);
         val.setGeometry(55, 4, 300, 20);
         val.setMaximum(100);
         val.setMinimum(0);
     
         QPushButton less("less", &window);
         less.setFont(QFont("Times", 8, QFont::Bold));
         less.setGeometry(360, 4, 40, 20);
     
         QObject::connect(&more, SIGNAL(clicked()), &val, SLOT(add()));
         QObject::connect(&less, SIGNAL(clicked()), &val, SLOT(sub()));
     
         window.show();
         return app.exec();
     }
    Tel quel ça compile et "s’exécute" avec les avertissements suivants :
    Démarrage de C:\Documents and Settings\sbenoit\test2-build-desktop\debug\test2.exe...
    Object::connect: No such slot QProgressBar::add() in ..\test2\test.cpp:68
    Object::connect: No such slot QProgressBar::sub() in ..\test2\test.cpp:69

    Évidemment il ne se passe rien quand je clique sur les boutons.
    Si je dé-commente le Q_OBJECT dans la définition de ma classe ça ne compile plus.

    Voila si vous pouvez m'éclairer c'est avec plaisir que je lirai vos explications.
    Comme je l'ai dis j'apprends mais je souhaite pas juste apprendre à suivre un chemin tout tracé mais à comprendre.

    Merci

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 775
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 775
    Par défaut


    Citation Envoyé par sybe30 Voir le message
    Si je dé-commente le Q_OBJECT dans la définition de ma classe ça ne compile plus.
    Voilà la clé du problème : tu ne nous dis pas ce qui ne va pas. Quelle erreur ? Tu utilises bien QMake pour la compilation ?
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre très actif
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 102
    Par défaut
    Bon d'abord merci au modérateur pour le rappel et pour la mise en conformité de mon message.

    Ensuite j'utilise QtCreator 2.2.0 et j'avoue que je me contente de cliquer sur le triangle vert pour générer et exécuter. Donc les détails du build je lui fait confiance. Comme moi j'apprends et lui il est fait pour cela je pense qu'il le fait mieux que moi. Mais ta question fort pertinente m'a fait me pencher sur la question. Donc je viens de m'appercevoir que j'utilise un projet 4.7.3 et non 4.7.4 comme je le pensais. Mais surtout je viens de voir la ligne : "Configuration inchangée, étape QMake sautée." donc tu es probablement sur la bonne piste.

    Sauf que je sais pas comment modifier les propriétés du projet pour changer cela.

    Merci

  4. #4
    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,

    A vue d’œil vite fait je ne vois pas de souci (à part qu'il faut décommenter Q_OBJECT bien sûr).

    Parfois lors de changement majeur dans le projet, il arrive que le "triangle vert" ne les prenne pas tous en compte et ça fait des erreurs. Clic droit sur le projet (volet de gauche) et fait "exécuter qmake" pour re-générer les Makefile, avant de retenter la compilation.

  5. #5
    Membre très actif
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 102
    Par défaut
    OK c'est fait, et c'est toujours bon à savoir pour les prochaines fois mais là ça n'a pas corrigé le soucis. Probablement que le libellé des erreurs sera plus explicite.

    g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\test2.exe debug/test.o -L"d:\DEV\QtSDK\Desktop\Qt\4.7.3\mingw\lib" -lmingw32 -lqtmaind -lQtGuid4 -lQtCored4 -LC:\OpenSSL-Win32_full\lib
    mingw32-make[1]: Leaving directory `C:/Documents and Settings/sbenoit/test2-build-desktop'

    debug/test.o: In function `MyProgressBar':
    C:\Documents and Settings\sbenoit\test2-build-desktop/../test2/test.cpp:23: undefined reference to `vtable for MyProgressBar'
    C:\Documents and Settings\sbenoit\test2-build-desktop/../test2/test.cpp:23: undefined reference to `vtable for MyProgressBar'
    C:\Documents and Settings\sbenoit\test2-build-desktop/../test2/test.cpp:23: undefined reference to `vtable for MyProgressBar'
    C:\Documents and Settings\sbenoit\test2-build-desktop/../test2/test.cpp:23: undefined reference to `vtable for MyProgressBar'


    Merci

  6. #6
    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
    J'ai bien dit de décommenter Q_OBJECT, les slots n'existent pas dans une classe C++ simple.

    http://qt.developpez.com/faq/?page=qt4Core#linkvtable
    http://louis-du-verdier.developpez.com/qt/fondations/

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

Discussions similaires

  1. Ajouter les modules Apache pour nous débutants
    Par bruce-willis dans le forum Apache
    Réponses: 2
    Dernier message: 18/02/2009, 09h01
  2. QWizard et Q_OBJECT pour les slots
    Par h3llmo dans le forum Qt
    Réponses: 2
    Dernier message: 10/07/2008, 20h40
  3. Réponses: 12
    Dernier message: 06/10/2007, 14h01
  4. Réponses: 1
    Dernier message: 26/06/2007, 13h26
  5. [Débutant] Dialogue Java entre les frames pour client HTML
    Par Carrel dans le forum Général Java
    Réponses: 4
    Dernier message: 03/06/2004, 11h39

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