zoukankan      html  css  js  c++  java
  • Pyqt QSystemTrayIcon 实现托盘效果

        pyqt的托盘效果很好实现,在Pyqt的demo中有个例子

    路径:PyQt4examplesdesktopsystray.py

    今天我就仿这个Tray效果做效果

    一. 创建UI

    trayicon.ui文件:

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <ui version="4.0">
      3  <class>TrayIcon</class>
      4  <widget class="QWidget" name="TrayIcon">
      5   <property name="geometry">
      6    <rect>
      7     <x>0</x>
      8     <y>0</y>
      9     <width>418</width>
     10     <height>441</height>
     11    </rect>
     12   </property>
     13   <property name="maximumSize">
     14    <size>
     15     <width>1024</width>
     16     <height>16777215</height>
     17    </size>
     18   </property>
     19   <property name="windowTitle">
     20    <string>Form</string>
     21   </property>
     22   <layout class="QVBoxLayout" name="verticalLayout">
     23    <item>
     24     <widget class="QGroupBox" name="groupBoxTrayIcon">
     25      <property name="minimumSize">
     26       <size>
     27        <width>400</width>
     28        <height>100</height>
     29       </size>
     30      </property>
     31      <property name="maximumSize">
     32       <size>
     33        <width>16777215</width>
     34        <height>100</height>
     35       </size>
     36      </property>
     37      <property name="title">
     38       <string>托盘图标</string>
     39      </property>
     40      <layout class="QVBoxLayout" name="verticalLayout_2">
     41       <item>
     42        <layout class="QHBoxLayout" name="horizontalLayoutByrayicon">
     43         <item>
     44          <widget class="QLabel" name="label">
     45           <property name="text">
     46            <string>图标: </string>
     47           </property>
     48          </widget>
     49         </item>
     50         <item>
     51          <widget class="QComboBox" name="comboBoxIcon"/>
     52         </item>
     53         <item>
     54          <spacer name="horizontalSpacer">
     55           <property name="orientation">
     56            <enum>Qt::Horizontal</enum>
     57           </property>
     58           <property name="sizeHint" stdset="0">
     59            <size>
     60             <width>40</width>
     61             <height>20</height>
     62            </size>
     63           </property>
     64          </spacer>
     65         </item>
     66         <item>
     67          <widget class="QCheckBox" name="checkBoxShowIcon">
     68           <property name="text">
     69            <string>展示图标</string>
     70           </property>
     71          </widget>
     72         </item>
     73        </layout>
     74       </item>
     75       <item>
     76        <widget class="QCheckBox" name="checkBoxQQmsg">
     77         <property name="text">
     78          <string>QQ消息效果</string>
     79         </property>
     80        </widget>
     81       </item>
     82      </layout>
     83     </widget>
     84    </item>
     85    <item>
     86     <widget class="QGroupBox" name="groupBoxMessages">
     87      <property name="enabled">
     88       <bool>true</bool>
     89      </property>
     90      <property name="title">
     91       <string>气泡消息</string>
     92      </property>
     93      <layout class="QGridLayout" name="gridLayout">
     94       <item row="2" column="1">
     95        <widget class="QLabel" name="label_5">
     96         <property name="text">
     97          <string>标题: </string>
     98         </property>
     99        </widget>
    100       </item>
    101       <item row="1" column="1">
    102        <widget class="QLabel" name="label_3">
    103         <property name="text">
    104          <string>持续时长: </string>
    105         </property>
    106        </widget>
    107       </item>
    108       <item row="3" column="2">
    109        <widget class="QTextEdit" name="textEditContent"/>
    110       </item>
    111       <item row="0" column="1">
    112        <widget class="QLabel" name="label_2">
    113         <property name="text">
    114          <string>类型: </string>
    115         </property>
    116        </widget>
    117       </item>
    118       <item row="0" column="2">
    119        <widget class="QComboBox" name="comboBox_MsgInfo">
    120         <property name="maximumSize">
    121          <size>
    122           <width>100</width>
    123           <height>16777215</height>
    124          </size>
    125         </property>
    126        </widget>
    127       </item>
    128       <item row="1" column="2">
    129        <widget class="QSpinBox" name="spinBoxTime">
    130         <property name="enabled">
    131          <bool>true</bool>
    132         </property>
    133         <property name="sizePolicy">
    134          <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
    135           <horstretch>60</horstretch>
    136           <verstretch>0</verstretch>
    137          </sizepolicy>
    138         </property>
    139         <property name="maximumSize">
    140          <size>
    141           <width>60</width>
    142           <height>16777215</height>
    143          </size>
    144         </property>
    145        </widget>
    146       </item>
    147       <item row="2" column="2">
    148        <widget class="QLineEdit" name="lineEditTitle"/>
    149       </item>
    150       <item row="3" column="1">
    151        <widget class="QLabel" name="label_6">
    152         <property name="text">
    153          <string>内容: </string>
    154         </property>
    155         <property name="alignment">
    156          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
    157         </property>
    158        </widget>
    159       </item>
    160       <item row="4" column="2">
    161        <widget class="QPushButton" name="ShowButton">
    162         <property name="maximumSize">
    163          <size>
    164           <width>75</width>
    165           <height>16777215</height>
    166          </size>
    167         </property>
    168         <property name="text">
    169          <string>展示消息</string>
    170         </property>
    171        </widget>
    172       </item>
    173      </layout>
    174     </widget>
    175    </item>
    176   </layout>
    177  </widget>
    178  <resources/>
    179  <connections/>
    180 </ui>

    uic转换为py

    trayicon.py文件:

      1 # -*- coding: utf-8 -*-
      2 
      3 # Form implementation generated from reading ui file 'trayicon.ui'
      4 #
      5 # Created: Tue Mar 03 17:34:43 2015
      6 #      by: PyQt4 UI code generator 4.10.3
      7 #
      8 # WARNING! All changes made in this file will be lost!
      9 
     10 from PyQt4 import QtCore, QtGui
     11 
     12 try:
     13     _fromUtf8 = QtCore.QString.fromUtf8
     14 except AttributeError:
     15     def _fromUtf8(s):
     16         return s
     17 
     18 try:
     19     _encoding = QtGui.QApplication.UnicodeUTF8
     20     def _translate(context, text, disambig):
     21         return QtGui.QApplication.translate(context, text, disambig, _encoding)
     22 except AttributeError:
     23     def _translate(context, text, disambig):
     24         return QtGui.QApplication.translate(context, text, disambig)
     25 
     26 class Ui_TrayIcon(object):
     27     def setupUi(self, TrayIcon):
     28         TrayIcon.setObjectName(_fromUtf8("TrayIcon"))
     29         TrayIcon.resize(418, 441)
     30         TrayIcon.setMaximumSize(QtCore.QSize(1024, 16777215))
     31         self.verticalLayout = QtGui.QVBoxLayout(TrayIcon)
     32         self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
     33         self.groupBoxTrayIcon = QtGui.QGroupBox(TrayIcon)
     34         self.groupBoxTrayIcon.setMinimumSize(QtCore.QSize(400, 100))
     35         self.groupBoxTrayIcon.setMaximumSize(QtCore.QSize(16777215, 100))
     36         self.groupBoxTrayIcon.setObjectName(_fromUtf8("groupBoxTrayIcon"))
     37         self.verticalLayout_2 = QtGui.QVBoxLayout(self.groupBoxTrayIcon)
     38         self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
     39         self.horizontalLayoutByrayicon = QtGui.QHBoxLayout()
     40         self.horizontalLayoutByrayicon.setObjectName(_fromUtf8("horizontalLayoutByrayicon"))
     41         self.label = QtGui.QLabel(self.groupBoxTrayIcon)
     42         self.label.setObjectName(_fromUtf8("label"))
     43         self.horizontalLayoutByrayicon.addWidget(self.label)
     44         self.comboBoxIcon = QtGui.QComboBox(self.groupBoxTrayIcon)
     45         self.comboBoxIcon.setObjectName(_fromUtf8("comboBoxIcon"))
     46         self.horizontalLayoutByrayicon.addWidget(self.comboBoxIcon)
     47         spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
     48         self.horizontalLayoutByrayicon.addItem(spacerItem)
     49         self.checkBoxShowIcon = QtGui.QCheckBox(self.groupBoxTrayIcon)
     50         self.checkBoxShowIcon.setObjectName(_fromUtf8("checkBoxShowIcon"))
     51         self.horizontalLayoutByrayicon.addWidget(self.checkBoxShowIcon)
     52         self.verticalLayout_2.addLayout(self.horizontalLayoutByrayicon)
     53         self.checkBoxQQmsg = QtGui.QCheckBox(self.groupBoxTrayIcon)
     54         self.checkBoxQQmsg.setObjectName(_fromUtf8("checkBoxQQmsg"))
     55         self.verticalLayout_2.addWidget(self.checkBoxQQmsg)
     56         self.verticalLayout.addWidget(self.groupBoxTrayIcon)
     57         self.groupBoxMessages = QtGui.QGroupBox(TrayIcon)
     58         self.groupBoxMessages.setEnabled(True)
     59         self.groupBoxMessages.setObjectName(_fromUtf8("groupBoxMessages"))
     60         self.gridLayout = QtGui.QGridLayout(self.groupBoxMessages)
     61         self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
     62         self.label_5 = QtGui.QLabel(self.groupBoxMessages)
     63         self.label_5.setObjectName(_fromUtf8("label_5"))
     64         self.gridLayout.addWidget(self.label_5, 2, 1, 1, 1)
     65         self.label_3 = QtGui.QLabel(self.groupBoxMessages)
     66         self.label_3.setObjectName(_fromUtf8("label_3"))
     67         self.gridLayout.addWidget(self.label_3, 1, 1, 1, 1)
     68         self.textEditContent = QtGui.QTextEdit(self.groupBoxMessages)
     69         self.textEditContent.setObjectName(_fromUtf8("textEditContent"))
     70         self.gridLayout.addWidget(self.textEditContent, 3, 2, 1, 1)
     71         self.label_2 = QtGui.QLabel(self.groupBoxMessages)
     72         self.label_2.setObjectName(_fromUtf8("label_2"))
     73         self.gridLayout.addWidget(self.label_2, 0, 1, 1, 1)
     74         self.comboBox_MsgInfo = QtGui.QComboBox(self.groupBoxMessages)
     75         self.comboBox_MsgInfo.setMaximumSize(QtCore.QSize(100, 16777215))
     76         self.comboBox_MsgInfo.setObjectName(_fromUtf8("comboBox_MsgInfo"))
     77         self.gridLayout.addWidget(self.comboBox_MsgInfo, 0, 2, 1, 1)
     78         self.spinBoxTime = QtGui.QSpinBox(self.groupBoxMessages)
     79         self.spinBoxTime.setEnabled(True)
     80         sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
     81         sizePolicy.setHorizontalStretch(60)
     82         sizePolicy.setVerticalStretch(0)
     83         sizePolicy.setHeightForWidth(self.spinBoxTime.sizePolicy().hasHeightForWidth())
     84         self.spinBoxTime.setSizePolicy(sizePolicy)
     85         self.spinBoxTime.setMaximumSize(QtCore.QSize(60, 16777215))
     86         self.spinBoxTime.setObjectName(_fromUtf8("spinBoxTime"))
     87         self.gridLayout.addWidget(self.spinBoxTime, 1, 2, 1, 1)
     88         self.lineEditTitle = QtGui.QLineEdit(self.groupBoxMessages)
     89         self.lineEditTitle.setObjectName(_fromUtf8("lineEditTitle"))
     90         self.gridLayout.addWidget(self.lineEditTitle, 2, 2, 1, 1)
     91         self.label_6 = QtGui.QLabel(self.groupBoxMessages)
     92         self.label_6.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
     93         self.label_6.setObjectName(_fromUtf8("label_6"))
     94         self.gridLayout.addWidget(self.label_6, 3, 1, 1, 1)
     95         self.ShowButton = QtGui.QPushButton(self.groupBoxMessages)
     96         self.ShowButton.setMaximumSize(QtCore.QSize(75, 16777215))
     97         self.ShowButton.setObjectName(_fromUtf8("ShowButton"))
     98         self.gridLayout.addWidget(self.ShowButton, 4, 2, 1, 1)
     99         self.verticalLayout.addWidget(self.groupBoxMessages)
    100 
    101         self.retranslateUi(TrayIcon)
    102         QtCore.QMetaObject.connectSlotsByName(TrayIcon)
    103 
    104     def retranslateUi(self, TrayIcon):
    105         TrayIcon.setWindowTitle(_translate("TrayIcon", "Form", None))
    106         self.groupBoxTrayIcon.setTitle(_translate("TrayIcon", "托盘图标", None))
    107         self.label.setText(_translate("TrayIcon", "图标: ", None))
    108         self.checkBoxShowIcon.setText(_translate("TrayIcon", "展示图标", None))
    109         self.checkBoxQQmsg.setText(_translate("TrayIcon", "QQ消息效果", None))
    110         self.groupBoxMessages.setTitle(_translate("TrayIcon", "气泡消息", None))
    111         self.label_5.setText(_translate("TrayIcon", "标题: ", None))
    112         self.label_3.setText(_translate("TrayIcon", "持续时长: ", None))
    113         self.label_2.setText(_translate("TrayIcon", "类型: ", None))
    114         self.label_6.setText(_translate("TrayIcon", "内容: ", None))
    115         self.ShowButton.setText(_translate("TrayIcon", "展示消息", None))
    116 
    117 
    118 if __name__ == "__main__":
    119     import sys
    120     app = QtGui.QApplication(sys.argv)
    121     TrayIcon = QtGui.QWidget()
    122     ui = Ui_TrayIcon()
    123     ui.setupUi(TrayIcon)
    124     TrayIcon.show()
    125     sys.exit(app.exec_())

    二.逻辑的实现

    新建mainTray.py文件,内容:

      1 # -*- coding: UTF8 -*-
      2 # UI说明: 新建窗体,添加两个groupbox  右键 -- 布局 -- 垂直布局
      3 
      4 import sip
      5 sip.setapi('QVariant', 2)
      6 from PyQt4 import QtCore, QtGui
      7 from trayicon import Ui_TrayIcon
      8 import threading
      9 import icoqrc
     10 
     11 
     12 class mainTray(QtGui.QWidget):
     13     def __init__(self):
     14         super(mainTray, self).__init__()
     15         self.Ui= Ui_TrayIcon()
     16         self.Ui.setupUi(self)
     17         self.setWindowTitle(u'Pyqt 托盘效果')
     18         self.setWindowIcon(QtGui.QIcon(':chrome.ico'))
     19         # 填充Ui内容
     20         self.supplyUi()
     21 
     22         # 创建icon
     23         self.createTrayIcon()
     24 
     25         #通知区域icon显示
     26         self.Ui.comboBoxIcon.currentIndexChanged.connect(self.setIcon)  # 链接信号槽
     27         self.Ui.comboBoxIcon.setCurrentIndex(1)  # 设置当前combox
     28         self.trayIcon.activated.connect(self.iconActivated)   # 触发托盘事件
     29         self.Ui.checkBoxShowIcon.toggled.connect(self.trayIcon.setVisible)  # 触发是否显示托盘图标
     30         self.trayIcon.show()  # 托盘show
     31         self.Ui.ShowButton.clicked.connect(self.showMessage)   # 触发展示消息
     32         self.trayIcon.messageClicked.connect(self.messageClicked)   # 点击提示消息
     33         self.threadTask()  # 线程任务
     34         self.Ui.checkBoxQQmsg.toggled.connect(self.QQmsg)  # 触发QQ消息效果
     35 
     36 
     37 
     38 
     39 
     40 
     41     def supplyUi(self):
     42         # 托盘图标
     43         self.Ui.comboBoxIcon.addItem(QtGui.QIcon(':chrome.ico'), u'Chrome')
     44         self.Ui.comboBoxIcon.addItem(QtGui.QIcon(':firefox.ico'), u'Firefox')
     45         self.Ui.comboBoxIcon.addItem(QtGui.QIcon(':qq.ico'), u'QQ')
     46         self.Ui.comboBoxIcon.addItem(QtGui.QIcon(':flash.ico'), u'Flash')
     47         self.Ui.comboBoxIcon.addItem(QtGui.QIcon(':ie.ico'), u'IE')
     48         self.Ui.comboBoxIcon.addItem(QtGui.QIcon(':myfavicon.ico'), u'Favicon')
     49 
     50         # 默认展示托盘图标
     51         self.Ui.checkBoxShowIcon.setChecked(True)
     52 
     53         # 消息combox
     54         self.Ui.comboBox_MsgInfo.addItem("None", QtGui.QSystemTrayIcon.NoIcon)
     55         self.Ui.comboBox_MsgInfo.addItem(self.style().standardIcon(QtGui.QStyle.SP_MessageBoxInformation), u"信息提示", QtGui.QSystemTrayIcon.Information)
     56         self.Ui.comboBox_MsgInfo.addItem(self.style().standardIcon(QtGui.QStyle.SP_MessageBoxWarning), u"警告提示",  QtGui.QSystemTrayIcon.Warning)
     57         self.Ui.comboBox_MsgInfo.addItem(self.style().standardIcon(QtGui.QStyle.SP_MessageBoxCritical), u"严重警告",   QtGui.QSystemTrayIcon.Critical)
     58 
     59         # 时长显示
     60         self.Ui.spinBoxTime.setRange(5, 60)  # spinbox 在5--60 之间
     61         self.Ui.spinBoxTime.setSuffix(" s")  # 设置后缀  s  秒
     62         self.Ui.spinBoxTime.setValue(15)  # 默认值为15秒
     63 
     64         # 设置 标题和提示的初始化内容
     65         self.Ui.lineEditTitle.setText(u'无法连接到网络')
     66         self.Ui.textEditContent.setText(u'您的电脑无法连接到网络,请确保已经接入Internet,or WLAN 端口已经插好! 有问题请致电:<b>1389876543</b>')
     67     #  创建icon 与菜单
     68     def createTrayIcon(self):
     69         self.minimizeAction = QtGui.QAction(u"最小化", self, triggered=self.hide)
     70         self.maximizeAction = QtGui.QAction(u"最大化", self, triggered=self.showMaximized)
     71         self.restoreAction = QtGui.QAction(u"还原大小", self, triggered=self.showNormal)
     72         self.quitAction = QtGui.QAction(u"退出", self, triggered=QtGui.qApp.quit)
     73         self.trayIconMenu = QtGui.QMenu(self)
     74         self.trayIconMenu.addAction(self.minimizeAction)
     75         self.trayIconMenu.addAction(self.maximizeAction)
     76         self.trayIconMenu.addAction(self.restoreAction)
     77         self.trayIconMenu.addSeparator()  # 分割行
     78         self.trayIconMenu.addAction(self.quitAction)
     79         self.trayIcon = QtGui.QSystemTrayIcon(self)
     80         self.trayIcon.setContextMenu(self.trayIconMenu)
     81     # 触发托盘icon
     82     def iconActivated(self, reason):
     83         if reason in (QtGui.QSystemTrayIcon.Trigger, QtGui.QSystemTrayIcon.DoubleClick):
     84             self.Ui.comboBoxIcon.setCurrentIndex((self.Ui.comboBoxIcon.currentIndex() + 1) % self.Ui.comboBoxIcon.count())
     85         elif reason == QtGui.QSystemTrayIcon.MiddleClick:   # 点击鼠标滚动轴事件
     86             self.showMessage()
     87     # 设置icon
     88     def setIcon(self, index):
     89         icon = self.Ui.comboBoxIcon.itemIcon(index)
     90         self.trayIcon.setIcon(icon)
     91         self.setWindowIcon(icon)
     92         self.trayIcon.setToolTip(self.Ui.comboBoxIcon.itemText(index))
     93 
     94     # 展示消息
     95     def showMessage(self):
     96         icon = QtGui.QSystemTrayIcon.MessageIcon(self.Ui.comboBox_MsgInfo.itemData(self.Ui.comboBox_MsgInfo.currentIndex()))
     97         self.trayIcon.showMessage(self.Ui.lineEditTitle.text(),  self.Ui.textEditContent.toPlainText(), icon, self.Ui.spinBoxTime.value() * 1000)
     98 
     99     # 点击消息
    100     def messageClicked(self):
    101         QtGui.QMessageBox.information(None, "Systray","Sorry, I already gave what help I could.
    Maybe you should "  "try asking a human?")
    102 
    103     # 添加一个线程
    104     def threadTask(self):
    105         global t
    106         t = threading.Timer(6.0, self.showMessage)  # 6秒后执行显示消息
    107         t.start()
    108 
    109     def QQmsg(self):
    110         import time
    111         status = self.Ui.checkBoxQQmsg.isChecked()
    112         comboxicoIndex = self.Ui.comboBoxIcon.currentIndex()
    113         icon = self.Ui.comboBoxIcon.itemIcon(comboxicoIndex)
    114         arrs = 1
    115         whiles = 1
    116         if status:
    117             while whiles <= 6:
    118                 if arrs == 1:
    119                     time.sleep(0.6)
    120                     self.trayIcon.setIcon(QtGui.QIcon())
    121                     arrs = 2
    122                 else:
    123                     time.sleep(0.6)
    124                     self.trayIcon.setIcon(icon)
    125                     arrs = 1
    126                 whiles += 1
    127 
    128         else:
    129             self.trayIcon.setIcon(icon)
    130 
    131 
    132     def keyPressEvent(self, event):
    133         if event.key() ==QtCore.Qt.Key_Escape:
    134             self.hide()
    135 
    136 if __name__ == '__main__':
    137     import sys
    138     app = QtGui.QApplication(sys.argv)
    139     QtGui.QApplication.setQuitOnLastWindowClosed(False)
    140     trany = mainTray()
    141     trany.show()
    142     sys.exit(app.exec_())

    三.效果

    四.打包出现问题

    使用pyinstaller 打包exe,运行不了,即使打包Pyqt4里面的demo 也运行不了,目前未找到原因!

  • 相关阅读:
    R语言编程艺术(2)R中的数据结构
    R语言编程艺术(1)快速入门
    R语言实战(十)处理缺失数据的高级方法
    R语言实战(九)主成分和因子分析
    R语言实战(八)广义线性模型
    R语言实战(七)图形进阶
    R语言实战(六)重抽样与自助法
    R语言实战(五)方差分析与功效分析
    R语言实战(四)回归
    R语言实战(三)基本图形与基本统计分析
  • 原文地址:https://www.cnblogs.com/dcb3688/p/4313267.html
Copyright © 2011-2022 走看看