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
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