5

我有QSystemTrayIcon一个QMenu. 为了填满菜单,我需要从网络上获取一些东西,所以我想在后台进行。

所以我有一个QThread连接到activated托盘图标信号的插槽。然后线程获取资源并使用另一个信号更新菜单。

但是,在我关闭并重新打开菜单之前,这些更新不会显示。

这似乎是 Mac 特有的问题。我在 Windows 上运行我的代码,并在那里或多或少地正确更新。有什么解决方法吗?

以下是该问题的提取版本。当菜单打开时,它会在一个线程中休眠 1 秒,然后更改菜单。这种变化是看不到的。

import sys
import time
from PySide import QtCore, QtGui

class PeerMenu(QtGui.QMenu):

    def __init__(self):
        QtGui.QMenu.__init__(self)
        self.set_peers("prestine")

    @QtCore.Slot(object)
    def set_peers(self, label):
        self.clear()

        self.addAction(QtGui.QAction(label, self))
        self.addSeparator()
        self.addAction(QtGui.QAction("Hello", self))

class GUIListener(QtCore.QObject):

    files = QtCore.Signal(object)

    def __init__(self):
        QtCore.QObject.__init__(self)
        self.counter = 0

    @QtCore.Slot()
    def check(self):
        time.sleep(1)
        self.counter += 1
        self.files.emit(str(self.counter))

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)

    icon = QtGui.QSystemTrayIcon(QtGui.QIcon('images/glyphicons-206-electricity.png'), app)

    listener = GUIListener()
    t = QtCore.QThread()
    t.start()
    listener.moveToThread(t)

    menu = PeerMenu()
    icon.activated.connect(listener.check)
    listener.files.connect(menu.set_peers)

    icon.setContextMenu(menu)

    icon.show()

    app.exec_()
4

1 回答 1

4

经过几个小时的广泛谷歌搜索,我终于弄明白了。

您可以使用创建无边框窗口QtGui.QMainWindow(parent=None, flags=QtCore.Qt.Popup),然后使用 找到图标的位置,icon.geometry().center()最后使用 将窗口移动到那里window.move(icon_point)

在决定如何相对于图标放置窗口时涉及一些黑客行为。完整代码可以在https://github.com/pepijndevos/gierzwaluw/blob/master/gui.py找到

于 2015-01-16T17:25:31.597 回答