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 Quick Discussion :

Glisser-déposer entre ListView


Sujet :

Qt Quick

  1. #1
    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 : 35
    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 Glisser-déposer entre ListView
    Bonjour,

    J'aimerais, pour commencer, savoir s'il est possible de "drag" un élément d'une ListView vers en-dehors de celle-ci, dans le cas où cette ListView est affichée par une QDeclarativeView au cœur d'une application Qt/C++.

    Donc en gros pour commencer, j'aimerais pouvoir prendre un item QML, et le balader avec ma souris au-dessus de ma fenêtre Qt/C++.

  2. #2
    Responsable Qt & Livres


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

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 605
    Points
    188 605
    Par défaut


    Apparemment, pas grand-chose de base en QML pour ça, mais il y a au moins un projet pour ajouter le support du glisser-déposer : https://bitbucket.org/gregschlom/qml-drag-drop. Ça semble utiliser du QGraphicsItem pour ajouter ça, ça pourrait convenir.
    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 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 : 35
    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
    C'est la première chose que j'ai essayée, mais :
    - compilé en 4.8, ça ne fonctionne pas (le glisser, le déposer fonctionne, par exemple si j'attrape un fichier externe et que je le dépose, je capte l'événement)
    - les deux éléments sont au sein d'une même QDeclarativeView, et comme le glisser ne fonctionne pas, je ne peux pas tester si je peux faire sortir l'élément de la vue.

  4. #4
    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 : 35
    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
    Bon j'ai réussi à simuler un glisser-déposer au mousePress en suivant l'exemple "draggableicons". Je balade une image copie de l'item cliqué, en utilisant QDrag. Je capte bien le dropEvent dans ma classe... du moment que je lâche le QDrag dans la marge entre le widget conteneur et la QDeclarativeView.

    Pour ne plus avoir le curseur "drop interdit" au-dessus de la declarative view, j'ai fait :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    m_view->rootObject()->setAcceptDrops ( true );
    Ça, c'est bon.

    Par contre, je n'arrive pas à faire remonter d'événement à ma classe conteneur, malgré l'installation du filtre d'événements à tous les niveaux (m_view, m_view->viewPort(), m_view->rootObject()).

    Code C++ : 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
    bool QMLListWidget::eventFilter ( QObject* obj, QEvent* e )
    {
        qDebug() << e->type(); // jamais rien
        switch ( e->type() ) {
            case QEvent::DragEnter:
            case QEvent::DragMove:
            case QEvent::Drop:
            case QEvent::GraphicsSceneDragEnter:
            case QEvent::GraphicsSceneDragMove:
            case QEvent::GraphicsSceneDrop:
                e->accept(); // ?
                return true; // ?
                break;
            default:
                return QWidget::eventFilter ( obj, e );
                break;
        }
    }

    Donc :
    1) Il faudrait que je capte les événements de drag & drop qui arrivent dans la QDeclarativeView
    2) Il faudrait que je sâche comment faire pour les transmettre au conteneur (QMLListWidget)
    3) Je vois un dernier problème se profiler, si je reçois des événements "GraphicsScene", comment les convertir en événements traitables dans QMLListWidget (héritant de QWidget) ?

  5. #5
    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 : 35
    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
    Pour répondre à 3), j'ai trouvé dans les sources de Qt comment se fait la conversion :

    Code C++ : 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
    /*!
        \internal
    */
    void QGraphicsViewPrivate::populateSceneDragDropEvent(QGraphicsSceneDragDropEvent *dest,
                                                          QDropEvent *source)
    {
    #ifndef QT_NO_DRAGANDDROP
        Q_Q(QGraphicsView);
        dest->setScenePos(q->mapToScene(source->pos()));
        dest->setScreenPos(q->mapToGlobal(source->pos()));
        dest->setButtons(source->mouseButtons());
        dest->setModifiers(source->keyboardModifiers());
        dest->setPossibleActions(source->possibleActions());
        dest->setProposedAction(source->proposedAction());
        dest->setDropAction(source->dropAction());
        dest->setMimeData(source->mimeData());
        dest->setWidget(viewport);
        dest->setSource(source->source());
    #else
        Q_UNUSED(dest)
        Q_UNUSED(source)
    #endif
    }

    Pour 1) et 2), n'ayant pas de réponse avec un moyen simple, je vais utiliser https://bitbucket.org/gregschlom/qml-drag-drop pour faire ma DropArea et remonter les infos avec un signal... J'espérais ne pas devoir en arriver là.

  6. #6
    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 : 35
    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
    Désolé je me réponds seul mais ça peut aider ceux qui passent.

    L'exemple https://bitbucket.org/gregschlom/qml-drag-drop fonctionne, seulement dans app.qml, dans la DragArea, il faut mettre l'attribut autoStart à true (c'est ce qu'il manque).

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/11/2014, 11h36
  2. Glisser-déposer entre QWidget différents
    Par EvaBraun dans le forum Débuter
    Réponses: 1
    Dernier message: 24/11/2012, 10h59
  3. Glisser-déposer entre deux QTreeView
    Par sfarc dans le forum Débuter
    Réponses: 21
    Dernier message: 16/05/2012, 10h59
  4. Glisser-déposer entre deux zones de listes
    Par Arkham46 dans le forum Contribuez
    Réponses: 2
    Dernier message: 13/04/2012, 12h20
  5. Réponses: 1
    Dernier message: 16/09/2011, 17h28

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