Dessiner dans dragMoveEvent()
Bonjour
Je suis en train de coder un dialogue ou on peut glisser-déposer des élements entre 2 QListView.
Code:
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:
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