Drag and Drop und eigene Datenstrukturen

Alles rund um die Programmierung mit Qt
Antworten
mathies
Beiträge: 149
Registriert: 9. Februar 2007 17:50
Wohnort: Erfurt

Drag and Drop und eigene Datenstrukturen

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
mathies
Beiträge: 149
Registriert: 9. Februar 2007 17:50
Wohnort: Erfurt

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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...
mathies
Beiträge: 149
Registriert: 9. Februar 2007 17:50
Wohnort: Erfurt

Beitrag von mathies »

Hallo und danke,

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

Grüßle,
Matthias
mathies
Beiträge: 149
Registriert: 9. Februar 2007 17:50
Wohnort: Erfurt

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ohne Code können wir das gar nicht beurteilen. Aber in der Dokumentation wird dieses (mit Code) ausführlichst erläutert...
mathies
Beiträge: 149
Registriert: 9. Februar 2007 17:50
Wohnort: Erfurt

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dokumentation immer noch nicht gelesen? http://doc.trolltech.com/4.2/model-view-dnd.html
mathies
Beiträge: 149
Registriert: 9. Februar 2007 17:50
Wohnort: Erfurt

Beitrag von mathies »

Man sollte auch mal weiter blättern...

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

Grüßle,
Matthias
Antworten