Ich muss so etwas wie iOS-Schnittstelle, 3x3 Feld von Symbolen, die gezogen werden können, um ihre Position zu ändern, und dann merken Sie sich in XML-Datei. Ich entschied mich dafür, die Grid-Klasse (QWidget ist übergeordnet) als Container zu verwenden und meine eigenen Klassen von QWidget als Elemente zu übernehmen. Jetzt versuche ich zu lernen, wie man einen Drag & Drop für QWidget durchführt, aber es scheint, als ob du nur auf ein QWidget fallen kannst, aber es ist unmöglich es zu ziehen. Ist es wahr oder nur ich bin zurückhaltend? Wie bewege ich dieses Ding? x.xZiehen eines QWidget in QT 5
Antwort
Das Ziehen eines Widgets ist nicht so einfach. Viel Code, den Sie selbst tun müssen.
Vom 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();
...
}
}
Das bedeutet, wenn Ihr Widget eine Nachricht empfängt, die es zu gezogen werden, z.B. Wie bei einer Mausdruck muss ein QDrag-Objekt erstellt werden.
Im QDrag-Objekt können Sie eine Pixmap festlegen, die Ihr gezogenes Widget darstellt. Wenn Sie Ihr Widget an diesem Punkt ausblenden, sieht es so aus, als würde Ihr Mauszeiger das Widget "übernehmen".
Zusätzlich benötigen Sie ein QMimeData-Objekt. Darin können Sie alle Arten von Daten ablegen, die Ihr Widget beschreiben. In Ihrem Anwendungsfall etwas, mit dem Sie Ihr Widget identifizieren können. Denn und hier kommt der schwierige Teil: Du musst das Bewegen selbst machen.
Das Widget, das das übergeordnete Element des Rasters ist, empfängt das Ereignis drop und liest aus den MIME-Daten, die das Widget für mich verschoben haben soll. Aus dem QDropEvent wird der Punkt ermittelt, an den das Widget verschoben werden soll. Das müssen Sie programmieren: Die eigentliche Neupositionierung in Ihrem Rasterlayout. Und vergiss nicht, das XML zu aktualisieren.
und was ist, ich erinnere mich nur, welches Element bewegte sich, lesen Sie auf welches andere Element es fallen gelassen wurde, dann erinnere mich an das zweite, ersetzen Sie es mit dem ersten und setzen Sie das erste mit addWidget() und removeWidget()? –
@Leonid Bor, das QDrag-Objekt gibt Ihnen eine Möglichkeit, ein Symbol unter Ihrem Mauszeiger zu haben. Und es gibt eine Möglichkeit, Daten über das gezogene Objekt an den Drop-Empfänger zu übergeben. Wenn Sie diese Information sonst bekommen können ... kein Problem. addWidget() und removeWidget() sind sicherlich eine Möglichkeit, den Umzug tatsächlich durchzuführen. – Greenflow
Das Qt-Wiki enthält ein QtQuick-Beispiel zur Emulation der iOS-Symbolschnittstelle mit weniger als 80 Codezeilen.
Sie können es here finden.
thx, aber mein Chef hat mich davon abgehalten, dieses zu verwenden =/ –
Ich denke, wenn Sie das qml lesen, können Sie es in ein QGridLayout/QWidget-Layout übersetzen. Schließlich ist qml nur eine andere Sprache, die das Layout beschreibt. –
einen Trick tun, dann können Sie auch in der Lage ziehen QWidget,
QPixmap *widgetPixmap = new QPixmap;
yourWidget->render(widgetPixmap); // rendering the current widget to t_iconTPixmap
nun diese widgetPixmap
als pixmap verwenden für yourDragObject->setPixmap();
Beispiel
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();
...
}
}
Ich bekomme einen Fehler: Kann nicht mit einem inaktiven Maler rendern – wutzebaer
- 1. Qt-Raum um QWidget
- 2. Qt - ändern QWidget Layout
- 3. Zerstören QWidget von Plugin in Qt zurückgegeben
- 4. Bildschirmtastatur in Qt 5
- 5. Wie verwende ich OpenGL in Qt 5?
- 6. QWidget unter Mac OS X nicht in Qt 5.x konzentrieren
- 7. In Qt 5, was ist der richtige Weg, um Multi-Monitor-Vollbild-QWidget-Fenster anzuzeigen?
- 8. Qt 5: Vsync deaktivieren
- 9. zeichnen Sie Diagramm in Qwidget
- 10. QT Zeichnen eines Kreises
- 11. Qt - Löschen Sie alle Widgets aus einem QWidget Layout
- 12. Qt GUI anklickbar Qframe oder QWidget oder Groupbox
- 13. Finden Sie QWidget der einzelnen Instanz Qt-Anwendung
- 14. Event-Handler in QML durch QWidget-Klasse
- 15. Schließen eines QWidget geöffnet von einem QMainWindow
- 16. Benutzerdefinierter URL-Protokollhandler Qt 5
- 17. QWidget Hintergrund transparent
- 18. QWidget- und xvimagesink-Problem!
- 19. Arbeitet QtRuby mit Qt 5?
- 20. Warten bis QWidget schließt
- 21. Einbetten von Python in Qt 5
- 22. Einbetten von Python3 in Qt 5
- 23. QWidget zu QListWidget hinzufügen
- 24. Zentrieren eines Widget in einem anderen Widget in Qt
- 25. QT: Erhalte den Klassennamen eines Objekts
- 26. ziehen 5 Feldwerte aus einem verwandten Modell
- 27. Ziehen eines Objekts aus einem QTableView/QSqlTableModel
- 28. erfassen Mausrad Ereignisse außerhalb qwidget
- 29. QPalette funktioniert nicht auf Sub QWidget
- 30. Qt Designer: Ändern der Basisklasse eines Fensters
Wollen Sie nur bewegen es oder Drag/Drop es? Einfach verschieben ist einfacher (http://stackoverflow.com/questions/12219727/dragging-moving-a-qpushbutton-in-pyqt), Drag & Drop wird kompliziert (http://stackoverflow.com/questions/24582383/qmimedata - setze-und-bekomme-die-richtige-Pantomime-Typen-für-beliebige-Widgets). – neuronet