我有一个小应用程序,我想最小化到系统托盘,我确实有代码创建图标,并通过按下按钮最小化到系统托盘,(故意我不想覆盖默认关闭操作)。
然而,我不知道如何从qml获取我的根对象,所以我无法执行任何操作,当我得到它时,它会是什么类型?
app = QApplication(sys.argv)
engine = QQmlApplicationEngine()
manager = Manager()
ctx = engine.rootContext()
ctx.setContextProperty("Manager", manager)
engine.load('main.qml')
if not engine.rootObjects():
sys.exit(-1)
app.setWindowIcon(QtGui.QIcon('ico.png'))
sys.exit(app.exec_())
class Manager(QObject):
def __init__(self):
QObject.__init__(self)
self.tray_icon = QSystemTrayIcon(self)
现在我对以下代码进行了工作"在我的申请中,即使工作不正常。
self.tray_icon.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
show_action = QAction("Show", self)
quit_action = QAction("Exit", self)
hide_action = QAction("Hide", self)
show_action.triggered.connect(self.show)
hide_action.triggered.connect(self.hide)
quit_action.triggered.connect(qApp.quit)
tray_menu = QMenu()
tray_menu.addAction(show_action)
tray_menu.addAction(hide_action)
tray_menu.addAction(quit_action)
self.tray_icon.setContextMenu(tray_menu)
self.tray_icon.show()
def minimize(self):
self.hide()
print("Test")
_translate = QtCore.QCoreApplication.translate
#self.hide()
self.tray_icon.showMessage(
"Tray Program",
"Application was minimized to Tray",
QSystemTrayIcon.Information,
2000
)
我做的唯一一件事我改变了
class Manager(QObject): to (QMainWindow)
我可以使用这个代码,但是操作我的窗口,我得到了完整的新窗口,但我确实得到了正常的系统托盘图标和我需要的所有菜单项。
如此底线,我如何获得我的根的参考,以及如何使用最小化托盘。
我的QML的根是正常的ApplicationWindow。
只是一个小编辑,我看到他们曾经使用的一些c ++示例,
root = engine.rootObjects().at(0);
但是我已经看到这不再起作用了。但我没有找到任何类似的方式。
答案 0 :(得分:1)
在C ++中,rootObjects()
返回QList
,方法at(i)
返回第i个对象,在at(0)
的情况下返回第一个元素,如果是Python rootObjects()
返回list
,要访问python中的第一个元素,您应该只使用rootObjects()[0]
。
如果您仍在使用之前问题的代码,则不建议混合使用类,如果Manager有另一个目标,那么建议创建另一个专门处理QSystemTrayIcon
的类。
如果您使用的是QQmlApplicationEngine
,那么您必须使用ApplicationWindow
或Window
,并且这些类继承自QQuickWindow
,因此我们可以使用他们的方法,因为在Python中与C ++不同,QQuickWindow
具有关闭,显示和隐藏方法。
import sys
import os
from PySide2.QtCore import Qt, QObject, Signal, Slot, Property
from PySide2.QtWidgets import QApplication, QSystemTrayIcon, QStyle, QAction, QMenu, QMessageBox
from PySide2.QtQml import QQmlApplicationEngine
my_list = ['here','is','my','list']
class Manager(QObject):
...
class SystemTrayIconManager(QObject):
def __init__(self, window, parent=None):
QObject.__init__(self, parent)
self.window = window
self.window.closing.connect(self.onClosing)
self.tray_icon = QSystemTrayIcon(self)
self.tray_icon.setIcon(qApp.style().standardIcon(QStyle.SP_MediaPlay))
show_action = QAction("Show", self)
quit_action = QAction("Exit", self)
hide_action = QAction("Hide", self)
minimize_action = QAction("Minimize", self)
show_action.triggered.connect(self.window.show)
hide_action.triggered.connect(self.window.hide)
quit_action.triggered.connect(qApp.quit)
minimize_action.triggered.connect(self.minimize)
tray_menu = QMenu()
tray_menu.addAction(show_action)
tray_menu.addAction(hide_action)
tray_menu.addAction(quit_action)
tray_menu.addAction(minimize_action)
self.tray_icon.setContextMenu(tray_menu)
self.tray_icon.show()
def onClosing(self):
if self.tray_icon.isVisible():
QMessageBox.information(None, "Systray",
"The program will keep running in the system tray. To "
"terminate the program, choose <b>Quit</b> in the "
"context menu of the system tray entry.")
self.window.hide()
def minimize(self):
self.window.hide()
self.tray_icon.showMessage(
"Tray Program",
"Application was minimized to Tray",
QSystemTrayIcon.Information,
2000
)
if __name__ == "__main__":
os.environ["QT_QUICK_CONTROLS_STYLE"] = "Material"
app = QApplication(sys.argv)
if not QSystemTrayIcon.isSystemTrayAvailable():
QMessageBox.critical(None, "Systray",
"I couldn't detect any system tray on this system.")
sys.exit(1)
QApplication.setQuitOnLastWindowClosed(False)
engine = QQmlApplicationEngine()
manager = Manager()
ctx = engine.rootContext()
ctx.setContextProperty("Manager", manager)
engine.load('main.qml')
if not engine.rootObjects():
sys.exit(-1)
m = SystemTrayIconManager(engine.rootObjects()[0])
manager.list_fill()
sys.exit(app.exec_())
您可以在下面找到完整的代码 link