如何使用窗口管理器移动使用PySide创建的窗口?
我发现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()
返回一个长指针,而不是一个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)
但这样会增加对PyQt4的依赖,除了PySide。
此外,我尝试使用Xlib的XMoveWindow
函数,但这会阻止窗口部分地拖动到屏幕外,并且不会提供由Compiz或KWin等窗口管理器提供的移动反馈(例如透明度效果)。
我的问题是:
- 如何将PySide的
QX11Info.display()
转换为可以传递给kdeui.NETRootInfo
的“Display”?或者 - 如何使用Python和Xlib(使用
python-xlib
或通过libX11.so)使用类似_NET_WM_MOVERESIZE
的消息来移动窗口?
PySide
中可以使用QPropertyAnimation
,你还想使用kdeui
呢?这是PySide
实现的链接:http://qt-project.org/forums/viewthread/4927 - Ciasto piekarzQPropertyAnimation
如何与使用窗口管理器移动窗口有关。 - D K