照着demo自己做了一遍,练练手

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore class SysTray(QtGui.QDialog):
    def __init__(self, parent=None):
        super(SysTray, self).__init__(parent)
        self.createIconGroupBox()
        self.createMessageGroupBox()
        self.createActions()
        self.createSysTray()         mainLayout = QtGui.QVBoxLayout()
        mainLayout.addWidget(self.iconGroupBox)
        mainLayout.addWidget(self.messageGroupBox)
        self.setLayout(mainLayout)         self.showMessageButton.clicked.connect(self.showMessage)
        self.iconCheckBox.stateChanged.connect(self.showIcon)
        # 即时刷新Tray Icon
        self.iconComboBox.currentIndexChanged.connect(self.setIcon)
        self.iconComboBox.setCurrentIndex(1)         self.trayIcon.activated.connect(self.iconActivated)         self.trayIcon.show()
        self.resize(400, 300)
        self.setWindowTitle("Systray")     def setIcon(self, index):
        icon = self.iconComboBox.itemIcon(index)
        self.trayIcon.setIcon(icon)
        self.setWindowIcon(icon)
        self.trayIcon.setToolTip(self.iconComboBox.itemText(index))     def showIcon(self, i):
        # Unchecked:i=0 Checked=2
        if i == QtCore.Qt.Unchecked:
            self.trayIcon.hide()
        else:
            self.trayIcon.show()     def iconActivated(self, reason):
        # 切换图标
        if reason in (QtGui.QSystemTrayIcon.Trigger, QtGui.QSystemTrayIcon.DoubleClick):
            max = self.iconComboBox.count()
            current = self.iconComboBox.currentIndex() + 1
            if current == max:
                current = 0
            self.iconComboBox.setCurrentIndex(current)     def showMessage(self):
        icon = self.typeComboBox.itemData(self.typeComboBox.currentIndex())
        self.trayIcon.showMessage(self.titleLine.text(), self.bodyText.toPlainText(), icon, self.durationSpin.value())     def closeEvent(self, event):
        # 重新定义“X”动作,如果iconCheckBox unchecked 就关闭窗口
        if self.trayIcon.isVisible():
            QtGui.QMessageBox.information(self, "SysTray",
                                          "The program will keep running in the system tray. To "
                                          "terminate the program, choose <b>Quit</b> in the "
                                          "context menu of the system tray entry.")
            self.hide()
            event.ignore()     def createActions(self):
        self.minimizeAction = QtGui.QAction("Mi&nimize", self, triggered=self.showMinimized)
        self.maximumAction = QtGui.QAction("Ma&ximum", self, triggered=self.showMaximized)
        self.restoreAction = QtGui.QAction("&Restore", self, triggered=self.showNormal)
        self.quitAction = QtGui.QAction("&Quit", self, triggered=QtGui.qApp.quit)     def createSysTray(self):
        self.trayIconMenu = QtGui.QMenu(self)
        self.trayIconMenu.addAction(self.minimizeAction)
        self.trayIconMenu.addAction(self.maximumAction)
        self.trayIconMenu.addAction(self.restoreAction)
        self.trayIconMenu.addSeparator()
        self.trayIconMenu.addAction(self.quitAction)         self.trayIcon = QtGui.QSystemTrayIcon(self)
        self.trayIcon.setContextMenu(self.trayIconMenu)     def createIconGroupBox(self):
        self.iconGroupBox = QtGui.QGroupBox('Tray Box')         self.iconLabel = QtGui.QLabel('Icon: ')
        self.iconComboBox = QtGui.QComboBox()
        self.iconComboBox.addItem(QtGui.QIcon('resource/heart.svg'), 'heart')
        self.iconComboBox.addItem(QtGui.QIcon('resource/trash.svg'), 'trash')
        self.iconComboBox.addItem(QtGui.QIcon('resource/bad.svg'), 'bad')         self.iconCheckBox = QtGui.QCheckBox('Show Icon')
        self.iconCheckBox.setChecked(True)         iconLayout = QtGui.QHBoxLayout()
        iconLayout.addWidget(self.iconLabel)
        iconLayout.addWidget(self.iconComboBox)
        iconLayout.addStretch()
        iconLayout.addWidget(self.iconCheckBox)         self.iconGroupBox.setLayout(iconLayout)     def createMessageGroupBox(self):
        self.messageGroupBox = QtGui.QGroupBox('Ballon Message')
        self.typeLabel = QtGui.QLabel('Type: ')
        #addItem (QString, QVariant)
        #addItem (QIcon, QString, QVariant)
        #QVariant QComboBox.itemData(int)
        #这里的QVariant很重要,保存了大量大数据类型
        self.typeComboBox = QtGui.QComboBox()
        self.typeComboBox.addItem("None", QtGui.QSystemTrayIcon.NoIcon)
        self.typeComboBox.addItem(
            self.style().standardIcon(QtGui.QStyle.SP_MessageBoxInformation), 'Informathion',
            QtGui.QSystemTrayIcon.Information)
        self.typeComboBox.addItem(
            self.style().standardIcon(QtGui.QStyle.SP_MessageBoxWarning), 'Warniing', QtGui.QSystemTrayIcon.Warning)
        self.typeComboBox.addItem(
            self.style().standardIcon(QtGui.QStyle.SP_MessageBoxCritical), 'Critical', QtGui.QSystemTrayIcon.Critical)
        self.typeComboBox.setCurrentIndex(1)         self.durationLabel = QtGui.QLabel('Duration: ')
        self.durationSpin = QtGui.QSpinBox()
        self.durationSpin.setSuffix('s')
        self.durationSpin.setRange(5, 15)
        self.durationDescLabel = QtGui.QLabel('some systems might ignore this hint')
        self.titleLabel = QtGui.QLabel('Title')
        self.titleLine = QtGui.QLineEdit('Cannot connect to network')
        self.bodyLabel = QtGui.QLabel('Body: ')
        self.bodyText = QtGui.QTextEdit()
        self.bodyText.setPlainText("Don't believe me. Honestly, I don't have "
                                   "a clue.\nClick this balloon for details.")
        self.showMessageButton = QtGui.QPushButton('Show Message')
        self.showMessageButton.setDefault(True)         messageGroupLayout = QtGui.QGridLayout()
        messageGroupLayout.addWidget(self.typeLabel, 0, 0)
        messageGroupLayout.addWidget(self.typeComboBox, 0, 1, 1, 2)
        messageGroupLayout.addWidget(self.durationLabel, 1, 0)
        messageGroupLayout.addWidget(self.durationSpin, 1, 1)
        messageGroupLayout.addWidget(self.durationDescLabel, 1, 2, 1, 3)
        messageGroupLayout.addWidget(self.titleLabel, 2, 0)
        messageGroupLayout.addWidget(self.titleLine, 2, 1, 1, 4)
        messageGroupLayout.addWidget(self.bodyLabel, 3, 0)
        messageGroupLayout.addWidget(self.bodyText, 3, 1, 2, 4)
        messageGroupLayout.addWidget(self.showMessageButton, 5, 4)
        # 设置拉伸的基准
        messageGroupLayout.setColumnStretch(3, 1)
        messageGroupLayout.setRowStretch(4, 1)         self.messageGroupBox.setLayout(messageGroupLayout) if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    tray = SysTray()
    tray.show()
    sys.exit(app.exec_())

PYQT4 : QSystemTrayIcon练习的更多相关文章

  1. Pyqt QSystemTrayIcon 实现托盘效果

    pyqt的托盘效果很好实现,在Pyqt的demo中有个例子 路径:PyQt4\examples\desktop\systray.py 今天我就仿这个Tray效果做效果 一. 创建UI trayicon ...

  2. pyqt4制作透明无边框窗体

    用PyQt做了一个无边框登陆窗口,效果如下: 下面是代码: # -*- coding: utf-8 -*- from PyQt4 import QtGui ,Qt ,QtCore image=QtGu ...

  3. PyQt4 初试牛刀二

    一.最小话托盘后,调用showNormal()后窗口不刷新,解决办法如下: 重写showNormal 方法,调用父类方法后,repaint窗体 def showNormal(self):     su ...

  4. 用 pyqt4 编写的一个翻译小工具

    有时候我们在开发时遇到一些陌生的英文单词或者不容易看出某些长句的中文意思时该怎么办呢?打开桌面上的翻译软件?打开浏览器里收藏着的翻译网址或者直接贴上百度的搜索框去查?这些方法固然可以,还很常见,但如果 ...

  5. PyQt4入门学习笔记(五)

    PyQt4里的对话框 对话框是大多数GUI应用中不可分割的一部分.一个对话框是两者或多者的会话.在GUI内,对话框是应用向人说话的方式.一个对话框可以用来输入数据,修改数据,改变应用设置等等. QtG ...

  6. PyQt4入门学习笔记(四)

    在PyQt4中的事件和信号 事件 所有的GUI应用都是事件驱动的.事件主要是来自于应用的使用者,但是像互联网连接,窗口管理器或者计时器也可以产生事件.当我们调用应用的exec_()方法时,应用就进入了 ...

  7. PyQt4入门学习笔记(三)

    # PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...

  8. 基于傅里叶变换和PyQt4开发一个简单的频率计数器

    小学期的<信号与系统>课,要求写一个频率计数器,下面是我个人理解的频率计数 傅里叶变换的代码: # coding=utf-8 import numpy as np from scipy.i ...

  9. PyQt4入门学习笔记(二)

    之前第一篇介绍了pyqt4的大小,移动位置,消息提示.这次我们介绍菜单和工具栏 QtGui.QmainWindow这个类可以给我们提供一个创建带有状态栏.工具栏和菜单栏的标准的应用. 状态栏 状态栏是 ...

随机推荐

  1. Ionic如何实现单选二级菜单切换

    Ionic如何实现单选二级菜单切换 最近有个需求,需要做一个用户视图,数据全都从PC端系统实时取,由于这个功能在电脑浏览器展示还可以,即使菜单全部展开,只要美工稍加调整下位置也是放得下的,但是同样的功 ...

  2. Codeforces_776E: The Holmes Children (数论 欧拉函数)

    题目链接 先看题目中给的函数f(n)和g(n) 对于f(n),若自然数对(x,y)满足 x+y=n,且gcd(x,y)=1,则这样的数对对数为f(n) 证明f(n)=phi(n) 设有命题 对任意自然 ...

  3. 微信小程序开发问答《五十四》同步请求授权 & 用户拒绝授权,重新调起授权 ... ...

    1.同步请求授权 需求分析: 1.在小程序首次打开的时候,我需要同时请求获取多个权限,由用户逐一授权. (['scope.userInfo','scope.userLocation','scope.a ...

  4. [C++ Calculator 项目] 文件读入与可视化实现

    Calculator V1.1 注:这是C++计算器项目第三.四部分-文件读写与可视化 [基于原代码重构而得] 源文件已上传至Github 文件读写 可视化 文件读写: Ⅰ.在原基础代码上增加了-f参 ...

  5. (转)log4j(六)——log4j.properties简单配置样例说明

    一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 1 老规矩,先来个栗子,然后再聊聊感受 (1)使用配文件的方式,是不是感觉非常的清爽,如果不在程序中读取配置文件就更加的清 ...

  6. Excel Countif函数用法

    公式:=COUNTIF(范围,条件) 例1: 统计A1:A11当中,等于数字3的单元格,结果是4个. 例2:还可以进行大于(>),大于等于(>=),小于(<),小于等于(<=) ...

  7. React 实践项目 (五)

    React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...

  8. centos7下安装PHP swoole扩展

    PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列, ...

  9. Qt之对话框消失动画

    一.效果展示 最近做了一个提示框消失的功能,觉着挺有意思,以前一直以为Qt子窗口不能做淡出效果,其实Qt的淡出功能已经帮我们封装好了,我们仅仅只需要几行代码就可以做出酷炫的窗口关闭效果,写此篇文章的时 ...

  10. ASP.NET Core 源码学习之 Logging[2]:Configure

    在上一章中,我们对 ASP.NET Logging 系统做了一个整体的介绍,而在本章中则开始从最基本的配置开始,逐步深入到源码当中去. 默认配置 在 ASP.NET Core 2.0 中,对默认配置做 ...