从pyside2获取root对象

时间:2018-05-26 06:56:20

标签: python qml 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)

现在我对以下代码进行了工作"在我的申请中,即使工作不正常。

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);

但是我已经看到这不再起作用了。但我没有找到任何类似的方式。

1 个答案:

答案 0 :(得分:1)

在C ++中,rootObjects()返回QList,方法at(i)返回第i个对象,在at(0)的情况下返回第一个元素,如果是Python rootObjects()返回list,要访问python中的第一个元素,您应该只使用rootObjects()[0]

如果您仍在使用之前问题的代码,则不建议混合使用类,如果Manager有另一个目标,那么建议创建另一个专门处理QSystemTrayIcon的类。

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