当 QMenu 在 Mac 上打开时,我如何动态地向它添加操作?
How can I dynamically add actions to a QMenu while it is open on a Mac?
我有 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_()
经过几个小时的大量谷歌搜索,我终于弄明白了。
您可以使用 QtGui.QMainWindow(parent=None, flags=QtCore.Qt.Popup)
创建无边框 window,然后使用 icon.geometry().center()
找到图标的位置,最后使用 [=12= 将 window 移动到那里].
决定如何相对于图标放置 window 涉及到一些技巧。完整代码可以在 https://github.com/pepijndevos/gierzwaluw/blob/master/gui.py
找到
我有 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_()
经过几个小时的大量谷歌搜索,我终于弄明白了。
您可以使用 QtGui.QMainWindow(parent=None, flags=QtCore.Qt.Popup)
创建无边框 window,然后使用 icon.geometry().center()
找到图标的位置,最后使用 [=12= 将 window 移动到那里].
决定如何相对于图标放置 window 涉及到一些技巧。完整代码可以在 https://github.com/pepijndevos/gierzwaluw/blob/master/gui.py
找到