[gelöst] QDrag mit Button

Verschiedenes zu Qt
Antworten
CSchirner
Beiträge: 63
Registriert: 14. Dezember 2006 11:05

[gelöst] QDrag mit Button

Beitrag von CSchirner »

Hallo,


ich habe einen Button erstellt, und auf das signal clicked() ein QDrag erstellt, mit der übergabe des Buttons (ui.objButtonTF1).

Mein Ziel war es, den Button "auzuheben" und über meinen Label "loszulassen" und dann die Position relativ zum Label zu speichern...

Ich möchte der der Benutzer bestimmte Anzeigeelemente Positionieren kann.... doch das einzige was ich bekomm is eine Fehlermeldung die aussagt, das ich keine MimeData gesetzt habe, bevor ich das "Drag" starte...

mit den MimeData kann ich irgendwie leider nichts anfangen....

irgendwelche Tipps?
Zuletzt geändert von CSchirner am 9. Juli 2007 14:13, insgesamt 1-mal geändert.
NoobSaibot
Beiträge: 99
Registriert: 27. Januar 2005 15:55

Beitrag von NoobSaibot »

hast du die Qt Dokumentation zu QDrag schon gelesen?
CSchirner
Beiträge: 63
Registriert: 14. Dezember 2006 11:05

Beitrag von CSchirner »

Also habs etz anhand des Beispiels von Qt4.2 geschafft drag and drop mit nem label zu machen... funktioniert sehr gut... dennoch hab ich bissl abneigung gegen sachen, die ich net versteh wie die funktionieren...


Die Events verstehe ich wie die funktionieren... aber
http://doc.trolltech.com/4.2/draganddro ... t-cpp.html
Das Dropevent... da wird einfach n neues label erstellt ... aber was passiert mit dem alten? Wird der alleine gelöscht? Weil ein Delete gibts ja net...


Wenn mir jemand das erklären könnte wäre nett...

MFG
Christopher Schirner
@udisello
Beiträge: 50
Registriert: 19. März 2007 14:58
Wohnort: Sachsen

Beitrag von @udisello »

Das entfernen des verschobenen Labels wird in der Klasse draglabel.cpp durchgeführt mit dem Befehl "close()".
http://doc.trolltech.com/4.2/draganddro ... l-cpp.html
MfG @udisello

Qt Version 4.3.0, MS VS 2005
CSchirner
Beiträge: 63
Registriert: 14. Dezember 2006 11:05

Beitrag von CSchirner »

d.h. also Qt entledigt sich beim close dieses objekts wenn this->setAttribute(Qt::WA_DeleteOnClose, true); gesetzt ist....

okay....


gibt es eine möglichkeit alle existierenden label zu bekommen (weil Qt die sicher selbst verwaltet) oder sollte ich selbst pointer auf die labelobjekte verwalten?
@udisello
Beiträge: 50
Registriert: 19. März 2007 14:58
Wohnort: Sachsen

Beitrag von @udisello »

Dabei hilft Dir sicher die Funktion:
const QObjectList & QObject::children () const
Returns a list of child objects. The QObjectList class is defined in the <QObject> header file as the following:

typedef QList<QObject*> QObjectList;
The first child added is the first object in the list and the last child added is the last object in the list, i.e. new children are appended at the end.
Was meinst Du denn mit verwalten?
MfG @udisello

Qt Version 4.3.0, MS VS 2005
NoobSaibot
Beiträge: 99
Registriert: 27. Januar 2005 15:55

Beitrag von NoobSaibot »

um alle QLabels zu bekommen kannst du die funktion

Code: Alles auswählen

findChildren<QLabel*>()
aufrufen.
CSchirner
Beiträge: 63
Registriert: 14. Dezember 2006 11:05

Beitrag von CSchirner »

Naja ich will die "Verwalten" weil ich nen paar Membervariablen von der Vererbten Klasse abfragen will.. Name, Position, Bezeichnung blablalba :D

Wollte das erst in nem Vektor verwalten... wie verhält sich das egtl in der Objectlist? Werden die von Qt gelöschten objekte auch aus der Objectlist gelöscht?


EDIT:

Ist es auch möglich das Label zu verschieben ohne es zu löschen und wieder zu erstellen!? O_o
@udisello
Beiträge: 50
Registriert: 19. März 2007 14:58
Wohnort: Sachsen

Beitrag von @udisello »

wie verhält sich das egtl in der Objectlist? Werden die von Qt gelöschten objekte auch aus der Objectlist gelöscht?
Das sollte so sein, hab es noch nicht überprüft. Du kannst das Label natürlich auch nur verschieben, ohne es zu löschen und neu zu erstellen.

Code: Alles auswählen

wordLabel->move(x, y);
MfG @udisello

Qt Version 4.3.0, MS VS 2005
CSchirner
Beiträge: 63
Registriert: 14. Dezember 2006 11:05

Beitrag von CSchirner »

Also das Drag and Drop funktioniert etz perfekt... doch eine Frage hab ich noch...

Ich will jetzt von einem QTabWidget aus mein Label ins "MainWindow" droppen... hab schon probiert das parent mit "setParent" aufs MainWindow zu legen beim DragEvent, damit ich vom TabWidget ein Objekt aufheben kann und ins Mainwidget "draggen"... doch irgendwie funktioniert das net

Hab etz 2 Stundenlang danach gesucht und auch QDrag etc durchgelesen... ich komm einfach net drauf wie ich das Realisieren kann



//EDIT:

Ich hab etz mal folgendes Versucht.. ich hab das TabWidget überladen... und dann in meiner erbenden Klasse DragList die Events wie dragEnterEvent, dragMoveEvent, dropEvent eingebaut...

Genauso wie ich diese Methoden in meinem "Haupt-Fenster" implementiert habe...

Je nach dem wo das ding gedroppt wird, wird im DragList oder im MainWindow das dropEvent aufgerufen...


So sieht der Code vom DragList aus...
der Einzige unterschied im MainWindow ist das setzen es Parents... dort wird er auf this gesetzt...

Code: Alles auswählen

 void DragList::dropEvent(QDropEvent *event)
 {
	 
     if (event->mimeData()->hasText())
	 {

		 QString sText = event->mimeData()->text();
		 QPoint position = event->pos();
         
		 event->source()->setParent(this->widget(0));
		 event->source()->move(position);
	

         if (children().contains(event->source())) {
             event->setDropAction(Qt::MoveAction);
             event->accept();
         } else {
             event->acceptProposedAction();
         }
		 
     } else {
         event->ignore();
     }
	 
 }

Dennoch "verschwindet" das zu Objekt das ich Drag'n'Droppen will... es existiert zwar noch... aber aufn Widget kann ich es nicht mehr sehen...


Innerhalb des TabWidgets funktioniert übrigens das Drag and Drop... ich kann auf dem gleichen Tab die "Items" hin und herschieben. .. zwar passt noch was mit der position nicht ganz... das lässt sich aber lösen...

Hat jemand noch ne idee an was das drag and drop noch scheitern könnte?

Vielen Dank schonmal für eure Hilfe...
CSchirner
Beiträge: 63
Registriert: 14. Dezember 2006 11:05

Beitrag von CSchirner »

Funktioniert jetzt...

ein einfaches "show()" hatte gefehlt -.-

Vielen Dank trotzdem
Antworten