Wie gehe ich vor, um ein mit PySide erstelltes Fenster mit dem Fenstermanager zu verschieben?Fenster mit PySide und PyKDE4 verschieben
Ich sehe, dass Kdeui hat die NETRootInfo
Klasse mit einer moveResizeRequest
Methode, die genau das tut, was ich will. Die folgende:
from PySide.QtCore import Qt
from PyKDE4 import kdeui
from PySide.QtGui import QX11Info
import sys
from ctypes import CDLL
Xlib = CDLL('libX11.so.6')
def move_window(window, event):
if event.buttons() & Qt.LeftButton:
pos = event.buttonDownScreenPos(Qt.LeftButton)
Xlib.XUngrabPointer(QX11Info.display(), QX11Info.appTime())
rootinfo = kdeui.NETRootInfo(QX11Info.display(), kdeui.NET.WMMoveResize)
rootinfo.moveResizeRequest(window.winId(), pos.x(), pos.y(), kdeui.NET.Move)
gibt mir:
TypeError: NETRootInfo(): arguments did not match any overloaded call:
overload 1: argument 1 has unexpected type 'int'
overload 2: argument 1 has unexpected type 'int'
overload 3: argument 1 has unexpected type 'int'
overload 4: argument 1 has unexpected type 'int'
Dieser Fehler wird verursacht, weil QX11Info.display()
einen langen (Zeiger) gibt, und kein Display-Struktur.
kann ich PyQt4 die QX11Info.display()
als ersten Parameter zu NETRootInfo
‚s Konstruktor anstelle des pyside ein, wie:
...
from PySide.QtGui import QX11Info
from PyQt4.QtGui import QX11Info as QX11InfoQt
...
def move_window(window, event):
if event.buttons() & Qt.LeftButton:
pos = event.buttonDownScreenPos(Qt.LeftButton)
Xlib.XUngrabPointer(QX11Info.display(), QX11Info.appTime())
rootinfo = kdeui.NETRootInfo(QX11InfoQt.display(), kdeui.NET.WMMoveResize)
rootinfo.moveResizeRequest(window.winId(), pos.x(), pos.y(), kdeui.NET.Move)
Aber das fügt eine Abhängigkeit von PyQt4 zusätzlich zu pyside.
Zusätzlich habe ich versucht, Xlibs XMoveWindow
Funktion zu verwenden, aber dies verhindert, dass das Fenster teilweise vom Bildschirm ziehen, und gibt nicht die Bewegung Feedback (z. B. Transparenzeffekte) von Fenster-Manager wie Compiz oder KWin.
Meine Frage ist:
- Wie ich pyside die
QX11Info.display()
in eine „Anzeige“ umwandeln, denkdeui.NETRootInfo
übergeben werden kann, oder - Wie verwende ich Python und Xlib (entweder mit
python-xlib
oder durch libX11.so) um eine Nachricht wie_NET_WM_MOVERESIZE
zu verwenden, um das Fenster zu verschieben?
Sicher PyKDE4 erfordert bereits PyQt4 - so gibt es keine * zusätzliche * Abhängigkeit für Option (1). – ekhumoro
Nicht ganz. PyKDE4 ist ein Wrapper für KDE4. KDE4 benötigt Qt4, aber nicht ** Py ** Qt4. Der Python-Wrapper ist ein reiner C++ - Wrapper und hat daher keine Abhängigkeit von PyQt4. –
Nein. PyKDE wird jetzt als Teil von KDE gepflegt, aber es hat immer sowohl PyQt als auch SIP benötigt und das hat sich nicht geändert: siehe [hier] (http://www.riverbankcomputing.com/software/pykde/intro) und [hier] (http://techbase.kde.org/Development/Languages/Python) für Details. – ekhumoro