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 :

Drag and Drop


Sujet :

Qt

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut Drag and Drop
    Bonjour,

    J'ai vu dans la doc de Qt qu'il est possible de faire un "drag and drop" en surchargant des fonctions comme "mousePressEvent", "mouseMoveEvent" , dragEnterEvent et QDropEvent.

    Puisque dans mon application je désire faire le "drag and drop" uniquement à l'intérieur d'une même QToolBar , je me demande s'il existe dejà une fonction simple pour faire ceci ?

    Merci

  2. #2
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    Salut,
    qu'est-ce tu essaies de faire rellement dans ta QToolBar ? Deplacer les icones à l'intérieur d'elle même ? ou pour voir glisser des icônes d'une zone quelconque vers ta QToolBar ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Citation Envoyé par Kestufou Voir le message
    Salut,
    qu'est-ce tu essaies de faire rellement dans ta QToolBar ? Deplacer les icones à l'intérieur d'elle même ? ou pour voir glisser des icônes d'une zone quelconque vers ta QToolBar ?
    Salut,
    merci pour ta réponse.
    Déplacer les icons à l'intérieur d'elle même.

  4. #4
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    Il ne me semble pas qu'il existe une fonction simple pour cela, à mon avis tu devrais coder toi même ce genre de choses. Ou sinon, tu peux creer autant de QToolBar que d'icônes (les QAction) et du coup, au lieu de déplacer l'icône, tu déplacerais la QToolBar complète ... mais ce n'est pas du tout une solution 'propre'. A toi de voir. Si tu décides de tout coder, tiens nous au jus quand ça marche.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Je vais laisser ca à un peu plustard puisque j'ai d'autres priorités dans mon application pour le moment. Je vous tiendrai au courant quand je reviendrai dessus.

    Merci

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Salut !

    Je suis de retour sur le drag and drop. Le drag fonctionne mais j'ai un petit problème avec le pixmap du drag.
    Avec vista, la taille de l'icon qui apparait pendant le drag est egale à la taille de l'icon que je drag et donc tous ce passe bien.
    Sur xp, la taille de l'icon semble prendre toujours une même valeur par défaut peut importe la taille de l'icon sur laquelle s'applique le drag.

    La taille du pixmap que j'applique au drag avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    drag->setPixmap(pixmap)
    correspond bien à la taille réelle de l'icon.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Nehmé Voir le message
    Salut !

    Je suis de retour sur le drag and drop. Le drag fonctionne mais j'ai un petit problème avec le pixmap du drag.
    Avec vista, la taille de l'icon qui apparait pendant le drag est egale à la taille de l'icon que je drag et donc tous ce passe bien.
    Sur xp, la taille de l'icon semble prendre toujours une même valeur par défaut peut importe la taille de l'icon sur laquelle s'applique le drag.

    La taille du pixmap que j'applique au drag avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    drag->setPixmap(pixmap)
    correspond bien à la taille réelle de l'icon.
    essai avec un autre style que celui par defaut.
    http://qt.developpez.com/faq/?page=qt4Gui#changerstyle
    Le style utilisé sous xp fait parfois des choses inattendu comme ne pas prendre en compte la couleur mis dans la palette d'un boutton.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Salut,

    J'ai changé le style mais ca rien donné.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    un peu de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	qDebug()<<pixmap.width();
     
    	QDrag *drag = new QDrag(this);
    	drag->setMimeData(mimeData);
    	drag->setPixmap(pixmap);
    	drag->setHotSpot(e->pos() - this->buttons[this->Actions.key(child)]->pos());
    	drag->start(Qt::MoveAction);
    Le width donné par qDebug() s'adapte bien à la taille de l'icon mais l'icon affiché pendant le drag est toujours de la même taille.

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    essai avec cette exemple
    http://qt.developpez.com/doc/4.4/dra...raggableicons/

    j'ai agrandi une des images et lors du drag and drop la taille est bien celle de la pixmap.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    essai avec cette exemple
    http://qt.developpez.com/doc/4.4/dra...raggableicons/

    j'ai agrandi une des images et lors du drag and drop la taille est bien celle de la pixmap.
    Est ce que t'es sous xp ?

    c'est en faite l'exemple sur lequel je me base, mais je ne peux pas suivre à la lettre puisque moi je drag des bouttons et je ne vois pas comment transformer des buttons en mimeData. Donc je me contente de faire un drag de l'icon qui est sur le button et ensuite je vais essayé de changer l'emplacement du button manuellement.

    voici le code pour le drag:
    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
     
    void pqSlideShowWidget::mouseMoveEvent(QMouseEvent *e)
    {
    	if(!(e->buttons() & Qt::LeftButton))
    		return;
     
    	QAction *child = this->actionAt(e->pos());
    	if(!child)
    		return;
    	if ((e->pos() - this->dragStartPosition).manhattanLength()
    		< 25)
    		 return;
     
    	pqToolButton *button = this->buttons[this->Actions.key(child)];
     
    	QPixmap pixmap = QPixmap::grabWidget(button);
    	QByteArray itemData;
    	QDataStream dataStream(&itemData, QIODevice::WriteOnly);
    	dataStream << pixmap << QPoint(e->pos() - button->pos());
     
    	QMimeData *mimeData = new QMimeData;
    	mimeData->setData("application/x-dnditemdata", itemData);
    	mimeData->setText(this->buttons.key(button));
     
    	qDebug()<<pixmap.width();
     
    	QDrag *drag = new QDrag(this);
    	drag->setMimeData(mimeData);
    	drag->setPixmap(pixmap);
    	drag->setHotSpot(e->pos() - this->buttons[this->Actions.key(child)]->pos());
    	drag->start(Qt::MoveAction);
    }

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Nehmé Voir le message
    Est ce que t'es sous xp ?
    oui.

    As tu mis un thème particulier sur ton XP?

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    oui.

    As tu mis un thème particulier sur ton XP?
    Oui mais j'ai essayé avec le theme original et avec le theme classic

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    je devrais essayé avec un autre xp

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Nehmé Voir le message
    Oui mais j'ai essayé avec le theme original et avec le theme classic
    il y as certain thème (comme un qui fait ressembler XP à vista) fait faire n'importe quoi à Qt

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    J'ai pas encore résolu le problème de l'icon mais j'ai une autre question:

    Dans ma toolbar j'ai des toolButton et apparement tous les events qui arrive sur les bouttons ne sont pas transférés au parent qui est ma toolbar, ce qui me cause un gros problème.

    Ce qui m'a obligé à instancier QToolButton et faire event->ignore() pour tous les events que je veux que ma toolbar recoit.

    Le dragLeaveEvent est supposé se déclencher lorsque l'icon sort de la toolbar, mais dû au même problème, le dragLeaveEvent se déclenche aussi lorsque l'icon est au dessus d'un autre toolButton.
    J'ai essayé d'utiliser LeaveEvent à la place, mais lui aussi ne déclenche pas pendant un drag. Et d'après la doc de Qt, underMouse() n'est pas mis à jour pendant le drag and drop !

    Comment faire la différence alors entre :
    - le drag est sorti de la toolbar
    - le drag est au dessus d'un boutton sur la toolbar

    Merci

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    il y as certain thème (comme un qui fait ressembler XP à vista) fait faire n'importe quoi à Qt
    J'ai essayé sur un autre ordinateur avec xp et le pixmap se passe très bien.
    Les différences entre les 2 xp sont:
    celui où sa ne fonctionne pas:
    - uxtheme.dll patché
    - sp3

    celui où sa fonctionne:
    - uxtheme.dll original
    - sp2

    J'imagine que c'est bien le theme

    Merci Mongaulois

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Citation Envoyé par Nehmé Voir le message
    J'ai pas encore résolu le problème de l'icon mais j'ai une autre question:

    Dans ma toolbar j'ai des toolButton et apparement tous les events qui arrive sur les bouttons ne sont pas transférés au parent qui est ma toolbar, ce qui me cause un gros problème.

    Ce qui m'a obligé à instancier QToolButton et faire event->ignore() pour tous les events que je veux que ma toolbar recoit.

    Le dragLeaveEvent est supposé se déclencher lorsque l'icon sort de la toolbar, mais dû au même problème, le dragLeaveEvent se déclenche aussi lorsque l'icon est au dessus d'un autre toolButton.
    J'ai essayé d'utiliser LeaveEvent à la place, mais lui aussi ne déclenche pas pendant un drag. Et d'après la doc de Qt, underMouse() n'est pas mis à jour pendant le drag and drop !

    Comment faire la différence alors entre :
    - le drag est sorti de la toolbar
    - le drag est au dessus d'un boutton sur la toolbar

    Merci
    Je fais juste recopier ca parce que le dernier message est toujours le plus visible

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Bon j'ai codé ma propre fonction underMouse() qui fonctionne pendant le drag. Comme ca à l'interieur de mon dragLeaveEvent() je vérifie si je suis vraiment à l'extérieur de ma toolbar ou non. Il reste que c'est pas vraiment trop "propre" comme façon et je ne sais pas si c'est lent.
    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
     
    bool pqSlideShowWidget::underMouse2()
    {
    	QPoint topLeft = this->mapToGlobal(this->pos());
    	QPoint bottomRight = topLeft + QPoint(this->width(),this->height());
    	QPoint cursor = QCursor::pos();
    	QPoint delta1 = cursor - topLeft;
    	QPoint delta2 = cursor - bottomRight;
     
    	if(delta1.x()<0 || delta1.y()<0 || delta2.x()>0 || delta2.y()>0)
    	{
    		return false;
    	}
    	else
    	{
    		return true;
    	}
    }

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Finalement j'ai décidé de garder le button qui subit le drag à sa place tant que le drag n'est pas terminé. une fois le drag terminé je le place à sa nouvelle position. Dans ce cas je n'ai plus à me soucier du drop qui peut arriver à l'extérieur de ma toolbar. C'est ce que Qt fait pour leur QListWidget par exemple. S'ils font ca pour la même raison que moi, à mon avis Qt n'est pas super pour le drag and drop.
    En tout cas voici le code complet de ma widget si ca peut servir à quelqu'un. C'est une QToolBar dans un QScrollArea qui à son tour est dans une QDockWidget:

    pqSlideShowWidget.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
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
     
    #ifndef _pqSlideShowWidget_h
    #define _pqSlideShowWidget_h
     
    #include "pqComponentsExport.h"
    #include "pqSlideShowWidgetCore.h"
     
    #include <QScrollArea>
    #include <QWidget>
    #include <QMouseEvent>
    #include <QResizeEvent>
    #include <QVBoxLayout>
    #include <QToolButton>
    #include <QToolBar>
    #include <QDockWidget>
    #include <QMap>
    #include <QSet>
    #include <QtDebug>
     
    class pqSlideShowWidgetCore;
     
     
    class pqSlideShowScroll: public QScrollArea
    {
    	Q_OBJECT
     
    public:
    	pqSlideShowScroll(QWidget *parent = 0): QScrollArea(parent){}
    	~pqSlideShowScroll(){}
     
    signals:
     
    	void sizeChanged(int);
     
    protected:
    	void resizeEvent(QResizeEvent * e)
    	{
    		emit sizeChanged(e->size().width());
    		QScrollArea::resizeEvent(e);
    	}
     
    private:
    };
     
     
    class pqToolButton: public QToolButton
    {
    	Q_OBJECT
     
    public:
    	pqToolButton(QWidget *parent = 0): QToolButton(parent)
    	{	
    	}
    	~pqToolButton(){}
     
    signals:
     
    protected:
    	void mousePressEvent(QMouseEvent *e)
    	{
    		this->setDown(true);
    		e->ignore();
    	}
     
    	void mouseMoveEvent(QMouseEvent *e)
    	{
    		e->ignore();
    	}
     
    	void leaveEvent(QEvent* event)
    	{
    		event->ignore();
    	}
     
    	void EnterEvent(QEvent* event)
    	{
    		event->ignore();
    	}
     
    	void dragEnterEvent(QDragEnterEvent *event)
    	{
    		event->ignore();
    	}
     
     
     
    private:
     
    };
     
     
     
    class pqSlideShowWidget :
      public QToolBar
    {
      Q_OBJECT
     
    public:
    	pqSlideShowWidget(QDockWidget *parent = 0);
     
    	~pqSlideShowWidget(){}
    	void setCore(pqSlideShowWidgetCore *c);
     
    	void addButton(pqToolButton *button);
     
    	void setupSlideShowWidget(QDockWidget *p);
    	void selectButton(QString name, int mode);
    	void selectAllButtons();
    	void unSelectButton(QString &name);
    	void unSelectAllButtons();
    	void toogleButtonSelection(QString &name);
    	QSet<QString> getSelection() const;
    	void removeButton(QString &name);
    	void updateButton(QString &name, QIcon icon);
    	void renameButton(QString &oldName, QString &name);
    	pqToolButton* getButton(QString &name);
    	void getActions(QMap<QString,QAction*> &a);
    	void getButtons(QMap<QString,pqToolButton*> &b);
    	void reset();
    	bool underMouse2();
     
     
      enum
        {
        ADD_TO_SELECTION=0,
        CLEAR_AND_SELECT
        };
     
    public slots:
    	void updateSize(int w);
    	void onSelectAllButtons();
     
     
     
    signals:
    	void deSelectAll();
    	void rightClick(QPoint);
     
    protected:
    	void mousePressEvent(QMouseEvent *e);
    	void mouseMoveEvent(QMouseEvent *e);
    	void mouseReleaseEvent(QMouseEvent *event);
      void dragEnterEvent(QDragEnterEvent *event);
    	void dragLeaveEvent(QDragLeaveEvent *event);
      void dragMoveEvent(QDragMoveEvent *event);
      void dropEvent(QDropEvent *event);
     
     
     
    private:
    	pqSlideShowWidgetCore *core;
    	QVBoxLayout *layout;
    	int numberOfChild;
    	pqSlideShowScroll *s;
     
    	QDockWidget *Parent;
     
    	QMap<QString,pqToolButton*> buttons;
    	QMap<QString,QAction*> Actions;
    	QSet<QString> selectedButtons;
     
    	QPoint dragStartPosition; 
    	QAction *draggedAction;
    	QAction* dragAndDropSpacer;
    	pqToolButton* dragAndDropSpacerW;
    	QAction* last;
    	int draggedActionIndex;
     
     
    };
     
     
     
    #endif
    pqSlideShowWidget.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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
     
    #include "pqSlideShowWidget.h"
     
    #include <QPixmap>
    #include <QIcon>
    #include <QAction>
    #include <QPoint>
    #include <QDrag>
    #include <QMimeData>
    #include <QPainter> 
    #include <QByteArray>
    #include <QDataStream>
    #include <QApplication>
    #include <QLabel>
    #include <QCursor>
     
     
    pqSlideShowWidget::pqSlideShowWidget(QDockWidget *parent): QToolBar(parent)
    {
    	this->draggedActionIndex = -1;
     
    	this->dragAndDropSpacer = new QAction(this);
    	this->dragAndDropSpacerW = new pqToolButton();
    	this->setAcceptDrops(true);
    	this->dragAndDropSpacerW->setStyleSheet("color: green; background-color: yellow");
     
    }
     
     
    //=========================================================================================================
    void pqSlideShowWidget::setupSlideShowWidget(QDockWidget *p)
    {
    	this->Parent = p;
     
    	this->setIconSize(QSize(80,80));
    	this->setShown(false);
     
    	this->setMovable(true);
    	this->setFloatable(true);
     
    	this->setOrientation(Qt::Vertical);
    	this->setSizePolicy(QSizePolicy::Minimum ,QSizePolicy::Minimum );
      s = new pqSlideShowScroll();
    	s->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    	s->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
      s->setWidgetResizable(true);
      s->setObjectName("ScrollArea");
      s->setFrameShape(QFrame::NoFrame);
    	s->setWidget(this);
     
    	p->setWidget(s);
     
     
    	this->setShown(false);
     
    	QObject::connect(this->s,SIGNAL(sizeChanged(int)),this,SLOT(updateSize(int)));
     
    }
     
     
    //=========================================================================================================
    void pqSlideShowWidget::mousePressEvent(QMouseEvent *e)
    {
     
    	// if the user press any where on the widget, the selected buttons must be deselected
    	if(e->button() == Qt::LeftButton)
    	{
    		QAction *child = this->actionAt(e->pos());
    		if(!child)
    		{
    			this->unSelectAllButtons();
    			this->dragStartPosition = QPoint(-1,-1);
    		}
    		else
    		{
    			this->dragStartPosition = e->pos();
    		}
    	}
     
    	else if(e->button() == Qt::RightButton)
    	{
    		for(QMap<QString,QAction*>::iterator it = this->Actions.begin();
    			it != this->Actions.end(); it++)
    		{
    			//if the current action position is equal to the right click position
    			if(it.value() == this->actionAt(e->pos())) 
    			{
    				//if the action was not selected
    				if(this->buttons[it.key()]->styleSheet() == "border: none")
    				{
    					this->selectButton(it.key(),this->CLEAR_AND_SELECT);
    				}
    			}
    		}
    	}
    	QToolBar::mousePressEvent(e);
    }
     
     
    //=========================================================================================================
    void pqSlideShowWidget::mouseMoveEvent(QMouseEvent *e)
    {
    	if(this->actions().size() < 2)
    		return;
     
    	if(!(e->buttons() & Qt::LeftButton))
    		return;
     
    	this->draggedAction = this->actionAt(this->dragStartPosition);
    	if(!this->draggedAction)
    		return;
    	if ((e->pos() - this->dragStartPosition).manhattanLength()
    		< 25)
    		 return;
     
    	pqToolButton *button = this->buttons[this->Actions.key(this->draggedAction)];
     
    	QPixmap pixmap = this->draggedAction->icon().pixmap(this->iconSize());//QPixmap::grabWidget(button);
    	QByteArray itemData;
    	QDataStream dataStream(&itemData, QIODevice::WriteOnly);
    	dataStream << pixmap << QPoint(e->pos() - button->pos());
     
    	QMimeData *mimeData = new QMimeData;
    	mimeData->setData("application/x-dnditemdata", itemData);
    	mimeData->setText(this->buttons.key(button));
     
    	//qDebug()<<pixmap.width();
    	this->draggedActionIndex = this->actions().indexOf(this->draggedAction);
    	//this->removeAction(this->draggedAction);
     
    	QDrag *drag = new QDrag(this);
    	drag->setMimeData(mimeData);
    	drag->setPixmap(pixmap);
    	drag->setHotSpot(e->pos() - this->buttons[this->Actions.key(this->draggedAction)]->pos());
    	drag->start();
     
    	QToolBar::mouseMoveEvent(e);
     
    	//this->setShown(false);
    	//this->setShown(true);
    }
     
    //=========================================================================================================
    void pqSlideShowWidget::dragEnterEvent(QDragEnterEvent *event)
    {
    	if(event->source() == this) 
    	{
    		event->accept();
    	} 
    	else 
    	{
    		event->ignore();
    	}
    }
     
     
    //=========================================================================================================
    bool pqSlideShowWidget::underMouse2()
    {
    	QPoint topLeft = this->mapToGlobal(this->pos());
    	QPoint bottomRight = topLeft + QPoint(this->width(),this->height());
    	QPoint cursor = QCursor::pos();
    	QPoint delta1 = cursor - topLeft;
    	QPoint delta2 = cursor - bottomRight;
     
    	if(delta1.x()<0 || delta1.y()<0 || delta2.x()>0 || delta2.y()>0)
    	{
    		return false;
    	}
    	return true;
    }
     
     
    //=========================================================================================================
    void pqSlideShowWidget::dragLeaveEvent(QDragLeaveEvent *event)
    {
    	if(!this->underMouse2())
    	{
    		this->removeAction(this->dragAndDropSpacer);
    	}
    	/*
    		if(this->draggedActionIndex == -1)
    		{
    			return;
    		}
     
    		int size = this->actions().size();
     
    		if(draggedActionIndex >= size)
    		{
    			this->addAction(this->draggedAction);
    		}
    		else
    		{
    			this->insertAction((this->actions())[draggedActionIndex],this->draggedAction);
    		}
     
    		this->draggedActionIndex = -1;
    		this->removeAction(this->dragAndDropSpacer);
    		event->accept();
    		}
    */
    }
     
    //=========================================================================================================
    void pqSlideShowWidget::mouseReleaseEvent(QMouseEvent *event)
    {
    	QToolBar::mouseReleaseEvent(event);
    }
     
    //=========================================================================================================
    void pqSlideShowWidget::dragMoveEvent(QDragMoveEvent *event)
    {
    	if (event->source() == this) 
    	{
    		QAction *current = this->actionAt(event->pos());
    		int currentIndex;
    		if(current)
    		{
    			if(current == this->dragAndDropSpacer )
    				return;
     
    			currentIndex = this->actions().indexOf(current);
    		}
    		else
    		{
    			currentIndex = -1;
    			if((event->pos() - this->widgetForAction(this->actions().back())->pos()).manhattanLength()>this->width()
    				&& event->pos().y()>0)
    			{
    				this->removeAction(this->dragAndDropSpacer);
    				this->last = NULL;
    			}
    			return;
    		}
     
    		if(current != this->last)
    		{
    			this->last = current;
    			this->removeAction(this->dragAndDropSpacer);
    			this->dragAndDropSpacerW = new pqToolButton();
    			int w = this->widgetForAction(current)->width();
    			this->dragAndDropSpacerW->setIcon(QIcon(":/pqWidgets/Icons/pqRedo16.png"));
    			this->dragAndDropSpacerW->setFixedSize(w,w/5);
    			this->dragAndDropSpacerW->setStyleSheet("background-color: yellow");
    			this->dragAndDropSpacer = this->insertWidget(current,this->dragAndDropSpacerW);
    		}
     
    			event->accept();
    	} 
    	else 
    	{
    		event->ignore();
    	}
    }
     
     
    //=========================================================================================================
    void pqSlideShowWidget::dropEvent(QDropEvent *event)
    {
     
    	this->draggedActionIndex = -1;
    	this->removeAction(this->draggedAction);
     
    	QString name = event->mimeData()->text();
     
    	QAction *current = this->actionAt(event->pos());
     
    	if(this->actions().contains(this->dragAndDropSpacer))
    	{
    		this->insertAction(this->dragAndDropSpacer,draggedAction);
    	}
    	else
    	{
    		this->addAction(draggedAction);
    	}
    	this->removeAction(this->dragAndDropSpacer);
    	this->last = NULL;
    }
     
    //=========================================================================================================
    void pqSlideShowWidget::setCore(pqSlideShowWidgetCore *c)
    {
    	this->core = c;
    }
     
     
    //=========================================================================================================
    void pqSlideShowWidget::updateSize(int w)
    {
    	w = w-10;
    	this->setIconSize(QSize(w,w));
     
    	for(QMap<QString,pqToolButton*>::iterator it = this->buttons.begin();
    		it != this->buttons.end(); it++)
    	{
    		it.value()->setStyleSheet(it.value()->styleSheet());
    	}
    	this->setShown(false);
    	this->setShown(true);
    }
     
     
    //=========================================================================================================
    void pqSlideShowWidget::addButton(pqToolButton *button)
    {
    	QAction *action = this->addWidget(button);
    	action->setIcon(button->icon());
     
    	this->buttons[button->toolTip()] = button;
    	this->Actions[button->toolTip()] = action;
    	this->setShown(false);
    	this->setShown(true);
    }
     
    //=========================================================================================================
    void pqSlideShowWidget::toogleButtonSelection(QString &name)
    {
    	if(this->selectedButtons.contains(name))
    	{
    		this->unSelectButton(name);
    	}
    	else
    		this->selectButton(name,ADD_TO_SELECTION);
    }
     
     
    //=========================================================================================================
    void pqSlideShowWidget::selectButton(QString name, int mode)
    {
    	if(mode)
    	{
    		this->unSelectAllButtons();
    	}
    	this->selectedButtons.insert(name);
    	this->buttons[name]->setStyleSheet("border: 2px solid #00ff00");
    }
     
     
     
    //=========================================================================================================
    void pqSlideShowWidget::unSelectButton(QString &name)
    {
    	this->selectedButtons.remove(name);
    	this->buttons[name]->setStyleSheet("border: none");
    }
     
     
     
    //=========================================================================================================
    void pqSlideShowWidget::unSelectAllButtons()
    {
    	this->selectedButtons.clear();
    	for(QMap<QString,pqToolButton*>::iterator it = this->buttons.begin();
    		it != this->buttons.end(); it++)
    	{
    			it.value()->setStyleSheet("border: none");
    	}
    }
     
     
    QSet<QString> pqSlideShowWidget::getSelection() const
    {
    	return this->selectedButtons;
    }
     
     
     
    //=========================================================================================================
    //delete the last view selected with the SlideShow toolbar. 
    void pqSlideShowWidget::removeButton(QString &name)
    {
    	this->selectedButtons.remove(name);
    	this->removeAction(this->Actions[name]);
    	this->Actions.remove(name);
    	this->buttons.remove(name);
     
    	//refresh the toolbar to see changes
    	this->show();
    }
     
     
    //=========================================================================================================
    void pqSlideShowWidget::updateButton(QString &name, QIcon icon)
    {
    	this->buttons[name]->setIcon(icon);
    }
     
     
    //=========================================================================================================
    void pqSlideShowWidget::renameButton(QString &oldName, QString &name)
    {
    	this->Actions[name] = this->Actions[oldName];
    	this->Actions.remove(oldName);
    	this->buttons[name] = this->buttons[oldName];
    	this->buttons.remove(oldName);
    	this->buttons[name]->setToolTip(name);
    }
     
     
    //=========================================================================================================
    pqToolButton* pqSlideShowWidget::getButton(QString &name)
    {
    	return this->buttons[name];
    }
     
     
     
    //=========================================================================================================
    void pqSlideShowWidget::getButtons(QMap<QString,pqToolButton*> &b)
    {
    	b = this->buttons;
    }
     
     
     
    //=========================================================================================================
    void pqSlideShowWidget::getActions(QMap<QString,QAction*> &a)
    {
    	a = this->Actions;
    }
     
     
    //=========================================================================================================
    void pqSlideShowWidget::reset()
    {
    	this->clear();
    	this->selectedButtons.clear();
    	this->buttons.clear();
    	this->Actions.clear();
    }
     
     
    //=========================================================================================================
    void pqSlideShowWidget::onSelectAllButtons()
    {
    	for(QMap<QString,pqToolButton*>::iterator it = this->buttons.begin();
    		it != this->buttons.end(); it++)
    	{
    			it.value()->setStyleSheet("border: 2px solid #00ff00");
    			this->selectedButtons.insert(it.key());
    	}
    }
    Les variables qui sont hors sujet, sont reliés à d'autres classes dans mon projet.

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

Discussions similaires

  1. Drag and drop "de l'extérieur"
    Par Invité dans le forum C++Builder
    Réponses: 12
    Dernier message: 31/03/2020, 10h10
  2. "Drag and drop" avec directinput
    Par batosai dans le forum DirectX
    Réponses: 1
    Dernier message: 16/06/2004, 16h48
  3. [VB.NET] Microsoft TreeView drag and drop ?
    Par bigtoof dans le forum ASP.NET
    Réponses: 7
    Dernier message: 24/05/2004, 14h50
  4. [JSP][DRAG AND DROP]
    Par hamed dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 23/01/2004, 17h36
  5. drag and drop
    Par jujuesteban dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/06/2003, 09h23

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