Qt Drag & Drop [Résolu]

Qt Drag & Drop [Résolu] - C++ - Programmation

Marsh Posté le 18-12-2011 à 13:29:23    

Bonjour,
 
J'essaie d'implémenter le drag and drop entre un QTreeWidget et un QTableWidget ou à l'intérieur du QTableWidget.
Pour l'instant, je tente juste à l'intérieur du QTableWidget.
J'imagine qu'un détail m'échappe car mes méthodes ne sont pas appelées.
 

Code :
  1. class TablePlaylistItem: public QTableWidgetItem
  2. {
  3. public:
  4. TablePlaylistItem(const QString& s): QTableWidgetItem(s) {}
  5. protected:
  6. virtual QMimeData* mimeData( const QModelIndexList &indexes ) const {std::cout<<"plop"<<std::endl; return NULL;}
  7. };
  8. class TablePlaylist: public QTableWidget
  9. {
  10. public:
  11. TablePlaylist(QWidget *parent = 0);
  12. protected:
  13. virtual void dropEvent(QDropEvent *event);
  14. virtual void dragEnterEvent(QDragEnterEvent *event);
  15. virtual QMimeData* mimeData( const QModelIndexList &indexes ) const {std::cout<<"mime"<<std::endl; return NULL;}
  16. };
  17. void TablePlaylist::dragEnterEvent(QDragEnterEvent *event)
  18. {
  19. QStringList liste(event->mimeData()->formats());
  20. for (QStringList::iterator it = liste.begin(); it != liste.end(); it++)
  21. {
  22.  if (*it == "itemTablePlaylist" || *it == "itemArbreCollection" )
  23.  {
  24.   event->setAccepted(true);
  25.   update();
  26.   return;
  27.  }
  28. }
  29. event->setAccepted(false);
  30. update();
  31. }
  32. class Fenetre : public QMainWindow, public Ui_MainWindow
  33. {
  34. Q_OBJECT
  35. ...
  36. TablePlaylist *tablePlaylist;
  37. ...
  38. }
  39. void Fenetre::preparerTablePlaylist()
  40. {
  41. tablePlaylist = new TablePlaylist(framePlaylist);
  42. ...
  43. gridLayout_2->addWidget(tablePlaylist, 0, 0, -1, -1);
  44. }
  45. void Fenetre::ajouterMorceau(const InfoMorceau& m)
  46. {
  47. QTableWidgetItem *item;
  48. ...
  49. item = new TablePlaylistItem(QString::fromStdString(m.fichier));
  50. tablePlaylist->setItem(ligne, COLONNE_TITRE, item);
  51. ...
  52. }


 
Les méthodes dropEvent et dragEnterEvent de TablePlaylist sont appelées quand je fais du drag and drop. Je peux accepter ou non.
Par contre les fonctions mimeData ne le sont jamais quelle que soit la classe (j'ai essayé d'en mettre partout juste pour trouver la bonne). Du coup dans mon dragEnterEvent, j'ai event->mimeData() qui contient des choses bizarres (enfin par défaut je pense).
Comment faire pour surcharger correctement mimeData et ainsi envoyer les informations que je souhaite?
 
Merci


Message édité par ptitchep le 18-12-2011 à 18:03:01

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 18-12-2011 à 13:29:23   

Reply

Marsh Posté le 18-12-2011 à 15:02:28    

est-ce que setAcceptDrops(true); ?
 
En plus si mimeData() retourne NULL et que tu fais event->mimeData()->formats() ça doit poser problème
 


Message édité par GrosBocdel le 18-12-2011 à 15:04:46
Reply

Marsh Posté le 18-12-2011 à 15:21:26    

Oui j'ai accepté les drops (du moins pour la classe TablePlaylist).
Ma méthode retourne NULL parce qu'elle est vite faite. Le problème, c'est qu'elle n'est jamais appelée. Donc bon, la valeur de retour... :-/
(J'en ai une prête pour le jour où j'arrive à la faire appeler mais son code n'a pas grand intérêt ici)


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 18-12-2011 à 16:01:42    

Le prototype de ton mimeData n'a pas l'air d'être le bon d'après la doc de la 4.8, pour QTableWidget
 
 QMimeData  * mimeData ( const QList <QTableWidgetItem *>items ...) const [virtual protected]


Message édité par GrosBocdel le 18-12-2011 à 16:04:16
Reply

Marsh Posté le 18-12-2011 à 18:02:21    

Merci.
La méthode est appelée. J'ai du récupérer le prototype dans un vieux tuto sans doute.
Et je l'ai relu une bonne cinquantaine de fois sans rien voir...
Encore merci, je n'ai plus qu'à me mettre au boulot pour le reste.


---------------
deluser --remove-home ptitchep
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed