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 :

connect: No such slot

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut connect: No such slot
    salut a tous

    mon projet se compile correctement mais avec ce problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect: No such slot MainWindow::ZoomVue(QMouseEvent* event) in ..\dxf\mainwindow.cpp:172
    voici mainwindow.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    public:
        MainWindow();
    ....
    public slots:
       void ZoomVue(QMouseEvent* event);
    ....
    et voici mainwindow.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
    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
     
    ...
    void MainWindow::ZoomVue(QMouseEvent *event)
    {
        if(event->MouseButtonPress)
        {
         if(event->button()==Qt::LeftButton){
            if(event->modifiers()==Qt::ControlModifier)
            {
                maView->setDragMode(QGraphicsView::NoDrag);
                m_rubberBandActive = false;
                mousepressed=true;
                m_lastDragPos = event->pos();
                return;
            }
            else
            {
                maView->setDragMode(QGraphicsView::RubberBandDrag);
                m_rubberBandOrigin = event->pos();
                m_rubberBandActive = true;
                rubberBand = new QRubberBand(QRubberBand::Rectangle, this);//new rectangle band
                rubberBand->setGeometry(QRect(m_rubberBandOrigin, QSize()));
                rubberBand->show();
                event->accept();
            }
     
          }else
         {
           QWidget::mousePressEvent(event);
         }
     
        }else if(event->MouseMove){
            rubberBand->setGeometry(QRect(m_rubberBandOrigin, event->pos()).normalized());
            QPointF delta = maView->mapToScene(event->pos()) - maView->mapToScene(m_lastDragPos);
            //this->panView(delta);
     
            QPoint viewCenter(maView->viewport()->width() / 2 + delta.x(), maView->viewport()->height() / 2 + delta.y());
            QPointF newCenter = maView->mapToScene(viewCenter);
            maView->centerOn(newCenter);
     
            m_lastDragPos = event->pos();
            return;
        }else if(event->MouseButtonRelease){
            if (m_rubberBandActive)
            {
                QPoint rubberBandEnd = event->pos();
                QRectF zoomRectInScene;
                if (m_rubberBandOrigin.x()<rubberBandEnd.x())
                {
                    if(m_rubberBandOrigin.y()<rubberBandEnd.y())
                 zoomRectInScene= QRectF(maView->mapToScene(m_rubberBandOrigin),maView->mapToScene(rubberBandEnd));
                    else
                        zoomRectInScene= QRectF(maView->mapToScene(QPoint(m_rubberBandOrigin.x(),rubberBandEnd.y())),maView->mapToScene(QPoint(rubberBandEnd.x(),m_rubberBandOrigin.y())));
     
                }else{
                    if(m_rubberBandOrigin.y()<rubberBandEnd.y())
                        zoomRectInScene = QRectF(maView->mapToScene(QPoint(rubberBandEnd.x(),m_rubberBandOrigin.y())),maView->mapToScene(QPoint(m_rubberBandOrigin.x(),rubberBandEnd.y())));
                    else
                 zoomRectInScene = QRectF(maView->mapToScene(rubberBandEnd),maView->mapToScene(m_rubberBandOrigin));
                }
                maView->fitInView(zoomRectInScene, Qt::KeepAspectRatio);
                m_rubberBandActive = false;
            }
            mousepressed=false;
            event->accept();
            rubberBand->hide();
        }
    }
    ...
    et voici connect:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(zoomButton,SIGNAL(pressed()),this,SLOT(ZoomVue(QMouseEvent* event)));
    tout apparait juste et je vois pas ou est l'erreur !
    aidez moi svp
    merci d'avance

  2. #2
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Par défaut
    Hello,

    Vous ne pouvez pas connecter un signal ne fournissant pas d'argument à un slot qui en demande un. L'inverse par contre est possible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //ok
    connect(zoomButton,SIGNAL(pressed()),this,SLOT(zoomButtonPressed()); 
     
    // ok aussi, le paramètre int est tout simplement ignoré
    connect(aSignal,SIGNAL(pressed(int)),this,SLOT(onSignal())); 
     
    //Pas ok, car ZoomVue a besoin de l'argument event, c'est comme 
    //si tu appelle une fonction qui demande un paramètre sans le lui donner.
    //Sauf que dans ce dernier cas, cela sera vu à la compilation, ici tu ne le vois 
    // que lors du runtime. 
    connect(zoomButton,SIGNAL(pressed()),this,SLOT(ZoomVue(QMouseEvent* event)));
    Néanmoins je vous conseillerais de faire un tours ici afin de bien comprendre le système de signaux & slots de Qt.

    Concernant les event, je pense qu'il suffit simplement de surcharger la fonction event() afin de recevoir les événements, ensuite il n'y a plus qu'as traiter l'événement en fonction de son type.

    MainWindow.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class MainWindow...{
    ...
    protected:
        bool event(QEvent * e);
    ...};
    MainWindow.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
     
    bool MainWindow::event(QEvent * e)
    {
        if((event->type() == QEvent::MouseButtonDblClick) || 
        (event->type() == QEvent::MouseButtonPress) ||  
        (event->type() == QEvent::MouseButtonRelease) ||  
        (event->type() == QEvent::MouseMove)){
            //Pour le cast qui suit, je ne suis pas sûre, si qq'un peux corriger/confirmer
            QMouseEvent *mev = qobject_cast<QMouseEvent*>(event);
            if(mev){
                //Ici on traite les "mouse events" (code existant dans ZoomVue())
                //...
                //ou on appelle ZoomVue
                ZoomVue(mev);        
            }
        } 
    }
    Sources :
    classe QEvent
    QtCore 5.0: The Event System

    Personnellement je n'ai jamais utilisé les événements de Qt, je m'en sors toujours avec les signaux/slots. Je n'ai pas testé le code ci-dessus, mais cela devrait fonctionner, à part peut être le cast pour lequel je ne suis pas sûre. Mais tu verra rapidement en testant si ce n'est pas la bonne solution.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut
    je comprend bien votre explication et j'ai bien saisie d'ou vient l'erreur

    Mais je vais éclercir un peux ce je suis en train de faire:

    dans mon MainWindow j'ai un QGraphicsview j'ai réussis a faire un zoom avec le bouton gauche de la souris en ré-implémentant les 3 fonctions suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mousePressEvent(QMouseEvent* event)
    mouseMoveEvent(QMouseEvent *event)
    mouseReleaseEvent(QMouseEvent *event)
    et ça marche bien dés que clique sur le bouton gauche de la souris.
    Mon but est d'ajouter un bouton "Zoombutton" pour contrôler le zoom: je vais que la fonction ne s'applique que lorsque le bouton soit foncé.

    j'ai pensé au système SIGNAL/SLOT mais je vois pas comment?

    est ce que t'as une idée?

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Par défaut
    Si je comprend bien, tu veux que la fonction zoom ne soit activée que lorsque le bouton est enfoncé ? (Bouton qui se comporte comme une checkbox en fait ??)
    Dans ce cas, il faut activer l'option
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    zoomButton->setCheckable(true);
    et ensuite, dans le code des événements, placé un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(zoomButton->isChecked(){
    ... //Traitement zoom
    }

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut
    en ce qui concerne le Bouton c'est ça ce que veux ça marche bien

    Dans mon MainWindow j'ai un QHBoxlayout qui contient plusieurs widgets y compris mon QGraphicsview. je veux que la fonction ne soit activée que sur la QGraphicsview et non pas ailleurs .

    t'as une idée pour ça?

  6. #6
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Par défaut
    Je pense que ceci devrait faire l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void MainWindow::mousePressEvent(QMouseEvent* event)
    {
       //Ici view est ton QGraphicsView
        if(view->geometry().contains(event.pos())){
            //traitement du zoom
        }
    }
    Ceci n'est qu'un exemple, après à toi de voir si tu en as besoin dans les autres événements

    edit: Il y a sûrement d'autres solutions.
    Une seconde solution possible serais de créer une nouvelle classe héritant de QGraphicsView, puis surcharger les méthodes mousePressedEvent(), mouseReleasedEvent(), etc... et d'envoyer un signal depuis ces événements, par exemple mousePressed(), depuis cette classe. Ensuite depuis la MainWindow, tu n'as plus qu'as remplacer la QgraphicsView par ta nouvelle classe, et te connecté à ces signaux, de cette manière tu est sûre qu'il provienne de ce widget spécifique.


    source :
    QWidget::geometry()
    QMouseEvent::pos()

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

Discussions similaires

  1. Qt::connect: no such slot
    Par MarcelBeaudoin dans le forum Débuter
    Réponses: 4
    Dernier message: 07/03/2015, 18h45
  2. Réponses: 5
    Dernier message: 21/11/2014, 21h40
  3. connect Signal et slot perso
    Par freecircus dans le forum Qt
    Réponses: 3
    Dernier message: 13/12/2006, 20h25
  4. QObject::connect: No such slot
    Par guepe dans le forum Qt
    Réponses: 2
    Dernier message: 22/12/2005, 10h24
  5. Qt::connect: no such slot ...
    Par fdrouhin dans le forum Qt
    Réponses: 8
    Dernier message: 02/12/2004, 19h11

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