Python 如何为X11提供Qt4窗口的wm_名称? 出身背景

Python 如何为X11提供Qt4窗口的wm_名称? 出身背景,python,pyqt4,x11,xlib,Python,Pyqt4,X11,Xlib,我即将解决这个问题,它包括为X11上的Qt窗口保留屏幕空间。为此,我使用和 情况 我想节省屏幕空间的应用程序是一个无框Qt窗口,25px高,屏幕宽,实际上是一个面板。简化的代码如下所示: import sys from PyQt4 import QtGui from PyQt4 import QtCore # this module i made myself (see below): import myXwindow class QtPanel(QtGui.QWidget): de

我即将解决这个问题,它包括为X11上的Qt窗口保留屏幕空间。为此,我使用和

情况 我想节省屏幕空间的应用程序是一个无框Qt窗口,25px高,屏幕宽,实际上是一个面板。简化的代码如下所示:

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
# this module i made myself (see below):
import myXwindow

class QtPanel(QtGui.QWidget):

    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        # here i explicitely name the window:
        self.setWindowTitle('QtPanel')
        self.resize(QtGui.QDesktopWidget().screenGeometry().width(), 25)
        self.move(0,0)
        self.setWindowFlags(QtCore.Qt.Widget |
        QtCore.Qt.FramelessWindowHint |
        QtCore.Qt.WindowStaysOnTopHint)
        self.setAttribute(QtCore.Qt.WA_X11NetWmWindowTypeDock)

    def main():
        app = QtGui.QApplication(sys.argv)
        panel = QtPanel()
        panel.show() 
        xwindow = myXwindow.Window(str(panel.windowTitle()))
        sys.exit(app.exec_())

if __name__ == '__main__':
    main()
现在,为了为这个QtPanel应用程序保留空间,我需要调用xlib。下面我将展示如何从X“抓取”我的窗口。下面的模块在上面的代码中导入,以获取我面板的Xwindow:

from Xlib.display import Display
from Xlib import X

class Window(object):

    def __init__(self, title):

        self._title = title
        self._root = Display().screen().root
        self._window = self.find_window()

    def find_window(self):

        my_window = None
        display = Display()

        windowIDs = self._root.get_full_property(
                    display.intern_atom('_NET_CLIENT_LIST'),
                    X.AnyPropertyType).value

        print 'looking for windows:'
        count = 0
        for windowID in windowIDs:
            count += 1
            window = display.create_resource_object('window', windowID)
            title = window.get_wm_name()
            print 'window', count, ':', title
            if self._title in title:
                my_window = window

        return my_window
问题 现在,当我运行QtPanel应用程序时,它应该返回X当前显示的所有窗口的名称列表。尽管在代码中已明确命名(见上文),QtPanel应用程序要么没有名称(即None或“”),要么名为“X-nautilus-desktop”,下面是返回的示例:

$ python ./Qtpanel.py
looking for windows:
window 1 : Bottom Expanded Edge Panel
window 2 : cairo-dock
window 3 : x-nautilus-desktop
window 4 : ReserveSpace - NetBeans IDE 6.9
window 5 : How to provide X11 with a wm_name for a Qt4 window? - Stack Overflow - Mozilla Firefox
问题 如何“命名”我的Qt应用程序或Qt顶级窗口,使其在X上正确显示?
和/或:除了应用程序的名称之外,我如何在X中识别我的应用程序?

虽然我不太清楚未命名窗口是什么(它似乎与启动QtPanel应用程序有关,但Xlib脚本无法找到显示的窗口,因为它是在事件循环QApplication之前查询的。_exec()。可能需要一个线程在主循环之外执行此操作。

虽然我不太清楚未命名窗口是什么(它似乎与启动QtPanel应用程序有关,但Xlib脚本无法找到显示的窗口,因为它是在事件循环QApplication之前查询的。_exec()。可能需要一个线程在主循环之外执行此操作