PyQt 实现系统托盘QSystemTrayIcon

开发环境: ubuntu16.04  +  PyQt5.14

官方资料:https://doc.qt.io/qt-5/desktop-integration.html

QSystemTrayIcon

QSystemTrayIcon类为应用程序在系统托盘中提供一个图标。

现代操作系统通常在桌面上提供一个特殊的区域,称为系统托盘或通知区域,长时间运行的应用程序可以显示图标和短消息。

QDesktopServices

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

猜你喜欢

转载自blog.csdn.net/qq_40602000/article/details/109276102
今日推荐