Bonjour
Je suis en train de coder un dialogue ou on peut glisser-déposer des élements entre 2 QListView.
L'objet QDrag est créé dans mouseMoveEvent.
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; };
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 :
La sortie affiche beaucoup de "drag move" mais pas de "repaint" entre 2.
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); } }
Je code sous Windows avec QtCreator et msvc2008. Pas encore testé ce code sous linux ou OSX.
Merci de votre aide !
Rémi
Partager