从 pyside2 获取根对象

Get root object from pyside2

我有一个我想最小化到系统托盘的小应用程序,我确实有创建图标并将其最小化到系统托盘的代码,只需按下一个按钮,(我有意不想覆盖默认的关闭操作).

但是,我不知道如何从 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)

现在,我在我的应用程序中 "work" 编写了以下代码,尽管它无法正常工作。

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)

我可以使用这段代码,但我得到了全新的 window,而不是操纵我的 window,尽管如此,我确实得到了正常的系统托盘图标和我需要的所有菜单项。

所以最重要的是,我如何获得我的根目录的引用,以及我如何使用最小化到托盘上。

我的 QML 的根目录是普通的 ApplicationWindow。

只是一个小的编辑,我在他们曾经使用的一些 c++ 示例上看到,

root = engine.rootObjects().at(0);

但正如我所见,这不再有效。但是我还没有找到任何类似的方法。

在C++中rootObjects()returns一个QList和方法at(i)returns第i个对象,在[=14=的情况下] returns 第一个元素,在 Python rootObjects() returns a list 的情况下,要访问 python 中的第一个元素,你应该只使用 rootObjects()[0].

如果您仍在使用之前问题的代码,则不建议混合使用 classes,如果经理有另一个 objective,那么建议创建另一个 class 专门处理 QSystemTrayIcon.

如果您使用的是 QQmlApplicationEngine,那么您必须使用 ApplicationWindowWindow,而这些 class 继承自 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