Seite 1 von 1
[gelöst] QDrag mit Button
Verfasst: 3. Juli 2007 16:03
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?
Verfasst: 3. Juli 2007 16:20
von NoobSaibot
hast du die Qt Dokumentation zu QDrag schon gelesen?
Verfasst: 4. Juli 2007 08:20
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
Verfasst: 6. Juli 2007 08:51
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
Verfasst: 6. Juli 2007 10:07
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?
Verfasst: 6. Juli 2007 12:10
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?
Verfasst: 6. Juli 2007 12:19
von NoobSaibot
um alle QLabels zu bekommen kannst du die funktion
aufrufen.
Verfasst: 6. Juli 2007 12:42
von CSchirner
Naja ich will die "Verwalten" weil ich nen paar Membervariablen von der Vererbten Klasse abfragen will.. Name, Position, Bezeichnung blablalba
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
Verfasst: 7. Juli 2007 09:40
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.
Verfasst: 9. Juli 2007 10:54
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...
Verfasst: 9. Juli 2007 12:57
von CSchirner
Funktioniert jetzt...
ein einfaches "show()" hatte gefehlt -.-
Vielen Dank trotzdem