Seite 1 von 1
Drag und Drop
Verfasst: 29. Juli 2010 19:41
von Nvidia
Hallo,
nachdem ein Listeneintrag verschoben wurde, wird ja void dropEvent (QDropEvent *event) aufgerufen, wenn ich es implementiert habe.
Mal so ne frage, die Funktion ist ja virtuell.
Wenn ich jetzt in der Liste, was als Folge der Methode, verändern möchte.
Wie greife ich dann auf die Liste zu, da die Methode ja virtuell ist.
Verfasst: 29. Juli 2010 19:55
von Christian81
Häh?
Auch wenn ich Deine Frage nicht kapiert habe - wenn man eine virtuelle Funktion verändern will sollte man ableiten und sie überschreiben. Dafür sind ja virtuelle Funktionen da...
Verfasst: 29. Juli 2010 20:05
von Nvidia
hm ich kenn mich da nicht so gut aus.
Also ich hab ein QListWidget subclassed.
und jetzt hab ich die Methode rein kopiert
void DropEvent(QEvent *drop) oder so in der Art
Aber wenn ich in den Methodeinneren gehen
also das zwischen {}
da kennt er nicht mehr this und die die ganzen andern methode.
wie komm ich wieder an die ran?
//Edit:
so jetzt weiß ich was ich falsch gemacht hab,
ich glaub ich hab vergessen sie abzuleiten.
ich hab einfach nur so den kopf reingeschrieben.
Verfasst: 29. Juli 2010 20:49
von Nvidia
Also das ist meine Methode,
ich möchte nach dem drop, die Positionen von allen item in der Datenbank speichern.
Jetzt hab ich nur ein problem.
Das item das ich rumziehe, ist weg? wo ist es hin?
Code: Alles auswählen
void list::dropEvent (QDropEvent *event)
{
QSqlDatabase db = QSqlDatabase::database("qTest");
int y = this->count();
for(int i=0;i<y;i++)
QSqlQuery q3 = db.exec(QString("UPDATE groups SET position = %1 WHERE name = %2").arg(i).arg(item(i)->text()));
}
Verfasst: 29. Juli 2010 21:01
von Christian81
QListWidget::dropEvent() sollte man auch aufrufen würde ich sagen
Verfasst: 29. Juli 2010 21:53
von Nvidia
Code: Alles auswählen
void QListWidget::dropEvent(QDropEvent *event)
{
QSqlDatabase db = QSqlDatabase::database("qTest");
int y = this->count();
for(int i=0;i<y;i++)
QSqlQuery q3 = db.exec(QString("UPDATE groups SET position = %1 WHERE name = %2").arg(i).arg(item(i)->text()));
}
damit erhalten wir:
virtual void QListWidget::dropEvent(QEvent *drop) redeclared without dllimport attribute: previous dllimport ignored
collect2: ld returned 1 exit status
irgentwie glaube ich das doch list::dropEvent passt,
weil ich hab das in einem anderen Projekt das auch schon so gemacht.
weil list ist ja meine eigenes QListWidget.
Aber warum verschwindet jetzt das eine Item beim verrutschen
Verfasst: 30. Juli 2010 06:30
von Christian81
Aus dem obigen Quellcode kommt definitiv nicht der Fehler...

Verfasst: 30. Juli 2010 07:20
von franzf
void QListWidget::dropEvent
...
Schau dir GENAU an, wie die Klasse heißt, für die du da grad das dropEvent implementieren willst...
Und überleg ob das geht.
Verfasst: 30. Juli 2010 07:54
von Exasperation
Die Lösung ist eine Mischung aus deinen zwei letzten Codebeispielen :p
Für
welche Klasse reimplementierst du das dropEvent? Und wenn du das tust, was geschieht dann? Richtig, du fängst es ab... Fairerweise sollte es noch an die Basisklasse weitergereicht werden

Verfasst: 30. Juli 2010 10:45
von Nvidia
also ich hab das so gemacht:
und das geht auch so gut durch den compiler, nur verschwinden die widgets wenn man sie verrutscht
Code: Alles auswählen
#ifndef LIST_H
#define LIST_H
#include <QListWidget>
class list : public QListWidget
{
Q_OBJECT
public:
list(QWidget *parent = 0);
void addFromSql();
void dropEvent (QDropEvent * event);
};
#endif // LIST_H
Code: Alles auswählen
#include "list.h"
#include <QtSql>
list::list(QWidget *parent)
:QListWidget(parent)
{
}
void list::addFromSql()
{
QSqlDatabase db = QSqlDatabase::database("qTest");
QSqlQuery q3 = db.exec("SELECT name FROM groups ORDER BY position");
QSqlRecord rec = q3.record();
int nameCol = rec.indexOf("name");
while (q3.next())
{
QListWidgetItem *item = new QListWidgetItem(QIcon(":/main/rsfs/folder.png"),q3.value(nameCol).toString());
addItem(item);
}
}
void list::dropEvent(QDropEvent *event)
{
QSqlDatabase db = QSqlDatabase::database("qTest");
int y = this->count();
for(int i=0;i<y;i++)
QSqlQuery q3 = db.exec(QString("UPDATE groups SET position = %1 WHERE name = %2").arg(i).arg(item(i)->text()));
}
sowie
Code: Alles auswählen
listview->setMovement(QListView::Free); //Objekt von list
listview->setUniformItemSizes(true );
listview->setSelectionRectVisible(false);
listview->setDragDropMode(QAbstractItemView::InternalMove);
Code: Alles auswählen
listview->setMovement(QListView::Free);
listview->setAcceptDrops(true);
listview->setDragDropMode(QAbstractItemView::DragDrop);
da lassen sich die items gar nicht mehr verschieben.
Irgentwie nimmt er das Item, das an der neuen stelle eingefügt werden soll nicht an.
Verfasst: 30. Juli 2010 12:49
von dontinelli
Eben, du musst den dropEvent noch an die Basisklasse weiterreichen (oder du implementierst das Einfügen des fallen gelassenen Objektes selber).
Siehe auch die
Qt-Douk.
Code: Alles auswählen
void list::dropEvent(QDropEvent *event)
{
QSqlDatabase db = QSqlDatabase::database("qTest");
int y = this->count();
for(int i=0;i<y;i++)
QSqlQuery q3 = db.exec(QString("UPDATE groups SET position = %1 WHERE name = %2").arg(i).arg(item(i)->text()));
QListWidget::dropEvent(event) ;
}
Verfasst: 30. Juli 2010 12:58
von Nvidia
ein Qt-gott
es funktioniert !!!! juhuuuuuuuuu danke danke danke
Verfasst: 30. Juli 2010 13:14
von franzf
Nvidia hat geschrieben:ein Qt-gott
es funktioniert !!!! juhuuuuuuuuu danke danke danke
Das hat nix mit Qt zu tun, ist einfach nur C++.
Und die Lösung wurde auch schon mehrfach vorgeschlagen. (Gleich am Anfang von Christian z.B.)
Verfasst: 30. Juli 2010 13:19
von Nvidia
ok dann hab ich das da nicht verstanden.
Aber da ist noch ein Problem.
Ich lass ja die einzelnen items nach dem DropEvent durchzaehlen.
Aber leider wird das Item, dass ich bewege doppelt gefunden.
Einmal da, wo ich es hingeschoben habe und einmal da wo es ursprünglich war.
Wie behebt man das?
Könnte man das irgentwie einstellen, dass er das erst in der Datenbank speichert, wenn das DropEvent ganz zu Ende ist?