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 :

Dessiner dans dragMoveEvent()


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2006
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 96
    Par défaut Dessiner dans dragMoveEvent()
    Bonjour

    Je suis en train de coder un dialogue ou on peut glisser-déposer des élements entre 2 QListView.
    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
    class ColListView : public QListView {
    public:
    	ColListView (QWidget* parent=0);
    	virtual ~ColListView() {}
     
    protected:
    	void mousePressEvent(QMouseEvent *event) {
    		if (event->button() == Qt::LeftButton) {
    			m_dragStartPosition = event->pos();
    		}
    	}
    	void mouseMoveEvent(QMouseEvent *e);
     
    	void dragEnterEvent(QDragEnterEvent *event);
    	void dragLeaveEvent(QDragLeaveEvent* event);
    	void dragMoveEvent(QDragMoveEvent *event);
    	void dropEvent(QDropEvent *event);
     
    	void paintEvent(QPaintEvent *e);
     
    private:
    	QPoint m_dragStartPosition;
    	int m_currInsertRow;
    };
    L'objet QDrag est créé dans mouseMoveEvent.
    Tout fonctionne très bien. Je voudrais simplement maintenant pouvoir dessiner pendant le drag un trait noir entre les 2 lignes ou sera inséré l'element en fonction de la position du curseur.

    Je calcule m_currInsertRow dans dragMoveEvent puis appelle repaint().
    Seulement paintEvent n'est pas appelé pendant dragMoveEvent. Il l'est avant et après le drag mais pas pendant.
    même chose avec update().

    Voici dragMoveEvent et paintEvent :
    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
     
    void ColListView::dragMoveEvent(QDragMoveEvent *event) {
    	if (event->mimeData()->hasFormat("application/x-dnditemdata")) {
     
    		QModelIndex lastIndex = model()->index(model()->rowCount()-1, 0);
    		QRect lastRect = visualRect(lastIndex);
    		if (event->pos().y() > lastRect.bottom()) {
    			m_currInsertRow = model()->rowCount();
    		}
    		else {
    			m_currInsertRow = indexAt(event->pos()).row();
    		}
     
    		qDebug() << "drag move";
    		update();
     
    		if (event->source() == this) {
    			event->setDropAction(Qt::MoveAction);
    			event->accept();
    		} else {
    			event->acceptProposedAction();
    		}
    	} else {
    		event->ignore();
    	}
    }
     
     
    void ColListView::paintEvent(QPaintEvent *e) {
    	QListView::paintEvent(e);
    	qDebug() << "repaint";
    	if (m_currInsertRow >= 0) {
    		int y;
    		QRect r;
    		if (m_currInsertRow >= model()->rowCount()) {
    			QModelIndex lastIndex = model()->index(model()->rowCount()-1, 0);
    			r = visualRect(lastIndex);
    			y = r.bottom();
    		}
    		else {
    			QModelIndex index = model()->index(m_currInsertRow, 0);
    			r = visualRect(index);
    			y = r.top();
    		}
     
    		QPainter painter(viewport());
    		QPoint p1 (r.left()+2, y);
    		QPoint p2 (r.right()-2, y);
    		QPen pen (Qt::black);
    		pen.setWidth(2);
    		painter.setPen(pen);
    		painter.drawLine(p1, p2);
    	}
    }
    La sortie affiche beaucoup de "drag move" mais pas de "repaint" entre 2.

    Je code sous Windows avec QtCreator et msvc2008. Pas encore testé ce code sous linux ou OSX.

    Merci de votre aide !
    Rémi

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Salut,

    Le update() ajoute un paintEvent à l'eventloop. Celui-ci sera géré "quand l'application aura le temps". Tu peux appeler directement repaint() à la place, qui lui appelle méthode paintEvent immédiatement.

    Attention par contre, il est possible que trop de repaint() entraîne des problèmes. Du coup, je rajouterais une condition : vérifier que l'index visé à changer avant de faire ce repaint.

    Sinon, il y a la méthode "qApp->processEvents()" qui va demander à l'application d'effectuer immédiatement tous les events en attente.

    En espérant que ça règle de ton problème.

    G.

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    Citation Envoyé par Gulish Voir le message
    Sinon, il y a la méthode "qApp->processEvents()" qui va demander à l'application d'effectuer immédiatement tous les events en attente.
    Attention cependant à l'usage de cette méthode... un des events dans la file d'événements peut déclencher la destruction de l'objet courant ou d'un objet qui était correct avant l'appel, et donc peut entrainer un crash.
    Donc à utiliser avec précaution !

Discussions similaires

  1. Dessiner dans différents JPanels
    Par N@sH dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 20/05/2005, 15h39
  2. DBGrid, comment dessiner dans les titres des colonnes
    Par dleu dans le forum Bases de données
    Réponses: 9
    Dernier message: 04/11/2004, 17h49
  3. [debutant]dessins dans une fenetre
    Par drosophile dans le forum 2D
    Réponses: 4
    Dernier message: 04/11/2004, 14h55
  4. Dessin dans les panels d'un TStatusBar
    Par Amenofis dans le forum Composants VCL
    Réponses: 4
    Dernier message: 31/08/2004, 18h45
  5. Dessiner dans un JPanel
    Par Oliveuh dans le forum Composants
    Réponses: 5
    Dernier message: 19/07/2004, 12h13

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