照着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. Android - FragmentTabHost 与 Fragment 制作页面切换效果

    使用 FragmentTabHost 与 Fragment 制作页面切换效果 API 19 TabHost已经不建议使用了.用 FragmentTabHost 来代替TabHost.实际上 Fragm ...

  2. nyoj_16:矩形嵌套

    DAG上的动态规划 小技巧:max_element(a, a+n)返回的是数组a从下标0的位置到下标n-1的位置中的n个元素中最大元素的地址. 题目链接: http://acm.nyist.net/J ...

  3. maven简介及基础使用

    一.Maven简介 Maven可译为"知识的积累"."专家",主要服务于基于Java平台的项目构建.依赖管理和项目信息管理. 1.Maven-项目构建工具    ...

  4. Spring源码情操陶冶-AbstractApplicationContext#finishRefresh

    承接前文Spring源码情操陶冶-AbstractApplicationContext#finishBeanFactoryInitialization 约定web.xml配置的contextClass ...

  5. 解决input[type=file]打开时慢、卡顿问题

    经过测试发现,在mac里面safari.Firefox.Chrome(opera不知道为啥老闪退)都没有卡顿问题 在windows里面,Firefox不卡顿,只有Chrome卡顿. 然而,这个插件是从 ...

  6. Android 性能测试——Memory Monitor 工具

    Android 性能测试--Memory Monitor 工具 Memory Monitor能做什么? 实时查看App的内存分配情况 快速判断App是否由于GC操作造成卡顿 快速判断App的Crash ...

  7. spring-boot整合mybatis(1)

    sprig-boot是一个微服务架构,加快了spring工程快速开发,以及简便了配置.接下来开始spring-boot与mybatis的整合. 1.创建一个maven工程命名为spring-boot- ...

  8. Javascript跨域后台设置拦截

    子域名之间互相访问需要跨域 结论放在开头: 服务端必须设置允许跨域 客户端带cookie需要设置withCredentials 无论服务端是否允许跨域,该request都会完整执行 options预请 ...

  9. Vue项目搭建完整剖析全过程

    Vue项目搭建完整剖析全过程 项目源码地址:https://github.com/ballyalex 有帮助的话就加个星星呗~!  项目技术栈:vue+webpack+bower+sass+axios ...

  10. android四大组件学习总结以及各个组件示例(1)

    android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个 ...