PyQt-Anfänger fragt: Wie andere Anwendungsfenster einbinden?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
snafu
User
Beiträge: 5487
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sonntag 28. September 2008, 21:23

Hallo!

Ich würde gerne mehrere Fenster von beliebigen externen Anwendungen in ein großes Qt-Fenster einbinden. Hintergrund ist, dass ich z.B. in 2/3 eines (Vollbild-)Fensters sozusagen meinen Browser haben möchte (mittels Webkit) und den Rest der Fläche sollen beliebige andere Fenster einnehmen (Editor, Konsole, Pidgin-Leiste oder was ich gerade möchte). Ist sowas mit Qt möglich?

Gruß

Sebastian

PS: Wenn es für mein Vorhaben schon eine Lösung gibt, wäre ich über einen Link dankbar. :)
lunar

Sonntag 28. September 2008, 21:53

snafu hat geschrieben:PS: Wenn es für mein Vorhaben schon eine Lösung gibt, wäre ich über einen Link dankbar. :)
Ähm, wie wäre es denn mit dem Fenstermanager deiner Lieblingsdesktopumgebung? Der kann sowas ...

Falls du die Fenster einbetten möchtest, so wird das nicht ohne weiteres gehen. Die Fenster sind unabhängig und unterliegen vor allem der Kontrolle des Fenstermanagers. Um Fenster in deine Anwendung einzubetten, muss deine Anwendung somit die Rolle des Fenstermanagers übernehmen. Das ist allerdings weder plattformunabhängig noch eine Qt-Sache, dafür müsstest du dich mit der Xlib auseinander setzen.
Benutzeravatar
snafu
User
Beiträge: 5487
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sonntag 28. September 2008, 22:04

Mein derzeitiger Fenstermanager ist Xfce4. Ich möchte halt, dass sich bei der Größenänderung des "externen" Fensters das Browserfenster entsprechend anpasst. Mal möchte ich das komplette Browserfenster sehen, dann lese ich bspw eine Website mit ner Doku und will die dort gemachten Angaben in mein anderes Programm übernehmen (Editor, Terminal usw) und zwar ohne dass sich etwas überlappt und ohne dass ich mit mehreren Arbeitsflächen hantieren müsste. Falls es nen WM gibt, der sowas kann, werde ich mir auch diesen gerne mal ansehen. Ich bin in dem Bereich nicht so bewandert...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 28. September 2008, 23:05

Suchst du eventuell einen Tiling WM? Die sind in letzter Zeit sehr in Mode, da gibt es auch welche die in Python geschrieben sind.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
snafu
User
Beiträge: 5487
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sonntag 28. September 2008, 23:18

Ich habe mich jetzt etwas in die Doku von python-xlib eingelesen. Mein Gedanke ist nun folgender: Das Hauptfenster von meinem Programm wäre quasi der Browser. Dann gäbe es einen Menüpunkt "Launch Application" wo man den gewünschten Startbefehl für die Anwendung einträgt. An der Stelle müsste sich die Xlib einschalten, das anstehende create_window-Event abfangen und statt der Erzeugung des Fensters würden die Fensterkoordinaten an Qt übergeben werden, der ihm dann den entsprechenden Platz im Hauptfenster zugesteht. Irgendwie so. Das ist alles noch sehr vage und ich müsste erstmal ne Nacht drüber schlafen und mich intensiver mit Xlib auseinandersetzen...

Wobei das wohl sehr kompliziert werden dürfte, denn das externe Programm muss ja weiterhin mit dem X-Server kommunizieren können und dem Server muss vorgegaukelt werden, dass da ein Fenster erzeugt wurde. Außerdem müssten ihm auch immer die aktuellen Eigenschaften des Pseudo-Fensters übermittelt werden. Ich glaube, das zu handlen ist zumindest für jemanden wie mich nahezu unmöglich. :(

Also an die Koordinaten würde ich wohl kommen:
Event: CreateNotify

This event is generated when a window is created. X.SubstructureNotifyMask must be selected on the parent of the new window to receive this event.

Instance Variable: CreateNotify parent
The parent of the new window.

Instance Variable: CreateNotify window
The new window.

Instance Variable: CreateNotify x
Instance Variable: CreateNotify y
Instance Variable: CreateNotify width
Instance Variable: CreateNotify height
Instance Variable: CreateNotify border_width
Instance Variable: CreateNotify override
These values are fetched from the create_window call.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Montag 29. September 2008, 16:35

Ich würde mir, wie Leonidas bereits vorgeschlagen hat, mal einen Tiling Window Manager anschauen, auch wenn diese am Anfang vielleicht ein wenig gewöhnungsbedürftig sind, andererseits sind sie aber auch (zumindest xmonad, den ich benutze) höchst flexibel. So kann man sich bei xmonad beispielsweise verschiedene Layouts definieren, zwischen denen man dann wechseln kann, was wohl genau das wäre, was du suchst:
man xmonad hat geschrieben:By default, xmonad provides three layout algorithms: tall, wide and fullscreen. In tall or wide mode, windows are tiled and arranged to prevent overlap and maximise screen use.
Und es ist auch problemlos möglich, weiterhin KDE/XFCE/whatever mit xmonad zu nutzen.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Benutzeravatar
snafu
User
Beiträge: 5487
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Samstag 4. Oktober 2008, 15:39

Danke, aber ich möchte dafür keinen extra Windowmanager benutzen. Ich werde die Sache wohl ganz ohne Qt lösen, indem ich ein bestehendes Browserfenster und ein ausgewähltes anderes Fenster mittels reparent() aus der python-xlib zusammenfüge. Das hier erzeugt schon mal ein Fenster mit weißem Hintergrund von der Größe des Bildschirms und setzt ein offenes Terminalfenster ins untere Drittel des großen Fensters: http://paste.pocoo.org/show/87014/

Es wird natürlich noch sehr viel Arbeit dahinter stecken, aber ich denke ich bin auf nem guten Weg.
Antworten