PyQt利用QSystemTrayIcon类实现托盘功能

0 527
索鸟 2021-03-18
需要:0索币

开发环境: 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_())

 

————————————————

原文链接:https://blog.csdn.net/qq_40602000/article/details/109276102

回帖
  • 消灭零回复
相关主题
2020年最新最新Kubernetes视频教程(K8s)教程 2
程序员转型之制作网课变现,月入过万告别996 1
索鸟快传2.0发布啦 1
两个不同网络的电脑怎么实现文件的互相访问呢? 1
网盘多账号登录软件 1
Java实战闲云旅游项目基于vue+element-ui 1
单点登录技术解决方案基于OAuth2.0的网关鉴权RSA算法生成令牌 1
QT5获取剪贴板上文本信息QT设置剪贴板内容 1
springboot2实战在线购物系统电商系统 1
python web实战之爱家租房项目 1
windows COM实用入门教程 1
C++游戏开发之C++实现的水果忍者游戏 1
计算机视觉库opencv教程 1
node.js实战图书管理系统express框架实现 1
C++实战教程之远程桌面远程控制实战 1
相关主题
PHP7报A non well formed numeric value encountered 0
Linux系统下关闭mongodb的几种命令分享 0
mongodb删除数据、删除集合、删除数据库的命令 0
Git&Github极速入门与攻坚实战课程 0
python爬虫教程使用Django和scrapy实现 0
libnetsnmpmibs.so.31: cannot open shared object file 0
数据结构和算法视频教程 0
redis的hash结构怎么删除数据呢? 0
C++和LUA解析器的数据交互实战视频 0
mongodb errmsg" : "too many users are authenticated 0
C++基础入门视频教程 0
用30个小时精通C++视频教程可能吗? 0
C++分布式多线程游戏服务器开发视频教程socket tcp boost库 0
C++培训教程就业班教程 0
layui的util工具格式时间戳为字符串 0
C++实战教程之远程桌面远程控制实战 1
网络安全培训视频教程 0
LINUX_C++软件工程师视频教程高级项目实战 0
C++高级数据结构与算法视频教程 0
跨域问题很头疼?通过配置nginx轻松解决ajax跨域问题 0