Je dois faire quelque chose comme l'interface iOS, 3x3 champ d'icônes qui peuvent être glissées pour changer leur position, puis se souvenir dans le fichier XML. J'ai décidé d'utiliser la classe Grid (QWidget est parent) comme un conteneur et mes propres clas hérités de QWidget en tant qu'éléments. Maintenant, j'essaie d'apprendre comment effectuer un glisser-déposer pour QWidget, mais il semble que vous ne puissiez que tomber sur un QWidget, mais il est impossible de le faire glisser. Est-ce vrai ou juste que je suis retard? Comment puis-je déplacer cette chose? x.xFaire glisser un QWidget dans QT 5
Répondre
Faire glisser un widget n'est pas si simple. Il faut beaucoup de codage à faire soi-même.
De l'Qt Docs:
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton
&& iconLabel->geometry().contains(event->pos())) {
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
mimeData->setText(commentEdit->toPlainText());
drag->setMimeData(mimeData);
drag->setPixmap(iconPixmap);
Qt::DropAction dropAction = drag->exec();
...
}
}
Cela signifie, lorsque votre widget reçoit un message qu'il doit être traîné, par exemple Comme avec un mousepress, il doit créer un objet QDrag.
Dans l'objet QDrag, vous pouvez définir un pixmap qui représente votre widget déplacé. Si vous masquez votre widget à ce stade, il semble que le pointeur de la souris ait «pris» le widget.
De plus, vous avez besoin d'un objet QMimeData. En cela, vous pouvez mettre toutes sortes de données, ce qui décrit votre widget. Dans votre cas d'utilisation quelque chose qui vous permet d'identifier votre widget. Parce que, et voici la partie difficile: Vous devez faire le déplacement vous-même.
Le widget, qui est le parent de la grille, reçoit l'événement drop et lit à partir des données mime, quel widget me souhaite être déplacé. Depuis le QDropEvent, il obtient le point où le widget doit être déplacé. C'est ce que vous devez coder: Le repositionnement réel dans votre disposition de la grille. Et n'oubliez pas de mettre à jour le fichier XML.
et que diriez-vous juste je me souviens quel élément se déplaçait, lire sur quel autre élément il a été abandonné, puis se rappeler le deuxième, le remplacer par premier et mettre deuxième sur la place du premier avec addWidget() et removeWidget()? –
@Leonid Bor, l'objet QDrag vous donne un moyen d'avoir une icône sous le pointeur de votre souris. Et il donne à un moyen de transmettre des données sur l'objet déplacé au récepteur de baisse. Si vous pouvez obtenir cette information autrement ... pas de problème. addWidget() et removeWidget() sont certainement une façon d'effectuer le déplacement. – Greenflow
Le wiki Qt contient un exemple QtQuick sur la façon d'émuler l'interface de l'icône iOS avec moins de 80 lignes de code. Vous pouvez le trouver here.
thx, mais mon patron m'a restreint d'utiliser ceci =/ –
Je pense, si vous lisez le qml, vous pouvez le traduire dans une mise en page QGridLayout/QWidget. Après tout, qml est juste un autre langage décrivant la mise en page. –
faire un tour, vous pouvez en mesure de faire glisser QWidget aussi,
QPixmap *widgetPixmap = new QPixmap;
yourWidget->render(widgetPixmap); // rendering the current widget to t_iconTPixmap
Maintenant, utilisez ce widgetPixmap
comme pixmap pour yourDragObject->setPixmap();
exemple,
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton
&& iconLabel->geometry().contains(event->pos())) {
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
mimeData->setText(commentEdit->toPlainText());
QPixmap *widgetPixmap = new QPixmap;
yourWidget->render(widgetPixmap);
drag->setMimeData(mimeData);
drag->setPixmap(widgetPixmap);
Qt::DropAction dropAction = drag->exec();
...
}
}
je reçois une erreur: Impossible de rendre avec un peintre inactif – wutzebaer
- 1. Glisser un objet autour d'un QWidget dans Qt
- 2. Qt - Faire défiler le texte dans QWidget
- 3. Central QWidget [Qt]
- 4. créer Qwidget personnalisé dans Qt?
- 5. Comment faire un qwidget savoir quand un autre qwidget est au-dessus
- 6. Qt - modifier la disposition QWidget
- 7. Utilisation d'un QWidget dans une vue Qt
- 8. Qt widget basé sur QWidget
- 9. X11 Widget de QT QWidget
- 10. en passant un paramètre entre deux formulaires QWidget dans QT
- 11. dessiner un graphique dans Qwidget
- 12. Attraper une sortie glisser dans Qt?
- 13. Effet de flou sur un QWidget dans Qt
- 14. Comment puis-je remplacer un Qt 4.8 QWidget avec un QTabWidget dans Qt Designer
- 15. Qt 4.6 - Comment faire glisser et déposer dans un QGraphicsView dans QtCreator?
- 16. qt: QWidget transparent sur Maya Viewport
- 17. Qt :: Pixmap dans Qwidget n'apparaît pas dans MainWindow
- 18. Glisser-déposer dans un problème TreeView Qt
- 19. Qt répondre à keyPressEvent chez l'enfant QWidget
- 20. Qt: Animer le 'roll down' d'un QWidget
- 21. Qt Widgets et QML avec QWidget :: createWindowContainer()
- 22. Impossible d'afficher un arbre (QTreeView) dans un QWidget placé dans un autre QWidget
- 23. QToolButton comportement visuel dans un QFrame/QWidget
- 24. Qt :: Glisser-déposer Image
- 25. Qt créateur 5 lien
- 26. Comment intégrer QWidget dans QML (Qt Quick 2.0)
- 27. Faire glisser un textarea
- 28. Modification de QWidget avec QGlWidget dans Qt 4.8.0
- 29. Faire un wysiwyg dans Qt
- 30. modifier parent QWidget dans l'enfant QWidget
Voulez-vous simplement déplacer ou le glisser/déposer? Il suffit de le déplacer est plus facile (http://stackoverflow.com/questions/12219727/dragging-moving-a-qpushbutton-in-pyqt), glisser/déposer devient compliqué (http://stackoverflow.com/questions/24582383/qmimedata -setting-and-get-the-right-mime-types-pour-arbitraire-widgets). – neuronet