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

Qt Discussion :

problem de QObject : connect d'un pushbutton


Sujet :

Qt

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 141
    Points : 59
    Points
    59
    Par défaut problem de QObject : connect d'un pushbutton
    Bonjour

    je crée un button et j'essaye de lui faire son connect correspondant
    je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	QPushButton * p = new QPushButton(parent);
    	 QObject::connect(p, SIGNAL(clicked()), this, SLOT(click_pick()));
    il me sort l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    error C2665: 'QObject::connect'*: aucune des 2 surcharges n'a pu convertir tous les types d'arguments
    1>        g:\dev_coin\qt-win-opensource-src-4.5.3\src\corelib\kernel\qobject.h(191): peut être 'bool QObject::connect(const QObject *,const char *,const QObject *,const char *,Qt::ConnectionType)'
    1>        g:\dev_coin\qt-win-opensource-src-4.5.3\src\corelib\kernel\qobject.h(203): ou       'bool QObject::connect(const QObject *,const char *,const char *,Qt::ConnectionType) const'
    1>        lors de la tentative de mise en correspondance de la liste des arguments '(QPushButton *, const char *, MyExaminerViewer *const , const char *)'
    pr le code entier de ma classe :le .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
     
     
    #include "MyExaminerViewer.h"
    #include <qpushbutton.h>
    #include <stdlib.h>
    MyExaminerViewer::MyExaminerViewer(QWidget * parent)
        : SoQtExaminerViewer(parent, NULL, TRUE,
                                SoQtFullViewer::BUILD_ALL, SoQtFullViewer::BROWSER,
                                // build == FALSE, to delay creation of decorations
                                FALSE)
      {
        // Explicitly trigger the construction of viewer decorations.
        QWidget * widget = this->buildWidget(this->getParentWidget());
        this->setBaseWidget(widget);
      }
     
      void
      MyExaminerViewer::createViewerButtons(QWidget * parent, SbPList * buttonlist)
      {
        SoQtExaminerViewer::createViewerButtons(parent, buttonlist);
        // [now add your own button(s) to the buttonlist]
    	QPushButton * p = new QPushButton(parent);
    	 QObject::connect(p, SIGNAL(clicked()), this, SLOT(click_pick()));
       //   p->setPixmap(QPixmap((const char **)home_xpm));
     
     
        p->adjustSize();
        buttonlist->append(p);
     
      }
    le.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
     
     
    #include "inventor.h"
    #include <QObject>
    #include <QMouseEvent>
    class MyExaminerViewer : public SoQtExaminerViewer {
     
      public:
        MyExaminerViewer(QWidget * parent);
     
      protected:
        virtual void createViewerButtons(QWidget * parent, SbPList * buttonlist);
     
      };

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 38
    Points : 45
    Points
    45
    Par défaut
    Bonjour,

    Tout d'abord pour utiliser les meta-objects (déclarer tes propres signals/slots) il faut déclarer ta classe en tant que tel, exemple de Qt Assistant (avec la recherche sur Q_OBJECT):

    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
     #include <QObject>
    
     class Counter : public QObject
     {
         Q_OBJECT
    
     public:
         Counter() { m_value = 0; }
    
         int value() const { return m_value; }
    
     public slots:
         void setValue(int value);
    
     signals:
         void valueChanged(int newValue);
    
     private:
         int m_value;
     };
    Ensuite il faut déclarer ton slot click_pick() et l'implémenter:

    - Dans le .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public slots:
         void click_pick();
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private slots:
         void click_pick();
    Suivant si tu veux que ta fonction click_pick() soit public ou privée (pour le slot ça ne change rien, tu pourra le connecter de n'importe où).

    - Dans le .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void
      MyExaminerViewer::click_pick()
      {
        // Ton implémentation
      }
    G.

    PS: et juste quelques infos, tu peux simplifier ton code avec:
    - Si ton SoQtExaminerViewer hérite d'un QObject tu peux te passer du QObject:: devant le connect.
    - Quand tu fais un connect(aaa, bbb, this, ccc) tu peux le simplifier en connec(aaa, bbb, ccc).
    - Les this->aaa() sont inutiles, tu peux directement appeler aaa(), genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QWidget * widget = buildWidget(getParentWidget());
    setBaseWidget(widget);

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 141
    Points : 59
    Points
    59
    Par défaut
    quand je mets un "Q_OBJECT" dans mon .h j'ai l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1>MyExaminerViewer.obj : error LNK2001: symbole externe non résolu "public: virtual struct QMetaObject const * __thiscall MyExaminerViewer::metaObject(void)const " (?metaObject@MyExaminerViewer@@UBEPBUQMetaObject@@XZ)
    1>MyExaminerViewer.obj : error LNK2001: symbole externe non résolu "public: virtual void * __thiscall MyExaminerViewer::qt_metacast(char const *)" (?qt_metacast@MyExaminerViewer@@UAEPAXPBD@Z)
    1>MyExaminerViewer.obj : error LNK2001: symbole externe non résolu "public: virtual int __thiscall MyExaminerViewer::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MyExaminerViewer@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
    puis j'ai declairé le "click_pick()"
    comme etant un slot public,mais dans une autre classe,est ce que le problem peut venir de là aussi ?!
    remarque,j'herite de la classe SoQtExaminerViewer pour enfait utiliser une methode virtuelle :

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    void
    SoQtFullViewer::createViewerButtons(QWidget * parent, SbPList * buttonlist)
    {
      for (int i=0; i <= SEEK_BUTTON; i++) {
        QPushButton * p = new QPushButton(parent);
        // Button focus doesn't really make sense in the way we're using
        // the pushbuttons.
        p->setFocusPolicy(QTWIDGET_NOFOCUS);
     
    #if QT_VERSION >= 0x040000 // Qt 4.*
        // In some GUI styles in Qt4, a default button is drawn with an
        // extra frame around it, up to 3 pixels or more. This causes
        // pixmaps on buttons to look tiny, which is not what we want.
        p->setIconSize(QSize(24, 24));
    #endif
     
    #if (defined Q_WS_MAC && QT_VERSION >= 0x030100) && defined(HAVE_QSTYLEFACTORY_H)
        // Since Qt/Mac 3.1.x, all pushbuttons (even those < 32x32) are drawn 
        // using the Aqua style, i.e. with rounded edges and shading. This
        // looks really ugly in the viewer decoration. Drawing the buttons
        // in the Windows style gives us the flat, square buttons we want.
        QStyle * style = QStyleFactory::create("windows");
        if (style) { p->setStyle(style); }
    #endif
     
        // FIXME: its wrong to cast xpm data to (const char **), it
        // _should_ be (const char * const []), but this is not valid ANSI
        // C++. Not sure what to do about this (and the wrong cast can
        // (and has) in fact lead to bugs, so the situation should be
        // resolved). 20000505 mortene.
     
        switch (i) {
        case INTERACT_BUTTON:
          PRIVATE(this)->interactbutton = p;
          p->setToggleButton(TRUE);
          p->setPixmap(QPixmap((const char **)pick_xpm));
          p->setOn(this->isViewing() ? FALSE : TRUE);
          QObject::connect(p, SIGNAL(clicked()),
                           PRIVATE(this), SLOT(interactbuttonClicked()));
          break;
        case EXAMINE_BUTTON:
          PRIVATE(this)->viewbutton = p;
          p->setToggleButton(TRUE);
          p->setPixmap(QPixmap((const char **)view_xpm));
          p->setOn(this->isViewing());
          QObject::connect(p, SIGNAL(clicked()),
                           PRIVATE(this), SLOT(viewbuttonClicked()));
          break;
        case HOME_BUTTON:
          QObject::connect(p, SIGNAL(clicked()), PRIVATE(this), SLOT(homebuttonClicked()));
          p->setPixmap(QPixmap((const char **)home_xpm));
          break;
        case SET_HOME_BUTTON:
          QObject::connect(p, SIGNAL(clicked()),
                           PRIVATE(this), SLOT(sethomebuttonClicked()));
          p->setPixmap(QPixmap((const char **)set_home_xpm));
          break;
        case VIEW_ALL_BUTTON:
          QObject::connect(p, SIGNAL(clicked()),
                           PRIVATE(this), SLOT(viewallbuttonClicked()));
          p->setPixmap(QPixmap((const char **)view_all_xpm));
          break;
        case SEEK_BUTTON:
          QObject::connect(p, SIGNAL(clicked()), PRIVATE(this), SLOT(seekbuttonClicked()));
          p->setPixmap(QPixmap((const char **)seek_xpm));
          break;
        default:
          assert(0);
          break;
        }
     
        p->adjustSize();
        buttonlist->append(p);
      }
    }
    on voit bien qu'il utilise Q_Object,donc si j'herite de cette classe là,pas besoin en principe de mettre Q_Object dans ma classe non ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 38
    Points : 45
    Points
    45
    Par défaut
    Bonjour,

    Même si tu hérites d'une classe déclarant le Q_OBJECT tu dois quand même le déclarer dans la tienne pour pouvoir utilliser les signaux/slots il me semble (après je ne suis pas sur si tu n'en déclares pas dans ta classe).

    Sinon pour le problème de symbole externe non résolu essaye de faire un qmake avant de recompiler.

    G.

Discussions similaires

  1. probleme QObject::connect SLOT/SIGNAL
    Par sebatlante dans le forum Qt
    Réponses: 3
    Dernier message: 22/03/2008, 11h39
  2. [Connection Rasdial] Probleme pour se connecter
    Par winow dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/07/2006, 14h57
  3. QObject::connect: No such slot
    Par guepe dans le forum Qt
    Réponses: 2
    Dernier message: 22/12/2005, 10h24
  4. [postnuke] Problem in Database Connection
    Par shirya dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 02/11/2005, 18h35
  5. Réponses: 2
    Dernier message: 30/05/2002, 08h54

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