1

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

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

但正如我所见,这不再起作用了。但我还没有找到任何类似的方法。

4

1 回答 1

1

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

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

如果您正在使用,QQmlApplicationEngine那么您必须使用ApplicationWindowor Window,并且这些类继承自,QQuickWindow因此我们可以使用它们的方法,因为在 Python 中,与 C++ 不同,强制转换是自动QQuickWindow的,具有 close、show 和 hide 方法。

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_()) 

您可以在以下 链接中找到完整的代码

于 2018-05-26T18:27:03.407 回答