2012-09-23 22 views
5

如何使用窗口管理器移動使用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這樣的窗口管理器提供的移動反饋(例如透明效果)。

我的問題是:

  1. 如何我轉換PySide的QX11Info.display()成可以傳遞給kdeui.NETRootInfo
  2. 我如何使用Python和Xlib的(要麼python-xlib或「顯示」通過libX11.so)使用消息,如_NET_WM_MOVERESIZE爲了移動窗口?
+0

當然,PyKDE4已經需要PyQt4--所以選項(1)沒有*附加*依賴。 – ekhumoro

+0

不完全。 PyKDE4是KDE4的包裝。 KDE4需要Qt4才能運行,但不能運行** Py ** Qt4。 Python包裝器純粹是一個C++包裝器,因此不依賴於PyQt4。 –

+0

沒有。 PyKDE現在作爲KDE的一部分進行維護,但它一直需要PyQt和SIP,並且沒有改變:請參閱[http://www.riverbankcomputing.com/software/pykde/intro]和[here]( http://techbase.kde.org/Development/Languages/Python)獲取詳細信息。 – ekhumoro

回答

0

我懷疑你的最後一次通話實際上有不同的簽名,或許是這樣的:

moveResizeRequest(<window object>, <int>, <int>, <const>)

,而你是要擠窗口ID(INT)來代替。

對於pygtk(而不是pykde)有一點經驗,您可能必須枚舉給定屏幕中的所有高級窗口才能獲得窗口句柄對象。

同樣,C++ KDE文檔:

display  An X11 Display struct. 
supportWindow The Window id of the supportWindow. The supportWindow must be created by the window manager as a child of the rootWindow. The supportWindow must not be destroyed until the Window Manager exits. 

,而你正在嘗試一些不斷擠入supportWindow。