Drag und Drop

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Drag und Drop

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag 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.
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag 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()));
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

QListWidget::dropEvent() sollte man auch aufrufen würde ich sagen
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Aus dem obigen Quellcode kommt definitiv nicht der Fehler... :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag 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 ;)
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag 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.
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

Beitrag 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) ;

} 
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

ein Qt-gott :shock:
es funktioniert !!!! juhuuuuuuuuu danke danke danke
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Nvidia hat geschrieben:ein Qt-gott :shock:
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.)
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag 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?
Antworten