从 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
,那么您必须使用 ApplicationWindow
或 Window
,而这些 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
我有一个我想最小化到系统托盘的小应用程序,我确实有创建图标并将其最小化到系统托盘的代码,只需按下一个按钮,(我有意不想覆盖默认的关闭操作).
但是,我不知道如何从 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
,那么您必须使用 ApplicationWindow
或 Window
,而这些 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