这个程序主要完成几个目的:

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 关闭程序显示提示信息+最小化程序到托盘+隐藏任务栏图标相关推荐

  1. html如何让窗口不在任务栏显示,电脑最小化窗口后无法在任务栏中显示怎么解决...

    ‍ 我们知道在电脑系统中打开的程序,可以点击最小化,这样可以暂时不显示该程序的窗口,然后可以从任务栏中点击再次打开.但有用户却发现无法在任务栏上显示已经被最小化的窗口.接下来系统城小编会提供几种方法, ...

  2. 【pyqt5学习】——窗口最小化至托盘、取消任务栏图标

    目录 1.最小化至托盘 1)重写系统托盘类,设置托盘图标等属性 2)将具体的窗口放入托盘 2.取消任务栏界面图标 3.问题汇总 1)退出后托盘图标还是存在,没有消失 2)最小化后左下角会出现 窗口 3 ...

  3. MFC中将窗口最小化到系统托盘和还原

    通过以下步骤可以在MFC程序中将窗口最小化到系统托盘,和还原成窗口,附加代码中如有特殊说明则会用红色标出. 1.添加一个ICON图标,其ID为IDI_ICON_TESTICON,在VS2008坐标的R ...

  4. 打开计算机无法最小化,软件一打开就最小化到任务栏怎么办_电脑打开程序它就最小化的解决方法...

    最近有朋友问小编软件一打开就最小化到任务栏怎么办的问题,为什么电脑打开软件自己变成最小化呢?其实有很多朋友都遇到过软件打开直接最小化打不开了的问题,那么窗口一直最小化打不开的解决方法是什么呢?别着急, ...

  5. VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题)

    VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题) 参考文章: (1)VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题) (2)https://www.cnblogs.com/ ...

  6. 打开计算机后 无法最小化,最小化窗口后无法在任务栏中显示的三种解决方法...

    [文章导读]最近有用户反映打开的窗口最小化后无法在任务栏中显示,通常情况下点击程序的最小化按钮都会显示在任务栏中,方便我们点击再次打开. 最近有用户反映打开的窗口最小化后无法在任务栏中显示,通常情况下 ...

  7. QT制作的软件全屏显示后最小化,点击任务栏图标打开时不是全屏

    QT制作的软件全屏显示后最小化,点击任务栏图标打开时不是全屏 前言 用QT做了一个小软件,把它自带的窗口栏给屏蔽了自己搞了关闭和最小化的按钮,且软件打开是全屏显示的.如今遇到的问题是,打开软件全屏显示 ...

  8. win7系统计算机无最小化,win7纯净版系统任务栏无法显示网页最小化窗口怎么办...

    最近有位用户说win7纯净版任务栏无法显示网页最小化窗口,一般情况下,我们在使用浏览器完都会直接点击窗口最小化,网页窗口最小化到任务栏上.要使用的时候只要单击就可以将任务栏浏览器恢复到最大化,以方便网 ...

  9. win7计算机窗口无法最小化,win7系统任务栏无法显示网页最小化窗口的解决方法...

    很多小伙伴都遇到过win7系统任务栏无法显示网页最小化窗口的困惑吧,一些朋友看过网上零散的win7系统任务栏无法显示网页最小化窗口的处理方法,并没有完完全全明白win7系统任务栏无法显示网页最小化窗口 ...

  10. Delphi 7下最小化到系统托盘

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在Del ...

最新文章

  1. 根据当前时间获取本周,下周,上周日期
  2. java 获取第一帧_java获取视频的第一帧
  3. python爬虫代码1000行-最精简的爬虫 --仅需4行代码(python)
  4. ruby gem install rails 错误解决方法
  5. NGUI: UIPanel控件
  6. 企业网络带宽需求和跨地域网络连接的优化
  7. 字符串和json之间的互相转化
  8. 静态static关键字修饰成员方法
  9. jquery实现图片懒加载
  10. 时间转化_Excel常见时间日期函数全讲解,10个函数教你如何进行日期转化
  11. XV6陷入,中断和驱动程序
  12. C# OpenFileDialog 打开文件对话框 打开多文件对话框; 并获取其路径,文件名,扩展名/后缀名
  13. SQL必知必会知识点总结
  14. ROS节点运行管理launch文件
  15. 华南理工计算机就业棒棒,为梦想、为公益,华南理工大学学子为爱发声
  16. 第一次发博客想问这积分只能充钱送吗,一次就要冲100多?
  17. nuc8i7beh黑苹果_Intel NUC8i7BEH 黑苹果Hackintosh EFI引导
  18. Ballerina 1.0版增加了Java互操作性并以JVM为目标
  19. 推荐系统的混合加权技术研究
  20. 散焦光栅 matlab代码,散焦光栅测量光束漂移的光路设计仿真

热门文章

  1. sigil 查找替换_使用Sigil提高ePub电子书的质量
  2. AIME数学竞赛信息大全
  3. Matlab实现时间序列预测
  4. 谈下论坛和商城的开发项目
  5. 速看四川省企业技术中心拟认定名单已发布,共181家
  6. 湖南工程学院java期末考试_湖南工程学院 web java课程设计.docx
  7. 什么才是真正的架构设计
  8. JIRA导出工作日志到Excel
  9. 【C语言程序设计】穷举法典例------韩信点兵问题
  10. 【maven】Unable to find javadoc command: The environment variable JAVA_HOME is not correctly set.