鱼C论坛

 找回密码
 立即注册
查看: 5738|回复: 10

[技术交流] 温故而知新---PyQt5学习笔记系列---拖!托!脱!

[复制链接]
发表于 2015-5-19 21:07:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wei_Y 于 2015-5-19 21:11 编辑


0.jpg
0.  我是一个标题党,咿呀咿呀呦~~~。
啥?你说图片画质太渣。。

呃,那就进入正题吧!(什么鬼,不回答问题!)

1. 托盘。
很多时候呢,我们只是让程序最小化了,但是任务栏处有图标总是不自在。。那要怎么把它弄到托盘栏呢。
Qt已经把这个问题解决了。
Qt自带的例子就有这个。
目录是PyQt5/examples/desktop/systray/
desktop里还一个截图,顺便看一下也可~~~。

2. 托盘类 QSystemTrayIcon。

文档: 点我

属性与方法介绍。

属性:
contextMenu                  右键点击时的菜单。
icon                                 图标。
tooltip                             鼠标放上去时的提示语。
geometry                        这个应该不用多介绍,位置。

方法:
isVisibel                           是否可见。True or False。
setContextMenu             设置右键点击时的菜单。
setIcon                             设置图标。
setToolTip                       设置鼠标放上去时的提示语。
setVisibel                         设置是否可见。 True or False。(貌似默认是不可见。需要show才会找到他。)
show                                显示。
hide                                 隐藏。
showMessage                 呃,不知道咋描述,反正就是隐藏时的框框。(title, content)


信号:

activated                            点击时(激活时)的发出的信号,左键右键都会触发。
messageClicked                消息框点击时发出的信号。


2. 核心: 菜单。
托盘一般的功能就是来一个强大的菜单。
菜单不是托盘独有,在MainWindow, listWidget等里面也都会看到菜单的身影。

那如何创建一个菜单并给他们加一些功能呢。

菜单在Qt中叫QMenu,呃,就是加了个Q。。

  1. self.act_menu = QMenu(self)
复制代码


这货最常用的方法应该就是。
addAction了,说到addAction,还要介绍一发这货的好基友——QAction。

3. 核心的核心: 动作。
菜单作为承载容器,将一些动作添加到上面。

  1. self.act_show = QAction(self)
复制代码


可以给动作添加一个快捷键。

  1. self.act_show.setShortcut('ctrl+w')
复制代码


当然功能连接是
  1. self.act_show.triggered.connect(self.show)
复制代码


最后将这些动作添加到菜单就可以了。
  1. self.act_menu.addAction(self.act_show)
复制代码



Q: 信号为毛这么少,我想让他双击做一些事情,除了重写这个类加个双击信号还有其他办法么?
A: 有,这个之后再说。


Q: 能添加样式么?
A: 能,这个需要耐心 and 翻文档。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +4 收起 理由
拈花小仙 + 5 + 5 + 4 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

  • · PyQt|主题: 45, 订阅: 73
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-5-20 12:27:04 | 显示全部楼层
本帖最后由 lightninng 于 2015-5-20 12:36 编辑

给个小例子啊亲。。我还想看看什么效果呢~~好吧,原来要自己去看qt5文档~~我去找~~
帮楼主贴一下qt5文档中的代码,和它的运行效果
代码如下:
  1. from PyQt5.QtGui import QIcon
  2. from PyQt5.QtWidgets import (QAction, QApplication, QCheckBox, QComboBox,
  3.         QDialog, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLineEdit,
  4.         QMessageBox, QMenu, QPushButton, QSpinBox, QStyle, QSystemTrayIcon,
  5.         QTextEdit, QVBoxLayout)

  6. import systray_rc


  7. class Window(QDialog):
  8.     def __init__(self):
  9.         super(Window, self).__init__()

  10.         self.createIconGroupBox()
  11.         self.createMessageGroupBox()

  12.         self.iconLabel.setMinimumWidth(self.durationLabel.sizeHint().width())

  13.         self.createActions()
  14.         self.createTrayIcon()

  15.         self.showMessageButton.clicked.connect(self.showMessage)
  16.         self.showIconCheckBox.toggled.connect(self.trayIcon.setVisible)
  17.         self.iconComboBox.currentIndexChanged.connect(self.setIcon)
  18.         self.trayIcon.messageClicked.connect(self.messageClicked)
  19.         self.trayIcon.activated.connect(self.iconActivated)

  20.         mainLayout = QVBoxLayout()
  21.         mainLayout.addWidget(self.iconGroupBox)
  22.         mainLayout.addWidget(self.messageGroupBox)
  23.         self.setLayout(mainLayout)

  24.         self.iconComboBox.setCurrentIndex(1)
  25.         self.trayIcon.show()

  26.         self.setWindowTitle("Systray")
  27.         self.resize(400, 300)

  28.     def setVisible(self, visible):
  29.         self.minimizeAction.setEnabled(visible)
  30.         self.maximizeAction.setEnabled(not self.isMaximized())
  31.         self.restoreAction.setEnabled(self.isMaximized() or not visible)
  32.         super(Window, self).setVisible(visible)

  33.     def closeEvent(self, event):
  34.         if self.trayIcon.isVisible():
  35.             QMessageBox.information(self, "Systray",
  36.                     "The program will keep running in the system tray. To "
  37.                     "terminate the program, choose <b>Quit</b> in the "
  38.                     "context menu of the system tray entry.")
  39.             self.hide()
  40.             event.ignore()

  41.     def setIcon(self, index):
  42.         icon = self.iconComboBox.itemIcon(index)
  43.         self.trayIcon.setIcon(icon)
  44.         self.setWindowIcon(icon)

  45.         self.trayIcon.setToolTip(self.iconComboBox.itemText(index))

  46.     def iconActivated(self, reason):
  47.         if reason in (QSystemTrayIcon.Trigger, QSystemTrayIcon.DoubleClick):
  48.             self.iconComboBox.setCurrentIndex(
  49.                     (self.iconComboBox.currentIndex() + 1)
  50.                     % self.iconComboBox.count())
  51.         elif reason == QSystemTrayIcon.MiddleClick:
  52.             self.showMessage()

  53.     def showMessage(self):
  54.         icon = QSystemTrayIcon.MessageIcon(
  55.                 self.typeComboBox.itemData(self.typeComboBox.currentIndex()))
  56.         self.trayIcon.showMessage(self.titleEdit.text(),
  57.                 self.bodyEdit.toPlainText(), icon,
  58.                 self.durationSpinBox.value() * 1000)

  59.     def messageClicked(self):
  60.         QMessageBox.information(None, "Systray",
  61.                 "Sorry, I already gave what help I could.\nMaybe you should "
  62.                 "try asking a human?")

  63.     def createIconGroupBox(self):
  64.         self.iconGroupBox = QGroupBox("Tray Icon")

  65.         self.iconLabel = QLabel("Icon:")

  66.         self.iconComboBox = QComboBox()
  67.         self.iconComboBox.addItem(QIcon(':/images/bad.png'), "Bad")
  68.         self.iconComboBox.addItem(QIcon(':/images/heart.png'), "Heart")
  69.         self.iconComboBox.addItem(QIcon(':/images/trash.png'), "Trash")

  70.         self.showIconCheckBox = QCheckBox("Show icon")
  71.         self.showIconCheckBox.setChecked(True)

  72.         iconLayout = QHBoxLayout()
  73.         iconLayout.addWidget(self.iconLabel)
  74.         iconLayout.addWidget(self.iconComboBox)
  75.         iconLayout.addStretch()
  76.         iconLayout.addWidget(self.showIconCheckBox)
  77.         self.iconGroupBox.setLayout(iconLayout)

  78.     def createMessageGroupBox(self):
  79.         self.messageGroupBox = QGroupBox("Balloon Message")

  80.         typeLabel = QLabel("Type:")

  81.         self.typeComboBox = QComboBox()
  82.         self.typeComboBox.addItem("None", QSystemTrayIcon.NoIcon)
  83.         self.typeComboBox.addItem(self.style().standardIcon(
  84.                 QStyle.SP_MessageBoxInformation), "Information",
  85.                 QSystemTrayIcon.Information)
  86.         self.typeComboBox.addItem(self.style().standardIcon(
  87.                 QStyle.SP_MessageBoxWarning), "Warning",
  88.                 QSystemTrayIcon.Warning)
  89.         self.typeComboBox.addItem(self.style().standardIcon(
  90.                 QStyle.SP_MessageBoxCritical), "Critical",
  91.                 QSystemTrayIcon.Critical)
  92.         self.typeComboBox.setCurrentIndex(1)

  93.         self.durationLabel = QLabel("Duration:")

  94.         self.durationSpinBox = QSpinBox()
  95.         self.durationSpinBox.setRange(5, 60)
  96.         self.durationSpinBox.setSuffix(" s")
  97.         self.durationSpinBox.setValue(15)

  98.         durationWarningLabel = QLabel("(some systems might ignore this hint)")
  99.         durationWarningLabel.setIndent(10)

  100.         titleLabel = QLabel("Title:")

  101.         self.titleEdit = QLineEdit("Cannot connect to network")

  102.         bodyLabel = QLabel("Body:")

  103.         self.bodyEdit = QTextEdit()
  104.         self.bodyEdit.setPlainText("Don't believe me. Honestly, I don't have "
  105.                 "a clue.\nClick this balloon for details.")

  106.         self.showMessageButton = QPushButton("Show Message")
  107.         self.showMessageButton.setDefault(True)

  108.         messageLayout = QGridLayout()
  109.         messageLayout.addWidget(typeLabel, 0, 0)
  110.         messageLayout.addWidget(self.typeComboBox, 0, 1, 1, 2)
  111.         messageLayout.addWidget(self.durationLabel, 1, 0)
  112.         messageLayout.addWidget(self.durationSpinBox, 1, 1)
  113.         messageLayout.addWidget(durationWarningLabel, 1, 2, 1, 3)
  114.         messageLayout.addWidget(titleLabel, 2, 0)
  115.         messageLayout.addWidget(self.titleEdit, 2, 1, 1, 4)
  116.         messageLayout.addWidget(bodyLabel, 3, 0)
  117.         messageLayout.addWidget(self.bodyEdit, 3, 1, 2, 4)
  118.         messageLayout.addWidget(self.showMessageButton, 5, 4)
  119.         messageLayout.setColumnStretch(3, 1)
  120.         messageLayout.setRowStretch(4, 1)
  121.         self.messageGroupBox.setLayout(messageLayout)

  122.     def createActions(self):
  123.         self.minimizeAction = QAction("Mi&nimize", self, triggered=self.hide)
  124.         self.maximizeAction = QAction("Ma&ximize", self,
  125.                 triggered=self.showMaximized)
  126.         self.restoreAction = QAction("&Restore", self,
  127.                 triggered=self.showNormal)
  128.         self.quitAction = QAction("&Quit", self,
  129.                 triggered=QApplication.instance().quit)

  130.     def createTrayIcon(self):
  131.          self.trayIconMenu = QMenu(self)
  132.          self.trayIconMenu.addAction(self.minimizeAction)
  133.          self.trayIconMenu.addAction(self.maximizeAction)
  134.          self.trayIconMenu.addAction(self.restoreAction)
  135.          self.trayIconMenu.addSeparator()
  136.          self.trayIconMenu.addAction(self.quitAction)

  137.          self.trayIcon = QSystemTrayIcon(self)
  138.          self.trayIcon.setContextMenu(self.trayIconMenu)


  139. if __name__ == '__main__':

  140.     import sys

  141.     app = QApplication(sys.argv)

  142.     if not QSystemTrayIcon.isSystemTrayAvailable():
  143.         QMessageBox.critical(None, "Systray",
  144.                 "I couldn't detect any system tray on this system.")
  145.         sys.exit(1)

  146.     QApplication.setQuitOnLastWindowClosed(False)

  147.     window = Window()
  148.     window.show()
  149.     sys.exit(app.exec_())
复制代码
运行效果:
1.jpg



小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-20 13:16:41 | 显示全部楼层
lightninng 发表于 2015-5-20 12:27
给个小例子啊亲。。我还想看看什么效果呢~~好吧,原来要自己去看qt5文档~~我去找~~
帮 ...

我看到了360wifi。 360截图20150520131736784.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-20 17:18:03 | 显示全部楼层
我擦, 好复杂的样子,继续努力!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-24 23:16:35 | 显示全部楼层
有django的吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-25 12:06:03 | 显示全部楼层

不会。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-25 14:22:56 | 显示全部楼层
学习学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-10 15:49:25 | 显示全部楼层
游戏不错  可是我是来混鱼币的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-20 15:35:54 | 显示全部楼层
涨姿势了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-24 10:38:10 | 显示全部楼层
楼主威武,确实不错~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-5 15:38:40 | 显示全部楼层
PyQt有没有QQ群啊,刚接触,想像你们学习啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-22 08:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表