如何使用窗口管理器移動使用PySide創建的窗口?使用PySide和PyKDE4移動窗口
我看到kdeui的NETRootInfo
類與moveResizeRequest
方法,這正是我想要的。以下:
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)
給我:
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'
這個錯誤造成的,因爲QX11Info.display()
返回一個長(指針),而不是顯示結構。
我可以使用PyQt4中的QX11Info.display()
作爲第一個參數來NETRootInfo
的構造,而不是PySide一個,如:
...
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)
但是這會增加除了PySide上PyQt4的依賴。
此外,我嘗試過使用Xlib的XMoveWindow
函數,但是這可以防止窗口部分拖出屏幕,並且不會給出像Compiz或KWin這樣的窗口管理器提供的移動反饋(例如透明效果)。
我的問題是:
- 如何我轉換PySide的
QX11Info.display()
成可以傳遞給kdeui.NETRootInfo
,或 - 我如何使用Python和Xlib的(要麼
python-xlib
或「顯示」通過libX11.so)使用消息,如_NET_WM_MOVERESIZE
爲了移動窗口?
當然,PyKDE4已經需要PyQt4--所以選項(1)沒有*附加*依賴。 – ekhumoro
不完全。 PyKDE4是KDE4的包裝。 KDE4需要Qt4才能運行,但不能運行** Py ** Qt4。 Python包裝器純粹是一個C++包裝器,因此不依賴於PyQt4。 –
沒有。 PyKDE現在作爲KDE的一部分進行維護,但它一直需要PyQt和SIP,並且沒有改變:請參閱[http://www.riverbankcomputing.com/software/pykde/intro]和[here]( http://techbase.kde.org/Development/Languages/Python)獲取詳細信息。 – ekhumoro