Windowmanager mit QT und Drag n Drop in QT-Anwendungen

Alles rund um die Programmierung mit Qt
Antworten
ChrisR
Beiträge: 3
Registriert: 15. September 2010 15:08
Kontaktdaten:

Windowmanager mit QT und Drag n Drop in QT-Anwendungen

Beitrag von ChrisR »

Hallo!

Ich bastele derzeit am antico-source herum und bin auf folgendes problem gestossen:


in qt anwendungen wie designer oder dem beispielprogramm "draggableicons" sowie kde-anwendungen wie dolphin funktioniert das drag n drop nicht. in nautlius, pcmanfm und anderer software funktioniert das drag n drop jedoch wie gewünscht.

Mit "nicht-funktionieren" meine ich: der mauszeiger verändert sich zwar wie gewünscht (bei dolphin kriegt er unten rechts das icon, welches man grade draggt usw). allerdings passiert beim drop nichts.


Vom aufbau des eventparsers her ist es so, dass sämtliche xdnd clientmessages einfach qt überlassen werden. qt macht daraus dann auch die passenden events - allerdings beim Frame (eine aus QFrame abgeleitete klasse, die die Fensterrahmen zeichnet und mit Xlib aufrufen die Fenster einpasst). Dort (in der Frame-klasse) wird bei den qt-events (dropEvent, dragMoveEvent, dragEnterEvent) dann einfach:
event->acceptProposedAction();
ausgeführt.

Ich habe jetzt also mal das qt-demoprogramm "draggableicons" genommen und geschaut, was wann und mit welchem parameter da die drag / drop events auftauchen. mein ergebnis war, dass sie im DragWidget garnicht auftauchen.



jetzt bin ich etwas ratlos, wie ich damit umgehen soll, bzw was ich da machen kann, damit die widgets ihre events kriegen.

puh, jetzt isses doch mehr text geworden, als ich dachte..
Vielen Dank schonmal im Vorraus :)


Grüße Chris
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Erst ne Gegenfrage am Anfang:
Warum willst du denn unbedingt Antico verwenden?!? Es gibt Windowmanager, die um Welten besser sind! Antico war nie wirklich gut geschrieben, und ist es wohl auch immer noch. Das war ein Projekt von jemandem, der kein C++ konnte, und mit Qt angefangen hat. Da kamen dann solche Sachen wie "int i" als Member, im Destruktor dann "delete &i;" :roll:

Antico hat nur so einen hohen Beliebtheitsgrad erreicht, weil
*) kde4 zu dem Zeitpunkt noch recht mies war
*) die Leute einen Qt-Ersatz wollten
*) Die User sich den Code nicht angeschaut haben :D

Mittlerweile ist plasma und kwin sowieso um Welten besser geworden.

Zum Problem selber kann ich nicht viel sagen ;) Es wird vllt. irgendwo Mist gebaut (recht wahrscheinlich sogar). Verkorkster EventFilter, falsch verarbeitetes Event, ...
Spick mal bei FluxBox/IceWM/... das ist nicht so extrem umfangreich wie KWin, und für mich hat da D&D immer funktioniert.

Wenn es dich nur interessiert, wie man einen WindowManager schreibt: fang von vorne an, lass Antico liegen, und schau nicht zuviel davon ab :D

Grüße und viel Spaß
Franz
ChrisR
Beiträge: 3
Registriert: 15. September 2010 15:08
Kontaktdaten:

Beitrag von ChrisR »

franzf hat geschrieben:Erst ne Gegenfrage am Anfang:
Warum willst du denn unbedingt Antico verwenden?!? Es gibt Windowmanager, die um Welten besser sind! Antico war nie wirklich gut geschrieben, und ist es wohl auch immer noch. Das war ein Projekt von jemandem, der kein C++ konnte, und mit Qt angefangen hat. Da kamen dann solche Sachen wie "int i" als Member, im Destruktor dann "delete &i;" :roll:

Antico hat nur so einen hohen Beliebtheitsgrad erreicht, weil
*) kde4 zu dem Zeitpunkt noch recht mies war
*) die Leute einen Qt-Ersatz wollten
*) Die User sich den Code nicht angeschaut haben :D

Mittlerweile ist plasma und kwin sowieso um Welten besser geworden.

Zum Problem selber kann ich nicht viel sagen ;) Es wird vllt. irgendwo Mist gebaut (recht wahrscheinlich sogar). Verkorkster EventFilter, falsch verarbeitetes Event, ...
Spick mal bei FluxBox/IceWM/... das ist nicht so extrem umfangreich wie KWin, und für mich hat da D&D immer funktioniert.

Wenn es dich nur interessiert, wie man einen WindowManager schreibt: fang von vorne an, lass Antico liegen, und schau nicht zuviel davon ab :D

Grüße und viel Spaß
Franz
joar bin gerade dabei den code aufzuräumen, sind paar echt unsinnige sachen drin.
ich habe den antico source halt als bastelgrundlage genommen, weil er funktioniert hat und schon c++ / qt war.



zum thema spicken:
ich hab grade bei qlwm gespickt, weil das ja auch ein qt-wm ist der mit QFrames als fensterrahmen arbeitet. der hat dieses problem tatsächlich auch.

was mir jetzt spontan noch eingefallen wäre, wäre beim frame die events abzufangen und Xdnd nachrichten aus den event daten erstellen, diese dann direkt an die client-fenster senden. aber irgendwie kann das ja auch nicht im sinne des erfinders sein.

Eventuell wärs tatsächlich sinnvoll qt die Xdnd nachrichten abzunehmen und selber auszuwerten, aber dafür steck ich grade einfach ned tief genug in der materie :oops:

vielleicht wärs aber auch sinnvoll tatsächlich nen neuen eigenen wm zu schreiben, ich denke da werd ich nochma drüber nachdenken müssen.

Danke für deine schnelle Antwort!


Grüße Chris
Antworten