python - 使用 PySide 和 PyKDE4 移动窗口

标签 python pyqt4 pyside xlib pykde

我应该如何使用窗口管理器移动使用 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() 返回一个 long(指针),而不是 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 或 Compiz 等窗口管理器提供的移动反馈(例如透明效果) KWin.

我的问题是:

  1. 如何将 PySide 的 QX11Info.display() 转换为可以传递给 kdeui.NETRootInfo 的“显示”/li>
  2. 我如何使用 Python 和 Xlib(使用 python-xlib 或通过 libX11.so)来使用像 _NET_WM_MOVERESIZE 这样的消息来移动窗口?

最佳答案

我怀疑你最后一次通话实际上有不同的签名,可能是这样的:

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 中时。

关于python - 使用 PySide 和 PyKDE4 移动窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12552266/

相关文章:

python - Chaco 和 PyQt 无法发出信号

python - 使用 pyside 截取 iFrame 的屏幕截图

python - "QPainter::begin: Paint device returned engine == 0, type: 1"

python - 如何通过 requests-oauthlib token 获取避免 InValidClientError?

python - Matplotlib:如何绘制列表中的数据,添加两个 y 轴?

python - 如何连接日期字段和 float 以获取日期时间字段?

python - 按下 Windows X 关闭按钮时显示消息框

python - 在 PyQT4 程序中无法获得多语言支持

pyqt - qWait PySide 中的模拟?

python - 在数据库中存储有序字符串集的正确方法