¿Cómo debo mover una ventana creada con PySide usando el administrador de ventanas?Mover ventana usando PySide y PyKDE4
Veo que kdeui tiene la clase NETRootInfo
con un método moveResizeRequest
, que hace exactamente lo que yo quiero. En el siguiente:
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)
me da:
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'
Este error se produce porque QX11Info.display()
devuelve un largo (puntero), y no una estructura de visualización.
puedo usar de QX11Info.display()
como el primer parámetro para el constructor en lugar de la PySide uno NETRootInfo
's, como PyQt4:
...
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)
Pero esto añade una dependencia de PyQt4 además de PySide.
Además, he intentado usar la función XMoveWindow
de Xlib, pero esto evita que la ventana se arrastre parcialmente fuera de la pantalla, y no da la retroalimentación del movimiento (por ejemplo, efectos de transparencia) proporcionada por administradores de ventanas como Compiz o KWin.
Mi pregunta es:
- Cómo convierto PySide de
QX11Info.display()
en una "pantalla" que se puede pasar akdeui.NETRootInfo
, o - ¿Cómo uso Python y Xlib (ya sea con
python-xlib
o a través de libX11.so) para usar un mensaje como_NET_WM_MOVERESIZE
para mover la ventana?
Seguramente PyKDE4 ya requiere PyQt4, por lo que no hay * dependencia * adicional para la opción (1). – ekhumoro
No del todo. PyKDE4 es un contenedor para KDE4. KDE4 requiere Qt4 para operar, pero no ** Py ** Qt4. El contenedor de Python es puramente un contenedor de C++, y por lo tanto no tiene dependencia de PyQt4. –
No. PyKDE ahora se mantiene como parte de KDE, pero siempre ha requerido tanto PyQt como SIP y eso no ha cambiado: vea [aquí] (http://www.riverbankcomputing.com/software/pykde/intro) y [aquí] (http://techbase.kde.org/Development/Languages/Python) para más detalles. – ekhumoro