我应该如何使用窗口管理器移动使用 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()
返回一个长的(指针),而不是一个显示结构。
我可以使用 PyQt4QX11Info.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 或通过 libX11.so)使用消息_NET_WM_MOVERESIZE
,如移动窗口?