QT 4: Drag&Drop mit eigenem QAbstractItemModel



  • Hallo,

    ich schreibe grad meine erste Qt-Anwendung und habe viel Spaß mit der Dokumentation :D. Auf jeden Fall habe ich ein QTreeView mit einem eigenen Model (abgeleitet von QAbstractItemModel). Ich habe bereits Anzeigen und Umbenennen implementiert, jetzt möchte ich Verschieben implementieren. Das Problem: Ich bekomme einen Geht-nicht-Cursor.

    Qt::DropActions AccountTreeModel::supportedDropActions() const {
      return Qt::MoveAction;
    }
    
    QStringList AccountTreeModel::mimeTypes() const {
      QStringList types;
      types << "application/x-account-list";
      return types;
    }
    

    Wenn ich Qt::CopyAction erlaube, ist der Cursor schon besser aber ich will nicht kopieren sondern Verschieben. Woran könnte das liegen?

    Falls hier nicht genug Information angegeben ist, bitte sagen, ich wollte jetzt nicht die ganze Klasse hier rein kopieren.

    Ach ja: Kann ich eigentlich nur selektierbare Elemente für Drag&Drop benutzen?

    Dank im Voraus

    MrN

    EDIT: Ich benutze Qt 4.2.



  • http://doc.trolltech.com/4.2/model-view-dnd.html
    Hast du das schon gesehen?

    Wenn dem so ist und du alle Sachen beachtet hast, dann wirst du wohl den Code zeigen muessen..

    edit: am besten ne kompilierbare Version..



  • aMan schrieb:

    Hast du das schon gesehen?

    Ja, anhand dessen hab ichs versucht zu implementieren.

    aMan schrieb:

    Wenn dem so ist und du alle Sachen beachtet hast, dann wirst du wohl den Code zeigen muessen..

    Dass ich alles beachtet hab kann ich nicht garantieren, ich schau noch mal.

    Aber ich kann den Code zeigen (reicht das Model?), nachdem ich das fertig gemacht hab, was ich während des Wartens auf ne Antwort schonmal angefangen habe (Parallel-Aufgabe).



  • Mr. N schrieb:

    Aber ich kann den Code zeigen (reicht das Model?)

    Besser ne kompilierbare Version, dann kann ich auch selber rumprobieren..



  • So, hier kann man den Code runterladen. Zum Compilieren benötigt man CMake und Boost 1.33.1. Das Model liegt in src/ui/qt/accountTreeModel.cpp.

    Hier noch zwei ausgewählte Methoden:

    Qt::ItemFlags AccountTreeModel::flags(QModelIndex const &idx) const {
      if (!idx.isValid())
        return Qt::ItemIsEnabled | Qt::ItemIsDropEnabled;
      Qt::ItemFlags result = QAbstractItemModel::flags(idx) ;
      switch (idx.column()) {
      case impl::c_name: {
        result |= Qt::ItemIsEditable;
        result |= Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; // <- drag geht ja
        impl::info const *x = static_cast<impl::info const*>(idx.internalPointer());
        if (x && x->placeholder)
          result &= ~Qt::ItemIsSelectable;
        break; }
      case impl::c_total: {
        result &= ~Qt::ItemIsSelectable;
        break; }
      }
      return result;
    }
    
    bool AccountTreeModel::removeRows(int row, int count, QModelIndex const &dad) {
      return true; // just for DnD??
    }
    

    EDIT: Wer Subversion hat, kann das ganze auch von hier holen. Im ZIP-File fehlt ne Datei, das will ich mal beheben.

    EDIT 2: 20070126-2 ist hochgeladen. Ich befürchte, da könnte noch einiges kommen 🙄



  • Ich kann daheim das CMake zeugs nicht runterladen -> also kann ich es nicht kompilieren..
    Am Montag werd ich es dann wahrscheinlich haben..

    Vielleicht kann ich auch ohne kompilieren den Fehler finden..
    Aber wo ist denn die TreeView Klasse definiert? Fehlt da vielleicht eine Datei?

    edit: hab grad den edit gesehn.. reload vergessen..



  • SVN Revision 58 bzw. "Release" 20070127 sollten die Probleme beheben.

    aMan schrieb:

    Ich kann daheim das CMake zeugs nicht runterladen -> also kann ich es nicht kompilieren..

    *nicht versteh*

    aMan schrieb:

    Am Montag werd ich es dann wahrscheinlich haben..

    Vielleicht kann ich auch ohne kompilieren den Fehler finden..
    Aber wo ist denn die TreeView Klasse definiert? Fehlt da vielleicht eine Datei?

    edit: hab grad den edit gesehn.. reload vergessen..

    Die TreeModel-Klasse gabs schon vorher und zwar in src/ui/qt/accountTreeModel.cpp.



  • Ich habe ein wenig in der Problematik experimentiert. Es könnte sein, dass ich nicht einfach Qt::MoveAction sondern immer Qt::CopyAaction | Qt::MoveAction benutzen muss, was ich aber nicht nachvollziehen kann.

    Des weiteren ist bizarr, dass meine eigene mimeData-Methode NICHT aufgerufen wird, was mir nicht gefällt.

    Evtl. kann jemand damit was anfangen...



  • Mit pontos Hilfe (im IRC) bin ich jetzt schon wesentlich weiter gekommen. Ohne Qt::CopyAction geht immer noch nicht, aber durch ein zusätzliches const wird endlich mein eigenes mimeData() aufgerufen (peinlich :D).

    Jetzt wäre ich vor allem dankbar, wenn mir jemand erklären könnte, warum ich Qt::CopyAction | Qt::MoveAction brauche, bzw. was unter welchen Bedingungen sonst noch geht. 🙂


Anmelden zum Antworten