Drag und Drop
Drag und Drop
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.
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.
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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.
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.
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?
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()));
}-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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()));
}
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
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
-
Exasperation
- Beiträge: 186
- Registriert: 11. März 2009 18:00
- Wohnort: VS
also ich hab das so gemacht:
und das geht auch so gut durch den compiler, nur verschwinden die widgets wenn man sie verrutscht
sowie
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.
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()));
}
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);Irgentwie nimmt er das Item, das an der neuen stelle eingefügt werden soll nicht an.
-
dontinelli
- Beiträge: 146
- Registriert: 22. September 2006 20:53
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.
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) ;
}
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?
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?