PySide,将窗口停靠到任务栏

Posted

技术标签:

【中文标题】PySide,将窗口停靠到任务栏【英文标题】:PySide, Docking windows to taskbar 【发布时间】:2013-11-21 14:56:29 【问题描述】:

我正在使用 PySide 和 Python 2.7 编写程序。

class SystemTrayIcon(QtGui.QSystemTrayIcon):
    def __init__(self, parent=None):

        QtGui.QSystemTrayIcon.__init__(self, parent)

        self.setIcon(QtGui.QIcon("myIcon.ico"))

        self.iconMenu = QtGui.QMenu(parent)
        appcalc = self.iconMenu.addAction("ShowWindow")
        appexit = self.iconMenu.addAction("Exit")
        self.setContextMenu(self.iconMenu)

        self.connect(appcalc, QtCore.SIGNAL('triggered()'),self.appCalc)
        self.connect(appexit,QtCore.SIGNAL('triggered()'),self.appExit)

        self.show()

此代码显示带有 iconMenu 的工作任务栏图标。现在,当我单击“显示窗口”时,我想在图标的同一位置加载一个停靠在任务栏上的小部件/窗口。

如果我使用几何,这将永远无法工作,因为有些人的任务栏位于顶部或屏幕侧面。

如何使用 PySide 将窗口/小部件停靠到任务栏?

谢谢。

【问题讨论】:

【参考方案1】:

您应该能够使用QDesktopWidget.availableGeometry() 和QDesktopWidget.screenGeometry() 的组合来计算任务栏的大小及其方向:

>>> d = qApp.desktop()
>>> d.screenGeometry()
PySide.QtCore.QRect(0, 0, 1600, 900)
>>>>
>>> d.availableGeometry() # taskbar at top
PySide.QtCore.QRect(0, 36, 1600, 864)
>>> d.availableGeometry() # taskbar on left
PySide.QtCore.QRect(36, 0, 1564, 900)
>>>
>>> d.availableGeometry() # taskbar at bottom
PySide.QtCore.QRect(0, 0, 1600, 864)
>>> d.availableGeometry() # taskbar on right
PySide.QtCore.QRect(0, 0, 1564, 900)

如您所见,如果x()y() 不为零,则任务栏位于顶部或左侧;否则,如果width()height() 小于屏幕值,则任务栏位于底部或右侧(如果以上都不是,则没有任务栏)。

有了这个,您就可以使用QSystemTrayIcon.geometry() 来计算您的窗口相对于任务栏的位置。

PS

一些窗口管理器有边距的概念,当窗口在初始定位时或最大化时不能放置。此边距通常设置为一到两个像素,以便鼠标始终可以访问桌面边缘。

因此,根据目标平台,您可能需要在计算任务栏大小和方向时考虑到这一点。

【讨论】:

嗨,谢谢,这似乎是个好主意,我会尝试理解它,因为我是 gui 和 qt 的完整菜鸟。我的计划是让它跨平台。今天我会测试你的想法

以上是关于PySide,将窗口停靠到任务栏的主要内容,如果未能解决你的问题,请参考以下文章

如何从任务栏菜单应用程序 Python/Pyside2 for MacOS 显示 Hello World 对话框

从停靠栏隐藏应用程序图标,但在任务切换器中保留图标?

如何最小化一个窗口到任务栏? (即不图标化)

Delphi 新建窗口在任务栏不显示

怎么把怎么把电脑上面显示窗口的框子从下面弄到下面来

停靠栏下的窗口化opengl游戏中的双光标