Devo creare qualcosa come l'interfaccia iOS, il campo 3x3 di icone che è possibile trascinare per cambiare la loro posizione e quindi ricordarlo nel file XML. Ho deciso di utilizzare la classe Grid (QWidget è padre) come contenitore e il mio clas è stato ereditato da QWidget come elementi. Ora sto cercando di imparare come eseguire un trascinamento per il rilascio di & per QWidget, ma sembra che tu sia in grado di passare a un QWidget, ma è impossibile trascinarlo. È vero o sono solo un ritardato? Come posso spostare questa cosa? x.xTrascinamento di un QWidget in QT 5
risposta
Trascinare un widget non è così facile. Un sacco di codice che devi fare da solo.
Dal 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();
...
}
}
Questo significa che, quando il tuo widget riceve un messaggio che è di essere trascinato, per esempio come con un mousepress, deve creare un oggetto QDrag.
Nell'oggetto QDrag è possibile impostare una pixmap, che rappresenta il widget trascinato. Se si nasconde il widget a questo punto, sembra che il puntatore del mouse abbia "preso" il widget.
Inoltre è necessario un oggetto QMimeData. In questo puoi inserire tutti i tipi di dati, che descrivono il tuo widget. Nel tuo caso d'uso qualcosa che ti permette di identificare il tuo widget. Perché, e qui arriva la parte difficile: devi fare il movimento te stesso.
Il widget, che è il padre della griglia, riceve l'evento di rilascio e legge dai dati del mimo, che il widget desidera spostare. Da QDropEvent ottiene il punto in cui il widget deve essere spostato. Questo è ciò che devi codificare: l'effettivo riposizionamento nel tuo layout di griglia. E non dimenticare di aggiornare l'xml.
e, per quanto mi riguarda, mi ricordo che elemento si stava muovendo, ho letto su quale altro elemento è stato rilasciato, quindi ricordo il secondo, sostituirlo con il primo e mettere il secondo sul posto del primo con addWidget() e removeWidget()? –
@Leonid Bor, l'oggetto QDrag ti offre un modo per avere un'icona sotto il puntatore del mouse. E dà un modo per passare i dati sull'oggetto trascinato al ricevitore di rilascio. Se riesci a ottenere questa informazione altrimenti ... nessun problema. addWidget() e removeWidget() sono certamente un modo per eseguire effettivamente la mossa. – Greenflow
Il wiki Qt contiene un esempio QtQuick su come emulare l'interfaccia dell'icona iOS con meno di 80 righe di codice.
Potete trovarlo here.
thx, ma il mio capo mi ha impedito di usare questo =/ –
Penso che, se leggi il qml, puoi tradurlo in un layout QGridLayout/QWidget. Dopotutto, qml è solo un altro linguaggio che descrive il layout. –
fare un trucco allora si può in grado di trascinare QWidget anche,
QPixmap *widgetPixmap = new QPixmap;
yourWidget->render(widgetPixmap); // rendering the current widget to t_iconTPixmap
Ora usano questo widgetPixmap
come pixmap per yourDragObject->setPixmap();
esempio,
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();
...
}
}
ottengo un errore: impossibile eseguire il rendering con un pittore inattivo – wutzebaer
- 1. Qt - modifica layout QWidget
- 2. qt QWidget click
- 3. Effetto sfocatura su QWidget in Qt
- 4. Qt rispondere alle keyPressEvent nel bambino QWidget
- 5. QWidget su Mac OS X non attivo in Qt 5.x
- 6. Come integrare QWidget in QML (Qt Quick 2.0)
- 7. Incorporamento di Python3 in Qt 5
- 8. In Qt 5, qual è il modo giusto per mostrare finestre QWidget a schermo intero a schermo multiplo?
- 9. Come creare screenshot di QWidget?
- 10. Come costruire Qt 5 staticamente
- 11. Impossibile creare un QWidget senza QApplicazione
- 12. QtRuby funziona con Qt 5?
- 13. Cancellazione di un layout in Qt
- 14. Attendere QWidget chiude
- 15. Come widget all'interno di un altro widget in QT?
- 16. WebView Google Maps panoramica/trascinamento in Qt5
- 17. Come ottenere tutti i componenti figlio di QWidget in pyside/pyqt/qt?
- 18. Segnale di ridimensionamento QWidget?
- 19. Aggiornamento di QWidget
- 20. Multiple OpenGL Viewports con Qt 5
- 21. Trovare un QWidget 3rd party con il codice iniettato e QWidget :: trovare (hwnd)
- 22. Edificio Qt 5 su Linux, per Windows
- 23. Gestore protocollo URL personalizzato Qt 5
- 24. Esci Applicazione in Qt
- 25. Problemi Qt 5 e OS X Mavericks
- 26. aggiungendo sottomenu in pyqt QWidget
- 27. Definizioni multiple di C++ Qt
- 28. Trascinamento/spostamento di un QPushButton in PyQt
- 29. Nascondere un QWidget su un QToolbar?
- 30. QT: setStyleSheet da un file QSS risorsa?
Vuoi semplicemente spostare o per trascinarlo/rilasciarlo? Il semplice spostamento è più semplice (http://stackoverflow.com/questions/12219727/dragging-moving-a-qpushbutton-in-pyqt), il trascinamento della selezione diventa complicato (http://stackoverflow.com/questions/24582383/qmimedata -setting-ei-destra-mime-type-per-arbitrari-widget-ottenere-). – neuronet