照着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. 基于.NET CORE微服务框架 -谈谈surging的服务容错降级

    一.前言 对于不久开源的surging受到不少.net同学的青睐,也受到.net core学习小组的关注,邀请加入.NET China Foundation以方便国内.net core开源项目的推广, ...

  2. zabbix 配置发送邮件报警

    标签:监控/SQLServer/Windows 概述 本篇文章主要介绍如何配置zabbix借助外部邮件进行发送邮件报警,zabbix通过配置文件调用mailx来进行邮件的发送.在Centos6以上的版 ...

  3. session的用法

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  4. wampserver集成包的配置

    1.修改www/index.php    修改如下:                    $projectContents .= '<li><a href="';     ...

  5. Android与NativeC传递数据不正确问题

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Android studio 2.3.3 这两天一直在调试一个BUG,具体为通过 NativeC 来处理上层Android ...

  6. Java虚拟机垃圾回收机制

    在Java虚拟机中,对象和数组的内存都是在堆中分配的,垃圾收集器主要回收的内存就是再堆内存中.如果在Java程序运行过程中,动态创建的对象或者数组没有及时得到回收,持续积累,最终堆内存就会被占满,导致 ...

  7. git中常用的指令

    1.初始化仓库 git init2.设置用户名与邮箱 git config --global user.name 'name' git config --global user.email 'emai ...

  8. swift 获取文件的Md5值

    获取文件的Md5值的方法如下 func md5File(url: URL) -> String? { let bufferSize = 1024 * 1024 do { //打开文件 let f ...

  9. 三菱Q系列PLC基本指令讲解

    1.数据传送指令MOV和MOVP,格式为 MOV    SRC1    DES1     表示条件接通,将SRC1的值传送到DES1寄存器中,带P的表示只在条件接通的上升沿指令执行一个扫描周期,不带P ...

  10. 解读 Vue 之 Reactive

    本文同步发表在 https://github.com/whxaxes/blog/issues/7 前言 在一篇文章中简单讲了 vue 是如何把模板解析成 render function 的,这一篇文章 ...