[英]How to provide X11 with a wm_name for a Qt4 window?
我即将解决另一个问题,其中包括为 X11 上的 Qt Window 保留屏幕空间。 为此,我使用PyQt4和Python-Xlib 。
我要为其节省屏幕空间的应用程序是无框 Qt Window,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 中“抓取”我的 window。在上面的代码中导入以下模块以获取我的面板的 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 当前显示的所有 windows 的名称列表。尽管已在代码中明确命名(见上文),但 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 顶级 window 以便它在 X 上正确显示? 和/或:除了应用程序的名称之外,我如何在 X 中识别我的应用程序?
虽然我不太清楚未命名的 window 是什么(它似乎与启动 QtPanel 应用程序有关,但 Xlib 脚本无法找到显示的 window,因为它在事件循环 QApplication._exec() 之前被查询。可能需要线程在主循环之外执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.