pyqt5 关闭程序显示提示信息+最小化程序到托盘+隐藏任务栏图标
这个程序主要完成几个目的:
1. 主窗口控件最小化等操作后正常可用(点击按钮会在textBrowser中加入一行hello world);
2. 点击右上角x键可以显示提示信息且按钮功能正常(退出程序或者最小化到托盘);
3. 最小化到托盘后实现两个功能(左键单击显示或隐藏主界面,右键显示显示选线可以关闭或者显示主界面,);
1. 首先用designer新建了一个demo,这个demo上只有两个控件,一个是textBrowser,一个是pushButton,直接从designer侧边拖就行了。
有空还可以设置下图标之类的。
总之整体界面长这样。
然后将这个界面换成py文件。
2. 新建一个主函数文件,随笔起个名字就叫demo.py吧
主要功能就是把这个设计的界面启动起来
#coding = 'utf-8'
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import Ui_untitled
import time# 函数功能:在textBrowser中添加hello world字段
# 输入参数:ui对象
# 输出参数:
def buttonClicked(girl):girl.textBrowser.append("hello world")if __name__ == '__main__':# 创建一个应用对象app = QtWidgets.QApplication(sys.argv)# 创建QT主窗口对象MainWindow = QtWidgets.QMainWindow()# 创建UI对象ui = Ui_untitled.Ui_MainWindow()# 调用setupUi方法,将设计好的界面-->主窗口上ui.setupUi(MainWindow)ui.pushButton.clicked.connect(lambda:buttonClicked(ui))# 显示一个非模式的对话框,用户可以随便切窗口,.exec()是模式对话框,用户不能随便切MainWindow.show()# sys.exit(app.exec_())
然后这个自动生成ui的py文件长这样
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'c:\My_World\gitee_code\qt_toolkit\hello_world\untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(800, 600)icon = QtGui.QIcon()icon.addPixmap(QtGui.QPixmap("c:\\My_World\\gitee_code\\qt_toolkit\\hello_world\\sys-user.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)MainWindow.setWindowIcon(icon)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)self.textBrowser.setGeometry(QtCore.QRect(160, 110, 256, 192))self.textBrowser.setObjectName("textBrowser")self.pushButton = QtWidgets.QPushButton(self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(570, 190, 75, 23))self.pushButton.setObjectName("pushButton")MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))self.menubar.setObjectName("menubar")MainWindow.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))self.pushButton.setText(_translate("MainWindow", "PushButton"))
3. 添加托盘图标功能
这个具体可以看这个https://blog.csdn.net/marwenx/article/details/107200049
主要就是我们要新建一个类,专门搞这个托盘功能的。
class TrayIcon(QtWidgets.QSystemTrayIcon):def __init__(self,MainWindow,parent=None):super(TrayIcon, self).__init__(parent)self.ui = MainWindowself.createMenu()def createMenu(self):self.menu = QtWidgets.QMenu()self.showAction1 = QtWidgets.QAction("启动", self, triggered=self.show_window)self.showAction2 = QtWidgets.QAction("显示通知", self,triggered=self.showMsg)self.quitAction = QtWidgets.QAction("退出", self, triggered=self.quit)self.menu.addAction(self.showAction1)self.menu.addAction(self.showAction2)self.menu.addAction(self.quitAction)self.setContextMenu(self.menu)#设置图标self.setIcon(QtGui.QIcon("c:\\My_World\\gitee_code\\qt_toolkit\\hello_world\\sys-user.png"))self.icon = self.MessageIcon()#把鼠标点击图标的信号和槽连接self.activated.connect(self.onIconClicked)def showMsg(self):self.showMessage("Message", "skr at here", self.icon)def show_window(self):#若是最小化,则先正常显示窗口,再变为活动窗口(暂时显示在最前面)self.ui.showNormal()self.ui.activateWindow()def quit(self):QtWidgets.qApp.quit()#鼠标点击icon传递的信号会带有一个整形的值,1是表示单击右键,2是双击,3是单击左键,4是用鼠标中键点击def onIconClicked(self, reason):if reason == 2 or reason == 3:# self.showMessage("Message", "skr at here", self.icon)if self.ui.isMinimized() or not self.ui.isVisible():#若是最小化,则先正常显示窗口,再变为活动窗口(暂时显示在最前面)self.ui.showNormal()self.ui.activateWindow()self.ui.setWindowFlags(QtCore.Qt.Window)self.ui.show()else:#若不是最小化,则最小化self.ui.showMinimized()self.ui.setWindowFlags(QtCore.Qt.SplashScreen)self.ui.show()# self.ui.show()
这个类实现了托盘的几个功能,首先是初始化时创建一个托盘的按钮和图标,并且createMenu方法中创建了三个右键的功能菜单。
4. 右上角关闭按钮的提示功能和最小化到托盘中的功能。需要重写下closeEvent方法,所以这里创建一个新类。
class Dialog(QtWidgets.QMainWindow):def __init__(self,MainWindow,parent=None):super(Dialog, self).__init__(parent)def closeEvent(self, event):reply = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Question, self.tr("提示"), self.tr("汝妻子我养之,汝勿虑之。\n 汝特么确定要退出吗?"), QtWidgets.QMessageBox.NoButton, self)yr_btn = reply.addButton(self.tr("是的我要退出"), QtWidgets.QMessageBox.YesRole)reply.addButton(self.tr("最小化到托盘"), QtWidgets.QMessageBox.NoRole)reply.exec_()if reply.clickedButton() == yr_btn:event.accept()QtWidgets.qApp.quit()# sys.exit(app.exec_())else:event.ignore()# 最小化到托盘MainWindow.setWindowFlags(QtCore.Qt.SplashScreen | QtCore.Qt.FramelessWindowHint)MainWindow.showMinimized()# 默认直接调用QMessageBox.question 弹出询问的方法# reply = QtWidgets.QMessageBox.question(self,# '本程序',# "是否要退出程序?",# QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)# if reply == QtWidgets.QMessageBox.Yes:# event.accept()# elif reply == QtWidgets.QMessageBox.No:# event.ignore()# MainWindow.setWindowFlags(QtCore.Qt.SplashScreen | QtCore.Qt.FramelessWindowHint)# MainWindow.showMinimized()# else:# # 最小化到托盘# MainWindow.setWindowFlags(QtCore.Qt.SplashScreen | QtCore.Qt.FramelessWindowHint)# MainWindow.showMinimized()
类中有两种办法显示这个提示功能,第二种方法被注释了。
详见:https://mp.csdn.net/console/editor/html/107226531
这个类完成了两个功能,一个是将关闭按钮加入了提示功能,一个是在提示信息中加入最小化到托盘的功能。
5. 写一个main。
if __name__ == '__main__':# 创建一个应用对象app = QtWidgets.QApplication(sys.argv)# 创建QT主窗口对象MainWindow = QtWidgets.QMainWindow()# 创建UI对象ui = Ui_untitled.Ui_MainWindow()MainWindow = Dialog(MainWindow)# 调用setupUi方法,将设计好的界面-->主窗口上ui.setupUi(MainWindow)MainWindow.setWindowFlags(QtCore.Qt.Window)# MainWindow.setWindowFlags(QtCore.Qt.WindowTitleHint)ui.pushButton.clicked.connect(lambda:buttonClicked(ui))# min_tray(ui)# 显示一个非模式的对话框,用户可以随便切窗口,.exec()是模式对话框,用户不能随便切MainWindow.show()ti = TrayIcon(MainWindow)ti.show()# 结束程序sys.exit(app.exec_())
这个main函数需要一步一步解释了,大部分的解释我都写成了注释在代码中,不过还是有几行要解释下。
MainWindow = QtWidgets.QMainWindow()
MainWindow = Dialog(MainWindow)
之所以MainWindow会在创建对象时又作为参数传入,是因为想要这个最小化到托盘的功能,所以首先用QtWidgets.QMainWindow()创建一个主窗口对象,将这个对象作为参数再传入到我们重写方法(提示信息和最小化到托盘功能)的类中,这个类又是继承QtWidgets.QMainWindow()这个类的,所以最终的MainWindow对象是重写了方法的QtWidgets.QMainWindow()类对象。
我不擅长面向对象,一般都是写面向过程解决,这个方法有点笨,大家应该有更好的办法解决。
所以整个代码就是这个样子的
首先是demo.py文件
#coding = 'utf-8'
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import Ui_untitled
import time# 函数功能:在textBrowser中添加hello world字段
# 输入参数:ui对象
# 输出参数:
def buttonClicked(girl):girl.textBrowser.append("hello world")class TrayIcon(QtWidgets.QSystemTrayIcon):def __init__(self,MainWindow,parent=None):super(TrayIcon, self).__init__(parent)self.ui = MainWindowself.createMenu()def createMenu(self):self.menu = QtWidgets.QMenu()self.showAction1 = QtWidgets.QAction("启动", self, triggered=self.show_window)self.showAction2 = QtWidgets.QAction("显示通知", self,triggered=self.showMsg)self.quitAction = QtWidgets.QAction("退出", self, triggered=self.quit)self.menu.addAction(self.showAction1)self.menu.addAction(self.showAction2)self.menu.addAction(self.quitAction)self.setContextMenu(self.menu)#设置图标self.setIcon(QtGui.QIcon("c:\\My_World\\gitee_code\\qt_toolkit\\hello_world\\sys-user.png"))self.icon = self.MessageIcon()#把鼠标点击图标的信号和槽连接self.activated.connect(self.onIconClicked)def showMsg(self):self.showMessage("Message", "skr at here", self.icon)def show_window(self):#若是最小化,则先正常显示窗口,再变为活动窗口(暂时显示在最前面)self.ui.showNormal()self.ui.activateWindow()def quit(self):QtWidgets.qApp.quit()#鼠标点击icon传递的信号会带有一个整形的值,1是表示单击右键,2是双击,3是单击左键,4是用鼠标中键点击def onIconClicked(self, reason):if reason == 2 or reason == 3:# self.showMessage("Message", "skr at here", self.icon)if self.ui.isMinimized() or not self.ui.isVisible():#若是最小化,则先正常显示窗口,再变为活动窗口(暂时显示在最前面)self.ui.showNormal()self.ui.activateWindow()self.ui.setWindowFlags(QtCore.Qt.Window)self.ui.show()else:#若不是最小化,则最小化self.ui.showMinimized()self.ui.setWindowFlags(QtCore.Qt.SplashScreen)self.ui.show()# self.ui.show()class Dialog(QtWidgets.QMainWindow):def __init__(self,MainWindow,parent=None):super(Dialog, self).__init__(parent)def closeEvent(self, event):reply = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Question, self.tr("提示"), self.tr("汝妻子我养之,汝勿虑之。\n 汝特么确定要退出吗?"), QtWidgets.QMessageBox.NoButton, self)yr_btn = reply.addButton(self.tr("是的我要退出"), QtWidgets.QMessageBox.YesRole)reply.addButton(self.tr("最小化到托盘"), QtWidgets.QMessageBox.NoRole)reply.exec_()if reply.clickedButton() == yr_btn:event.accept()QtWidgets.qApp.quit()# sys.exit(app.exec_())else:event.ignore()# 最小化到托盘MainWindow.setWindowFlags(QtCore.Qt.SplashScreen | QtCore.Qt.FramelessWindowHint)MainWindow.showMinimized()# 默认直接调用QMessageBox.question 弹出询问的方法# reply = QtWidgets.QMessageBox.question(self,# '本程序',# "是否要退出程序?",# QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)# if reply == QtWidgets.QMessageBox.Yes:# event.accept()# elif reply == QtWidgets.QMessageBox.No:# event.ignore()# MainWindow.setWindowFlags(QtCore.Qt.SplashScreen | QtCore.Qt.FramelessWindowHint)# MainWindow.showMinimized()# else:# # 最小化到托盘# MainWindow.setWindowFlags(QtCore.Qt.SplashScreen | QtCore.Qt.FramelessWindowHint)# MainWindow.showMinimized()if __name__ == '__main__':# 创建一个应用对象app = QtWidgets.QApplication(sys.argv)# 创建QT主窗口对象MainWindow = QtWidgets.QMainWindow()# 创建UI对象ui = Ui_untitled.Ui_MainWindow()MainWindow = Dialog(MainWindow)# 调用setupUi方法,将设计好的界面-->主窗口上ui.setupUi(MainWindow)MainWindow.setWindowFlags(QtCore.Qt.Window)# MainWindow.setWindowFlags(QtCore.Qt.WindowTitleHint)ui.pushButton.clicked.connect(lambda:buttonClicked(ui))# min_tray(ui)# 显示一个非模式的对话框,用户可以随便切窗口,.exec()是模式对话框,用户不能随便切MainWindow.show()ti = TrayIcon(MainWindow)ti.show()# 结束程序sys.exit(app.exec_())
然后是这个自动生成的ui的py文件
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'c:\My_World\gitee_code\qt_toolkit\hello_world\untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(800, 600)icon = QtGui.QIcon()icon.addPixmap(QtGui.QPixmap("c:\\My_World\\gitee_code\\qt_toolkit\\hello_world\\sys-user.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)MainWindow.setWindowIcon(icon)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)self.textBrowser.setGeometry(QtCore.QRect(160, 110, 256, 192))self.textBrowser.setObjectName("textBrowser")self.pushButton = QtWidgets.QPushButton(self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(570, 190, 75, 23))self.pushButton.setObjectName("pushButton")MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))self.menubar.setObjectName("menubar")MainWindow.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))self.pushButton.setText(_translate("MainWindow", "PushButton"))
运行这个demo.py文件,就可以完成之前设计的功能。
pyqt5 关闭程序显示提示信息+最小化程序到托盘+隐藏任务栏图标相关推荐
- html如何让窗口不在任务栏显示,电脑最小化窗口后无法在任务栏中显示怎么解决...
我们知道在电脑系统中打开的程序,可以点击最小化,这样可以暂时不显示该程序的窗口,然后可以从任务栏中点击再次打开.但有用户却发现无法在任务栏上显示已经被最小化的窗口.接下来系统城小编会提供几种方法, ...
- 【pyqt5学习】——窗口最小化至托盘、取消任务栏图标
目录 1.最小化至托盘 1)重写系统托盘类,设置托盘图标等属性 2)将具体的窗口放入托盘 2.取消任务栏界面图标 3.问题汇总 1)退出后托盘图标还是存在,没有消失 2)最小化后左下角会出现 窗口 3 ...
- MFC中将窗口最小化到系统托盘和还原
通过以下步骤可以在MFC程序中将窗口最小化到系统托盘,和还原成窗口,附加代码中如有特殊说明则会用红色标出. 1.添加一个ICON图标,其ID为IDI_ICON_TESTICON,在VS2008坐标的R ...
- 打开计算机无法最小化,软件一打开就最小化到任务栏怎么办_电脑打开程序它就最小化的解决方法...
最近有朋友问小编软件一打开就最小化到任务栏怎么办的问题,为什么电脑打开软件自己变成最小化呢?其实有很多朋友都遇到过软件打开直接最小化打不开了的问题,那么窗口一直最小化打不开的解决方法是什么呢?别着急, ...
- VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题)
VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题) 参考文章: (1)VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题) (2)https://www.cnblogs.com/ ...
- 打开计算机后 无法最小化,最小化窗口后无法在任务栏中显示的三种解决方法...
[文章导读]最近有用户反映打开的窗口最小化后无法在任务栏中显示,通常情况下点击程序的最小化按钮都会显示在任务栏中,方便我们点击再次打开. 最近有用户反映打开的窗口最小化后无法在任务栏中显示,通常情况下 ...
- QT制作的软件全屏显示后最小化,点击任务栏图标打开时不是全屏
QT制作的软件全屏显示后最小化,点击任务栏图标打开时不是全屏 前言 用QT做了一个小软件,把它自带的窗口栏给屏蔽了自己搞了关闭和最小化的按钮,且软件打开是全屏显示的.如今遇到的问题是,打开软件全屏显示 ...
- win7系统计算机无最小化,win7纯净版系统任务栏无法显示网页最小化窗口怎么办...
最近有位用户说win7纯净版任务栏无法显示网页最小化窗口,一般情况下,我们在使用浏览器完都会直接点击窗口最小化,网页窗口最小化到任务栏上.要使用的时候只要单击就可以将任务栏浏览器恢复到最大化,以方便网 ...
- win7计算机窗口无法最小化,win7系统任务栏无法显示网页最小化窗口的解决方法...
很多小伙伴都遇到过win7系统任务栏无法显示网页最小化窗口的困惑吧,一些朋友看过网上零散的win7系统任务栏无法显示网页最小化窗口的处理方法,并没有完完全全明白win7系统任务栏无法显示网页最小化窗口 ...
- Delphi 7下最小化到系统托盘
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在Del ...
最新文章
- 根据当前时间获取本周,下周,上周日期
- java 获取第一帧_java获取视频的第一帧
- python爬虫代码1000行-最精简的爬虫 --仅需4行代码(python)
- ruby gem install rails 错误解决方法
- NGUI: UIPanel控件
- 企业网络带宽需求和跨地域网络连接的优化
- 字符串和json之间的互相转化
- 静态static关键字修饰成员方法
- jquery实现图片懒加载
- 时间转化_Excel常见时间日期函数全讲解,10个函数教你如何进行日期转化
- XV6陷入,中断和驱动程序
- C# OpenFileDialog 打开文件对话框 打开多文件对话框; 并获取其路径,文件名,扩展名/后缀名
- SQL必知必会知识点总结
- ROS节点运行管理launch文件
- 华南理工计算机就业棒棒,为梦想、为公益,华南理工大学学子为爱发声
- 第一次发博客想问这积分只能充钱送吗,一次就要冲100多?
- nuc8i7beh黑苹果_Intel NUC8i7BEH 黑苹果Hackintosh EFI引导
- Ballerina 1.0版增加了Java互操作性并以JVM为目标
- 推荐系统的混合加权技术研究
- 散焦光栅 matlab代码,散焦光栅测量光束漂移的光路设计仿真
热门文章
- sigil 查找替换_使用Sigil提高ePub电子书的质量
- AIME数学竞赛信息大全
- Matlab实现时间序列预测
- 谈下论坛和商城的开发项目
- 速看四川省企业技术中心拟认定名单已发布,共181家
- 湖南工程学院java期末考试_湖南工程学院 web java课程设计.docx
- 什么才是真正的架构设计
- JIRA导出工作日志到Excel
- 【C语言程序设计】穷举法典例------韩信点兵问题
- 【maven】Unable to find javadoc command: The environment variable JAVA_HOME is not correctly set.