Как мне переместить окно, созданное с помощью 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.
Я могу использовать QX11Info.display()
PyQt4 в качестве первого параметра конструктора 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.
Мой вопрос:
- Как преобразовать
QX11Info.display()
PySide в «дисплей», который можно передать вkdeui.NETRootInfo
, или - Как мне использовать Python и Xlib (либо с
python-xlib
, либо через libX11.so), чтобы использовать сообщение типа_NET_WM_MOVERESIZE
для перемещения окна?
kdeui
, когда можно использоватьQPropertyAnimation
!вPySide
. Вот ссылка на реализацию pyside qt-project.org/forums/viewthread/4927 - person Ciasto piekarz   schedule 26.12.2013QPropertyAnimation
s связаны с перемещением окна с помощью оконного менеджера. - person D K   schedule 28.12.2013