照着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. background:rgba() 兼容ie8 用法

    background: rgba(255,255,255,.1);//火狐,谷歌等 filter:progid:DXImageTransform.Microsoft.gradient(startCol ...

  2. Java--反射的逐步理解

    层层引入反射的作用 一.类类型的概念:所有类都是对象,是Class类的实例对象,这个对象我们成为该类的类类型 1.下面是一个小的test,以产生3种方式的类类型: public class test ...

  3. luogu P1494 岳麓山上打水 [iddfs]

    题目描述 今天天气好晴朗,处处好风光,好风光!蝴蝶儿忙啊,蜜蜂也忙,信息组的同学们更加忙.最近,由于XX原因,大家不得不到岳麓山去提水.55555555~,好累啊. 信息组有一个容量为q升的大缸,由于 ...

  4. Linux通过shell执行自动化部署

    背景 通过shell判断是否存在补丁更新,进行自动化的部署 代码 #!/bin/sh #Edit:何彦霆 #version: beta #执行环境初始化 source /hxspace/product ...

  5. java加减的二进制实现

    Java中整数基本类型有byte,short,int,long,大小分别为1.2.4.8个字节,一个字节大小为8位,也就是8个二进制码(0/1)组成. 计算机中二进制码分为原码,反码,补码.在计算机中 ...

  6. (转)添加eclipse、MyEclipse、Spring Tool Suite的反编译插件

    很多兄弟为在IDE里看不到源代码类而不得不下一个反编译工具,但是这样会降低代码效率,如果能直接在IDE里看,何乐而不为呢!现在我整理了一下网上很多兄弟的设置反编译的经验. 可分为下面几步. 1 下载J ...

  7. 踩坑之路_"var name = ' ';"_迷之BUG

    情景介绍:最近写一个拖拽生成图表的工具,自己的思路每次mousedown的时候动态将this的name属性值赋值给全局中变量(自己手贱测试时直接将变量名命名为了'name',一大波bug还有30s到达 ...

  8. mbos之动态图表设计

    前言 所谓,一图胜千言.人脑有80%的部分专门用于视觉处理.而随着数据时代的全面来临,我们自然有必要将数据转化为图形与图表. Mbos是一个快速,稳定的云端轻应用开发平台.帮助企业快速开发移动应用,加 ...

  9. Vue模板内容

    前面的话 如果只使用Vue最基础的声明式渲染的功能,则完全可以把Vue当做一个模板引擎来使用.本文将详细介绍Vue模板内容 概述 Vue.js使用了基于HTML的模板语法,允许声明式地将DOM绑定至底 ...

  10. log4j实时将数据写入到kafka,Demo和相关的配置详解

    一:在项目中引入对应的JAR包,如下,注意对应的包与之前包的冲突 <dependencies> <dependency> <groupId>junit</gr ...