Jak powinienem wykonać przesuwanie okna utworzonego za pomocą PySide za pomocą menedżera okien?Przenoszenie okna za pomocą PySide i PyKDE4
Widzę, że kdeui ma klasę NETRootInfo
z metodą moveResizeRequest
, która robi dokładnie to, co chcę. Poniższy:
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)
daje mi:
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'
Ten błąd jest spowodowany z powodu QX11Info.display()
zwraca długo (wskaźnik), a nie strukturę wyświetlacza.
mogę używać PyQt4 na QX11Info.display()
jako pierwszy parametr do konstruktora NETRootInfo
„s zamiast PySide jednej, jak:
...
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)
Ale to dodaje zależność PyQt4 oprócz PySide.
Dodatkowo, próbowałem użyć funkcji Xlib's XMoveWindow
, ale to zapobiega przeciągnięciu okna częściowo z ekranu i nie daje sprzężenia zwrotnego ruchu (na przykład efektów przezroczystości) dostarczanego przez menedżery okien, takie jak Compiz lub KWin.
Moje pytanie brzmi:
- Jak przekonwertować PySide na
QX11Info.display()
w "Display", które mogą być przekazywane dokdeui.NETRootInfo
, lub - Jak używać Python i Xlib (albo z
python-xlib
lub poprzez libX11.so), aby użyć komunikatu, takiego jak_NET_WM_MOVERESIZE
, aby przenieść okno?
Z pewnością PyKDE4 wymaga już PyQt4 - więc nie ma * dodatkowej * zależności dla opcji (1). – ekhumoro
Niezupełnie. PyKDE4 to opakowanie dla KDE4. KDE4 wymaga Qt4 do działania, ale nie ** Py ** Qt4. Opakowanie Pythona jest czystym opakowaniem C++ i dlatego nie ma zależności od PyQt4. –
Nie. PyKDE jest teraz utrzymywany jako część KDE, ale zawsze wymagał zarówno PyQt, jak i SIP i który się nie zmienił: patrz [tutaj] (http://www.riverbankcomputing.com/software/pykde/intro) i [tutaj] (http://techbase.kde.org/Development/Languages/Python) w celu uzyskania szczegółowych informacji. – ekhumoro