开发环境: ubuntu16.04 + PyQt5.14
官方资料:https://doc.qt.io/qt-5/desktop-integration.html
QSystemTrayIcon类为应用程序在系统托盘中提供一个图标。
现代操作系统通常在桌面上提供一个特殊的区域,称为系统托盘或通知区域,长时间运行的应用程序可以显示图标和短消息。
QDesktopServices类提供的函数用于访问常见的桌面服务。
许多桌面环境都会提供一系列服务,可以通过应用程序来执行常见任务。不仅可以打开本地浏览器,而且还可以打开本地文件(夹)等,可以获取桌面、Home等目录。
示例
主要功能:
- 关闭最后一个窗口不退出程序
- 托盘菜单显示:关于、日志、打开、退出四个菜单
- 关于:打开关于对话框
- 日志:查看日志
- 打开:打开主界面
- 退出:退出程序
- 主页面:点击连接、上电、登录等按钮,托盘消息显示提示信息
运行效果:
源码:
代码结构:
├── gui
│ ├── mainwindow.py
│ ├── ui_mainwindow.py
│ └── ui_mainwindow.ui
├── icon
│ ├── about.png
│ ├── icon.png
│ └── RR1582*1327.png
├── image.qrc
├── image_rc.py
├── runWin.py
核心代码:
mainwindow.py
from PyQt5.QtCore import QCoreApplication, QDateTime, QUrl
from PyQt5.QtGui import QIcon, QPixmap, QDesktopServices
from PyQt5.QtWidgets import QMainWindow, QAction, QMenu, QSystemTrayIcon, QApplication, QMessageBox
from gui.ui_mainwindow import Ui_MainWindow
from image_rc import *
class MainWidget(Ui_MainWindow, QMainWindow):
def __init__(self, parent=None):
super(MainWidget, self).__init__(parent)
self.setupUi(self)
self.setWindowTitle("桌面集成Python版本")
self.setWindowIcon(QIcon(":/icon/RR1582*1327.png"))
self.logAction = QAction("日志", self)
self.logAction.setIcon(QIcon.fromTheme("document-new"))
self.aboutAction = QAction("关于", self)
self.aboutAction.setIcon(QIcon.fromTheme("help-about"))
self.openAction = QAction("打开", self)
self.openAction.setIcon(QIcon.fromTheme("media-record"))
self.quitAction = QAction("退出", self)
self.quitAction.setIcon(QIcon.fromTheme("application-exit")) # 从系统主题获取图标
self.trayIconMenu = QMenu(self)
self.trayIconMenu.addAction(self.aboutAction)
self.trayIconMenu.addAction(self.logAction)
self.trayIconMenu.addSeparator()
self.trayIconMenu.addAction(self.openAction)
self.trayIconMenu.addAction(self.quitAction)
self.trayIcon = QSystemTrayIcon(self)
self.trayIcon.setContextMenu(self.trayIconMenu)
self.trayIcon.setIcon(QIcon(":/icon/icon.png"))
self.trayIcon.setToolTip("xxx")
self.trayIcon.show()
self.initWidget()
self.initConnect()
self.initLog()
def initWidget(self):
# 居中
desktop = QApplication.desktop()
current_screen = desktop.screenNumber(self) # 获取程序所在屏幕是第几个屏幕
rect = desktop.screenGeometry(current_screen) # 获取程序所在屏幕的尺寸
self.move((rect.width() - self.width())/2, (rect.height() - self.height())/2)
def initConnect(self):
self.quitAction.triggered.connect(self.quitApp)
self.openAction.triggered.connect(self.openApp)
self.aboutAction.triggered.connect(self.showAbout)
self.logAction.triggered.connect(self.openLog)
self.connectBtn.clicked.connect(self.showConnect)
self.powerBtn.clicked.connect(self.showPower)
self.loginBtn.clicked.connect(self.showLogin)
def initLog(self):
currentDateTime = QDateTime.currentDateTime()
time = currentDateTime.toString("yyyy/MM/dd HH:mm:ss")
f = open("./log.txt", "a")
f.write(time)
f.close()
def quitApp(self):
QCoreApplication.quit()
def openApp(self):
self.showNormal()
def showAbout(self):
msg = QMessageBox(self)
msg.setWindowTitle("关于")
msg.setText("桌面集成python实现\n \nCopyright © 2020-2020 JUN. \nAll Rights Reserved. ")
msg.setIconPixmap(QPixmap(":/icon/icon.png"))
msg.addButton("确定", QMessageBox.ActionRole)
msg.exec()
def openLog(self):
QDesktopServices.openUrl(QUrl("./log.txt"))
def closeEvent(self, event):
if self.trayIcon.isVisible():
QMessageBox.information(
self, "系统托盘", "程序将继续在系统托盘中运行。要终止该程序,请在系统托盘条目的上下文菜单中选择[退出]。")
def showConnect(self):
self.showMessage("连接", "已经连接机械手")
def showPower(self):
self.showMessage("上电", "机械手已上电")
def showLogin(self):
self.showMessage("权限", "切换权限USER1")
def showMessage(self, title, content):
self.trayIcon.showMessage(title, content, QSystemTrayIcon.Information, 1000)
runWin.py
import sys
from PyQt5.QtWidgets import QApplication
from gui.mainwindow import MainWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
QApplication.setQuitOnLastWindowClosed(False) # 关闭最后一个窗口不退出程序
window = MainWidget()
window.show()
sys.exit(app.exec_())