Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.3.1 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

[Qt3] Signal et Slot

Bonjour.

J'ai une classe CTreeAlbumKey qui derive de QListView.
Je derive la fonction mousePressEvent


Mais je ne parvient pas à recuperer l'evenement mousePressEvent. quand l'appli tourne

J'aimerais savoir comment faire.

Merci

Réponses

  • QlistView ne possede pas de methode mousePressEvent.
    Par contre il y a QWidget::mousePressEvent(QMouseEvent *event).

    Il y a (entre autre) pour QListView :
    doubleClicked
    rightButtonClicked
    rightButtonPressed
    mouseButtonPressed
    mouseButtonClicked

    ce n'est pas plutot de l'un de ces SIGNALS que tu parles ?
  • Dans la mesure ou qwidget les possede, je ne comprend pas pourquoi ma classe ne peut pas l'utiliser.

    Comment dire à ma classe de reagir à mousePressEvent(...)

    merci
  • harg ... tu as repondu avant mon edit...

    mais cela ne repond pas a la question ... si c'est pour agir sur ta listviex les signaux que je t'ai indique sont plus ...indique justement !
  • En fait , je souhaite implementer le drag & drop donc je dois avoir acces à mousemove et mousepress.
  • jamais fait de drag&drop .... mais as tu regarde du cote de QDragObject et consorts ?
  • je sait comment le faire. Le probleme est justement l'utilisation de mousePress et mouveMove
  • CTreeAlbumKey::mousePressEvent(QMouseEvent *event)
    {
    if (event->button() == LeftButton)
    // faire truc
    else if (event->button() == RightButton)
    // faire chose
    }
    tu as aussi pour suivre les mouvements : mouseMovevent(QMouseEvent *event) mais il n'emet que si le bouton de la souris est "down".
  • CTreeAlbumKey::mouseMoveEvent(QMouseEvent *event) 
    {
    if (event->state() & LeftButton)
    // faire truc
    else if (event->state() & RightButton)
    // faire chose
    }
  • CA je l'ai fait, le probleme c'est que l'evenement ne se produit pas. j'ai beau passer la souris au dessus du composant, rien ne se passe.

    Je pense que je vais essayer de faire ca autrement.

    Merci
  • mouseMoveEvent n'est appele que si le bouton est "down". Si tu passes seulement la souris, il n'est pas appele.
    C'est toujours pas ca ton pb ?
  • C'est pas ca car le probleme est le même pour le mousePress
  • bizarre que ca ne fonctionne pas ...

    tu peut toujours installer un EventFilter sur le widget que tu veut surveiller et intercepter la les "bons" evenements?
  • Je pense que le probleme vient du fait que j'ai commencer une appli avec qtdesigner et j'ai ensuite fait evolué les composants standard que j'ai remplacer par les miens.

    Ca a du mettre le souk.

    Je vais tester avec un main.c qui contiendra seulement un Qapplication et ma classe.

    Je verrai.

    Merci
  • juste une precision : les events sont propages de fils en pere il me semble, donc si un fils le "capture" alors si tu attend l'event sur un parent tu es marron ...
    Ca peut peut-etre expliquer ton pb ??? Car sinon, je vois pas pourquoi ca ne marche pas ... ca devrait ...
    Quand tu auras trouve le pourquoi de la chose, fait le savoir pour qu'on puisse comprendre.
    bon courage!
  • Pour compléter le sujet, voici un source complet de deux listes autorisant le Drag et drop entre elles. Le type d'objet transféré de l'une à l'autre est effectivement vérifié afin de ne pas insérer
    n'importe quoi. Bon courage, jean-luc Biord


    dragdrop.h :

    #include <qdialog.h>

    class DragDrop:public QDialog
    {
    public:
    DragDrop (QWidget * parent, const char *name = 0, bool modal = false);
    };
    dragdrop.cpp

    #include "dragdrop.h"
    #include "listefruits.h"

    DragDrop::DragDrop (QWidget * parent, const char *name, bool modal):
    QDialog (parent, name, modal)
    {
    ListeFruits *liste1 = new ListeFruits (this);
    liste1->setGeometry (20, 20, 150, 100);
    ListeFruits *liste2 = new ListeFruits (this);
    liste2->setGeometry (190, 20, 150, 100);
    liste2->viewport ()->setAcceptDrops (true);
    liste1->insertItem ("Pomme");
    liste1->insertItem ("Poire");
    liste1->insertItem ("Raisin");
    liste1->insertItem ("Orange");
    }
    listefruits.h :

    #include <qlistbox.h>

    class ListeFruits:public QListBox
    {
    Q_OBJECT public:
    ListeFruits (QWidget * parent, const char *name = 0);
    protected:
    void contentsMousePressEvent (QMouseEvent * e);
    void contentsMouseMoveEvent (QMouseEvent * e);
    void contentsDragEnterEvent (QDragEnterEvent *);
    void contentsDropEvent (QDropEvent *);
    private:
    void startDrag ();
    QPoint dragPos;
    };
    listfruits.cpp :

    #include <qapplication.h>
    #include <qlistbox.h>
    #include <qpoint.h>
    #include <qdragobject.h>
    #include "listefruits.h"

    ListeFruits::ListeFruits (QWidget * parent, const char *name):
    QListBox (parent, name)
    {
    viewport ()->setAcceptDrops (true);
    }

    void
    ListeFruits::contentsMousePressEvent (QMouseEvent * e)
    {
    if (e->button () == LeftButton)
    dragPos = e->pos ();
    QListBox::contentsMousePressEvent (e);
    }

    void
    ListeFruits::contentsMouseMoveEvent (QMouseEvent * e)
    {
    if (e->state () & LeftButton)
    {
    int distance = (e->pos () - dragPos).manhattanLength ();
    if (distance > QApplication::startDragDistance ())
    startDrag ();
    }
    QListBox::contentsMouseMoveEvent (e);
    }

    void
    ListeFruits::contentsDragEnterEvent (QDragEnterEvent * e)
    {
    e->accept (e->provides ("text/x-fruits"));
    }

    void
    ListeFruits::contentsDropEvent (QDropEvent * e)
    {
    QString fruit;
    if (QTextDrag::decode (e, fruit))
    {
    QWidget *fromWidget = e->source ();
    if (fromWidget && fromWidget != this
    && fromWidget->inherits ("ListeFruits"))
    {
    ListeFruits *fromListeFruits = (ListeFruits *) fromWidget;
    QListBoxItem *item = fromListeFruits->findItem (fruit, ExactMatch);
    delete item;
    insertItem (fruit);
    }
    }
    }

    void
    ListeFruits::startDrag ()
    {
    QString ligne = currentText ();
    if (!ligne.isEmpty ())
    {
    QTextDrag *drag = new QTextDrag (ligne, this);
    drag->setSubtype ("x-fruits");
    drag->drag ();
    }
    }
    et enfin main.cpp :

    #include <qapplication.h>
    #include <qdialog.h>
    #include "dragdrop.h"

    int
    main (int argc, char **argv)
    {
    QApplication app (argc, argv);
    DragDrop dialog (0, 0, TRUE);
    app.setMainWidget (&dialog);
    dialog.exec ();
    return 0;
    }
Connectez-vous ou Inscrivez-vous pour répondre.