Seite 1 von 1

Drag and Drop und eigene Datenstrukturen

Verfasst: 15. März 2007 16:16
von mathies
Hallo,

ich möchte in meine Anwendung zur Übersichtlichkeit Drag and Drop Elemente einbringen. Ähnlich wie in dem puzzle Beispiel von QT.

Es sollen kleine Bilder, hinter denen eine gewisse Datenstruktur steht, von A nach B bewegt werden können, wie halt bei dem Puzzle. Ist es jetzt sinnvoll, wie in dem Beispiel, einen QListView anzulegen, da man dazu ja noch ein QAbstractItemModel anlegen muß und mir der Aufbau da nicht ganz klar ist. Vor allem was das Einbringen eigener Strukturen angeht.

Gibt es Ideen? :)

Grüßle,
Matthias

Verfasst: 15. März 2007 19:00
von upsala
Ja, beschäftige dich mal mit den Model-View-Konzept, arbeite die Beispiele durch und schau dir auch die verschiedenen Grundmodelle an. Es muß nicht immer nur QAbstractItemModel sein, ein QAbstractListModel würde es in deinem Fall wahrscheinlich auch tun.

Verfasst: 16. März 2007 11:07
von mathies
Hallo,

das QAbstractListModel passt wohl besser, da ich eigentlich nur eine eindimensionale Struktur habe. Was ich aber nach wie vor nicht ganz verstehe, ist das Einbringen einer eingenen Struktur.

Ein einfaches Beispiel: Ich möchte zu jedem Bild einen Integer ablegen und je nachdem welches Icon ich dann benutze, soll dieser Wert übernommen werden. Ich würde das jetzt über eine zusätzliche Liste innerhalb des Models machen und je nach ModelIndex den Wert in der Liste auslesen. Aber des scheint mir irgendwie nicht so der Sinn dieses Models zu sein, oder? ;)

Grüßle,
Matthias

Verfasst: 16. März 2007 12:27
von upsala

Code: Alles auswählen

class ImageList : public QAbstractListModel {

int rowCount ( const QModelIndex &) const {
  return m_images.count();
}

QVariant data ( const QModelIndex & index, int role) const {
  if (role==Qt::DecorationRole) {
    return m_images.value(index.row());
  }
  if (role==Qt::UserRole) {
    return m_ints.value(index.row());
  }
  return QVariant();
}

private:
  QList<QPixmap> m_images;
  QList<int> m_ints;
};

Rest ist Übungsaufgabe...

Verfasst: 16. März 2007 12:39
von mathies
Hallo und danke,

genau das mit dem QVariant war mein Verständnisproblem :)

Grüßle,
Matthias

Verfasst: 21. März 2007 22:35
von mathies
Hallo,

eine Frage noch. Was muß ich anstellen um da ein drag and drop hinzubekommen? Bisher kann ich die eingefügten Items nur anwählen aber nicht verschieben und schon gar nicht nach außen ziehen.

Ich habe auch mal alles was mit drag and drop zu tun hat aktiviert aber es tut sich nix. Hat es was mit der mimedata zu tun?

Grüßle,
Matthias

Verfasst: 22. März 2007 09:09
von upsala
Ohne Code können wir das gar nicht beurteilen. Aber in der Dokumentation wird dieses (mit Code) ausführlichst erläutert...

Verfasst: 22. März 2007 11:14
von mathies
Hallo,

also die Eigenschaften des ListView sehen folgendermaßen aus (vom ui-File übersetzt):

Code: Alles auswählen

    qlv_anzeige = new QListView(qgb_anzeige);
    qlv_anzeige->setObjectName(QString::fromUtf8("qlv_anzeige"));
    qlv_anzeige->setGeometry(QRect(10, 20, 711, 131));
    qlv_anzeige->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    qlv_anzeige->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    qlv_anzeige->setProperty("showDropIndicator", QVariant(false));
    qlv_anzeige->setDragEnabled(true);
    qlv_anzeige->setDragDropOverwriteMode(false);
    qlv_anzeige->setDragDropMode(QAbstractItemView::DragOnly);
    qlv_anzeige->setAlternatingRowColors(false);
    qlv_anzeige->setSelectionBehavior(QAbstractItemView::SelectRows);
    qlv_anzeige->setTextElideMode(Qt::ElideMiddle);
    qlv_anzeige->setMovement(QListView::Snap);
    qlv_anzeige->setProperty("isWrapping", QVariant(false));
    qlv_anzeige->setSpacing(5);
    qlv_anzeige->setViewMode(QListView::IconMode);
    qlv_anzeige->setUniformItemSizes(true);
Eigenständig setzen tu ich im Code nur noch die Grid- und die Icon-Size. Das Model besitzt die Funktionalität:

Code: Alles auswählen

QVariant myModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if (role == Qt::DecorationRole)
		return QIcon(mIconList.value(index.row()).scaled(125, 100, Qt::KeepAspectRatio, Qt::SmoothTransformation));
    else if (role == Qt::UserRole)
        return mDataList.value(index.row());

    return QVariant();
}

void myModel::addItem(const QPixmap &pixmap, const int value)
{
	int row = mIconList.size();

    beginInsertRows(QModelIndex(), row, row);
    mIconList.insert(row, pixmap);
    mDataList.insert(row, value);
    endInsertRows();
}

int myModel::rowCount(const QModelIndex &parent) const
{
	return mIconList.count();
}
Ich verstehe da jetzt nicht, warum das drag and drop nicht aktiviert ist?! Hinzufügen und Anzeigen klappt ohne Probleme.

Grüßle,
Matthias

Verfasst: 22. März 2007 12:23
von upsala
Dokumentation immer noch nicht gelesen? http://doc.trolltech.com/4.2/model-view-dnd.html

Verfasst: 22. März 2007 14:51
von mathies
Man sollte auch mal weiter blättern...

Danke für die Geduld, funktioniert jetzt alles ;)

Grüßle,
Matthias