当前位置:   article > 正文

Python PyQt5 教程

python addspacing addstretch

PyQt5教程 :http://code.py40.com/face

教程翻译自http://zetcode.com/gui/pyqt5/

PyQt5 的 核心API 以及 扩展应用(CSDN 学院收费视频):https://edu.csdn.net/course/play/9870/222942

pyqt5 - 对文本样式进行操作:https://www.cnblogs.com/XJT2018/p/9835262.html
setStyleSheet 用法:https://www.cnblogs.com/aheng123/p/5630761.html
Pyqt5 —— setStyleSheet 用法:https://blog.csdn.net/weixin_42066185/article/details/82225197

颜色代码查询,RGB 查询:http://tool.chinaz.com/tools/selectcolor.aspx
RGB颜色值转换成十六进制颜色码:https://www.sioe.cn/yingyong/yanse-rgb-16/

【第一节】PyQt5简介:http://code.py40.com/1948.html
【第二节】PyQt5基本功能:http://code.py40.com/1961.html
【第三节】PyQt5布局管理:http://code.py40.com/1995.html
【第四节】PyQt5菜单和工具栏:http://code.py40.com/1984.html
【第五节】PyQt5事件和信号:http://code.py40.com/2004.html

【第六节】PyQt5 对话框:http://code.py40.com/2009.html

【第七节】PyQt5控件:http://code.py40.com/2018.html
【第八节】PyQt5控件(II):http://code.py40.com/2026.html
【第九节】PyQt 拖拽:http://code.py40.com/2035.html
【第十节】PyQt5绘图:http://code.py40.com/2042.html
【第十一节】PyQt5自定义控件:http://code.py40.com/2049.html
【第十二节】PyQt5俄罗斯方块:http://code.py40.com/2052.html

PyQt5 说明

pyqt5是一套Python绑定Digia QT5应用的框架。它可用于Python 2和3。本教程使用Python 3。Qt库是最强大的GUI库之一。pyqt5的官方网站http://www.riverbankcomputing.co.uk/news

pyqt5 做为 Python 的一个模块,它有 620 多个类和 6000 个函数和方法。这是一个跨平台的工具包,它可以运行在所有主要的操作系统,包括 UNIX,Windows,Mac OS。pyqt5 是双重许可。开发者可以在 GPL 和 商业许可 之间进行选择。

pyqt5 的类别分为几个模块,包括以下:

  • QtCore
  • QtGui
  • QtWidgets
  • QtMultimedia
  • QtBluetooth
  • QtNetwork
  • QtPositioning
  • Enginio
  • QtWebSockets
  • QtWebKit
  • QtWebKitWidgets
  • QtXml
  • QtSvg
  • QtSql
  • QtTest

说明:

QtCore 包含了核心的非 GUI 功能。
此模块用于处理时间、文件和目录、各种数据类型、流、URL、MIME类型、线程或进程。
QtGui 包含类窗口系统集成、事件处理、二维图形、基本成像、字体和文本。
QtWidgets 模块包含创造经典桌面风格的用户界面提供了一套UI元素的类。
QtMultimedia 包含的类来处理多媒体内容和 API 来访问相机和收音机的功能。
QtBluetooth 模块包含类的扫描设备和连接并与他们互动。描述模块包含了网络编程的类。
这些类便于 TCP 和 IP 和 UDP 客户端和服务器的编码,使网络编程更容易和更便携。
QtNetwork 网络模块
QtPositioning 包含类的利用各种可能的来源,确定位置,包括卫星、Wi-Fi、或一个文本文件。
Enginio 模块实现了客户端库访问 Qt 云服务托管的应用程序运行时。
QtWebSockets 模块包含实现 WebSocket 协议类。
QtWebKit 包含一个基于 Webkit2 图书馆 Web 浏览器 实现类。
QtWebKitWidgets 包含的类的基础 webkit1 ,用于 qtwidgets 应用 Web 浏览器的实现。
QtXml 包含与 XML 文件的类。这个模块为 SAX 和 DOM API 提供了实现。
QtSvg 模块提供了显示 SVG 文件内容的类。可伸缩矢量图形(SVG)是一种描述二维图形和图形应用的语言。
QtSql 模块提供操作数据库的类。
QtTest 包含的功能,使 pyqt5 应用程序的单元测试

pyqt5 不向后兼容 pyqt4。pyqt5 有几个显著的变化。将旧代码调整到新库并不困难。有几个大的改变如下:

  • Python模块已经重组。一些模块已经删除(qtscript),有的被分割成子模块(QtGui,QtWebKit)。
  • 新的模块作了详细的介绍,包括qtbluetooth,qtpositioning,或enginio。
  • pyqt5只支持新型的信号和槽handlig。电话signal()或slot()不再支持。
  • pyqt5不支持Qt的API被标记为过时或陈旧的任何部分在QT V5.0。

【第 1 节】 到 【第 4 节】演示代码

( 可以 把 __init__ 函数中的 注释逐个取消,然后运行程序看执行效果 ):

  1. # -*- coding: utf-8 -*-
  2. # @Author :
  3. # @File : main.py
  4. # @Software: PyCharm
  5. # @description : XXX
  6. import sys
  7. # QMainWindow 类提供了一个主要的应用程序窗口。
  8. # 你用它可以让应用程序添加状态栏,工具栏和菜单栏。
  9. from PyQt5.QtWidgets import QWidget, QMainWindow
  10. from PyQt5.QtWidgets import QApplication
  11. from PyQt5.QtWidgets import QDesktopWidget, QMessageBox, QLabel, QPushButton, QAction
  12. from PyQt5.QtWidgets import QAction, qApp
  13. from PyQt5.QtWidgets import QLineEdit, QTextEdit
  14. from PyQt5.QtWidgets import QHBoxLayout # horizontal 水平布局
  15. from PyQt5.QtWidgets import QVBoxLayout # vertical 垂直布局
  16. from PyQt5.QtWidgets import QGridLayout # Grid 网格布局
  17. from PyQt5.QtGui import QIcon
  18. # 如果不想一个一个 导入,可以 import *
  19. # from PyQt5.QtWidgets import *
  20. class MyForm1(QWidget):
  21. def __init__(self):
  22. super(MyForm1, self).__init__()
  23. # self._init_ui_1()
  24. # self._init_ui_2()
  25. # self._init_ui_3()
  26. # self._init_ui_4()
  27. self._init_ui_5()
  28. pass
  29. def center(self):
  30. """
  31. 控制窗口显示在屏幕中心的方法
  32. :return:
  33. """
  34. # 获得窗口
  35. qr = self.frameGeometry()
  36. # 获得屏幕中心点
  37. cp = QDesktopWidget().availableGeometry().center()
  38. # 显示到屏幕中心
  39. qr.moveCenter(cp)
  40. self.move(qr.topLeft())
  41. def _init_ui_1(self):
  42. """
  43. 重置大小,中心显示
  44. :return:
  45. """
  46. self.resize(1000, 600)
  47. self.center()
  48. self.show()
  49. def _init_ui_2(self):
  50. """
  51. 使用 绝对位置 布局元素位置
  52. :return:
  53. """
  54. lbl1 = QLabel('Zetcode', self)
  55. lbl1.move(15, 10)
  56. lbl2 = QLabel('tutorials', self)
  57. lbl2.move(35, 40)
  58. lbl3 = QLabel('for programmers', self)
  59. lbl3.move(55, 70)
  60. self.setGeometry(300, 300, 250, 150)
  61. self.setWindowTitle('Absolute')
  62. self.show()
  63. def _init_ui_3(self):
  64. """
  65. 使用布局 来 布局 元素位置
  66. :return:
  67. """
  68. btn_ok = QPushButton("OK")
  69. btn_cancel = QPushButton("Cancel")
  70. hbox = QHBoxLayout()
  71. hbox.addStretch(1)
  72. hbox.addWidget(btn_ok)
  73. hbox.addWidget(btn_cancel)
  74. vbox = QVBoxLayout()
  75. vbox.addStretch(1)
  76. vbox.addLayout(hbox)
  77. self.setLayout(vbox)
  78. self.setGeometry(300, 300, 300, 150)
  79. self.setWindowTitle('Buttons')
  80. self.show()
  81. def _init_ui_4(self):
  82. """
  83. 使用 网格布局 来 布局 元素位置
  84. :return:
  85. """
  86. grid = QGridLayout()
  87. self.setLayout(grid)
  88. names = [
  89. 'Cls', 'Bck', '', 'Close',
  90. '7', '8', '9', '/',
  91. '4', '5', '6', '*',
  92. '1', '2', '3', '-',
  93. '0', '.', '=', '+'
  94. ]
  95. positions = [(i, j) for i in range(5) for j in range(4)]
  96. for position, name in zip(positions, names):
  97. if name == '':
  98. continue
  99. button = QPushButton(name)
  100. grid.addWidget(button, *position)
  101. self.move(300, 150)
  102. self.setWindowTitle('Calculator')
  103. self.show()
  104. def _init_ui_5(self):
  105. """
  106. 网格布局 跨越 多行 或者 多列
  107. :return:
  108. """
  109. title = QLabel('Title')
  110. author = QLabel('Author')
  111. review = QLabel('Review')
  112. titleEdit = QLineEdit()
  113. authorEdit = QLineEdit()
  114. reviewEdit = QTextEdit()
  115. grid = QGridLayout()
  116. grid.setSpacing(10)
  117. grid.addWidget(title, 1, 0)
  118. grid.addWidget(titleEdit, 1, 1)
  119. grid.addWidget(author, 2, 0)
  120. grid.addWidget(authorEdit, 2, 1)
  121. grid.addWidget(review, 3, 0)
  122. grid.addWidget(reviewEdit, 3, 1, 5, 1)
  123. self.setLayout(grid)
  124. self.setGeometry(300, 300, 350, 300)
  125. self.setWindowTitle('Review')
  126. self.show()
  127. def closeEvent(self, event):
  128. """
  129. 重写关闭窗口事件
  130. :param event:
  131. :return:
  132. """
  133. reply = QMessageBox.question(
  134. self, 'Message', 'Are you sure close window ?',
  135. QMessageBox.Yes | QMessageBox.No, QMessageBox.No
  136. )
  137. if reply == QMessageBox.Yes:
  138. event.accept()
  139. else:
  140. event.ignore()
  141. pass
  142. class MyForm2(QMainWindow):
  143. """
  144. QMainWindow 类提供了一个主要的应用程序窗口。
  145. 你用它可以让应用程序添加状态栏,工具栏和菜单栏。
  146. """
  147. def __init__(self):
  148. super(MyForm2, self).__init__()
  149. # self._init_ui_6()
  150. # self._init_ui_7()
  151. # self._init_ui_8()
  152. self._init_ui_9()
  153. def _init_ui_6(self):
  154. """
  155. 状态栏
  156. :return:
  157. """
  158. self.statusBar().showMessage('Ready')
  159. self.setGeometry(800, 300, 250, 150)
  160. self.setWindowTitle('Statusbar')
  161. self.show()
  162. def _init_ui_7(self):
  163. """
  164. 菜单栏
  165. :return:
  166. """
  167. # QAction可以操作菜单栏,工具栏,或自定义键盘快捷键。
  168. # 创建一个事件和一个特定的图标和一个“退出”的标签。
  169. exitAction = QAction(QIcon('exit.png'), '&Exit', self)
  170. exitAction.setShortcut('Ctrl+Q') # 定义该操作的快捷键。
  171. # 创建一个鼠标指针悬停在该菜单项上时的提示。
  172. exitAction.setStatusTip('Exit application')
  173. # # 第三行创建一个鼠标指针悬停在该菜单项上时的提示。
  174. exitAction.triggered.connect(qApp.quit)
  175. self.statusBar()
  176. # 创建一个菜单栏
  177. menubar = self.menuBar()
  178. # 添加菜单
  179. fileMenu = menubar.addMenu('&File')
  180. # 添加事件
  181. fileMenu.addAction(exitAction)
  182. self.setGeometry(800, 300, 300, 200)
  183. self.setWindowTitle('Menubar')
  184. self.show()
  185. def _init_ui_8(self):
  186. """
  187. 工具栏
  188. :return:
  189. """
  190. exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
  191. exitAction.setShortcut('Ctrl+Q')
  192. exitAction.triggered.connect(qApp.quit)
  193. self.toolbar = self.addToolBar('Exit')
  194. self.toolbar.addAction(exitAction)
  195. self.setGeometry(800, 300, 300, 200)
  196. self.setWindowTitle('Toolbar')
  197. self.show()
  198. def _init_ui_9(self):
  199. # 创建一个菜单条,工具栏和状态栏的小窗口
  200. textEdit = QTextEdit()
  201. self.setCentralWidget(textEdit)
  202. exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
  203. exitAction.setShortcut('Ctrl+Q')
  204. exitAction.setStatusTip('Exit application')
  205. exitAction.triggered.connect(self.close)
  206. self.statusBar()
  207. menubar = self.menuBar()
  208. fileMenu = menubar.addMenu('&File')
  209. fileMenu.addAction(exitAction)
  210. toolbar = self.addToolBar('Exit')
  211. toolbar.addAction(exitAction)
  212. self.setGeometry(800, 300, 350, 250)
  213. self.setWindowTitle('Main window')
  214. self.show()
  215. if __name__ == '__main__':
  216. app = QApplication(sys.argv)
  217. form_1 = MyForm1()
  218. form_2 = MyForm2()
  219. sys.exit(app.exec_())
  220. pass

点击产生一个新窗口:

  1. import sys
  2. from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton
  3. class Form1(QWidget):
  4. def __init__(self):
  5. super(Form1, self).__init__()
  6. self.setWindowTitle('From_1')
  7. self.resize(600, 300)
  8. self._init_ui()
  9. self.show()
  10. def close_window(self):
  11. """
  12. 点击按钮 将 窗体1 关掉
  13. :return:
  14. """
  15. self.close()
  16. def _init_ui(self):
  17. v_box = QVBoxLayout()
  18. self.btn_1 = QPushButton('btn_1: close Form_2')
  19. self.btn_2 = QPushButton('btn_2: show Form_2')
  20. v_box.addWidget(self.btn_1)
  21. v_box.addWidget(self.btn_2)
  22. self.setLayout(v_box)
  23. class Form2(QWidget):
  24. def __init__(self):
  25. super(Form2, self).__init__()
  26. self.setWindowTitle('From_2')
  27. self.resize(800, 400)
  28. self._init_ui()
  29. def display(self):
  30. """
  31. 显示窗体
  32. :return:
  33. """
  34. self.show()
  35. def _init_ui(self):
  36. h_box = QHBoxLayout()
  37. btn_3 = QPushButton('btn_3')
  38. btn_4 = QPushButton('btn_4')
  39. h_box.addWidget(btn_3)
  40. h_box.addWidget(btn_4)
  41. self.setLayout(h_box)
  42. if __name__ == '__main__':
  43. app = QApplication(sys.argv)
  44. w1 = Form1()
  45. w2 = Form2()
  46. w1.show()
  47. w1.btn_1.clicked.connect(w1.close_window)
  48. w1.btn_2.clicked.connect(w2.display)
  49. app.exec_()

布局示例:

PyQt入门(五)— 布局:https://blog.csdn.net/qq_34710142/article/details/80875625

  1. from PyQt5 import QtWidgets
  2. class MyWindow(QtWidgets.QWidget):
  3. def __init__(self):
  4. super().__init__()
  5. self.setWindowTitle('嵌套布局示例')
  6. # 开始:
  7. wlayout = QtWidgets.QHBoxLayout() # 全局布局(1个):水平
  8. hlayout = QtWidgets.QHBoxLayout() # 局部布局(4个):水平、竖直、网格、表单
  9. vlayout = QtWidgets.QVBoxLayout()
  10. glayout = QtWidgets.QGridLayout()
  11. flayout = QtWidgets.QFormLayout()
  12. hlayout.addWidget(QtWidgets.QPushButton(str(1))) # 局部布局添加部件(例如:按钮)
  13. hlayout.addWidget(QtWidgets.QPushButton(str(2)))
  14. vlayout.addWidget(QtWidgets.QPushButton(str(3)))
  15. vlayout.addWidget(QtWidgets.QPushButton(str(4)))
  16. glayout.addWidget(QtWidgets.QPushButton(str(5)), 0, 0)
  17. glayout.addWidget(QtWidgets.QPushButton(str(6)), 0, 1)
  18. glayout.addWidget(QtWidgets.QPushButton(str(7)), 1, 0)
  19. glayout.addWidget(QtWidgets.QPushButton(str(8)), 1, 1)
  20. flayout.addWidget(QtWidgets.QPushButton(str(9)))
  21. flayout.addWidget(QtWidgets.QPushButton(str(10)))
  22. flayout.addWidget(QtWidgets.QPushButton(str(11)))
  23. flayout.addWidget(QtWidgets.QPushButton(str(12)))
  24. hwg = QtWidgets.QWidget() # 准备四个部件
  25. vwg = QtWidgets.QWidget()
  26. gwg = QtWidgets.QWidget()
  27. fwg = QtWidgets.QWidget()
  28. hwg.setLayout(hlayout) # 四个部件设置局部布局
  29. vwg.setLayout(vlayout)
  30. gwg.setLayout(glayout)
  31. fwg.setLayout(flayout)
  32. wlayout.addWidget(hwg) # 四个部件加至全局布局
  33. wlayout.addWidget(vwg)
  34. wlayout.addWidget(gwg)
  35. wlayout.addWidget(fwg)
  36. self.setLayout(wlayout) # 窗体本尊设置全局布局
  37. if __name__ == "__main__":
  38. import sys
  39. app = QtWidgets.QApplication(sys.argv)
  40. win = MyWindow()
  41. win.show()
  42. sys.exit(app.exec_())

效果:

嵌套布局示例

布局 时 需要注意点

继承 QMainWindow 时布局界面 继承 QWidget 时 布局界面 是不一样的

1. 继承 QMainWindow 时 的界面布局

如何给QMainWindow正确地设置布局( C++ 示例 步骤)

  1. 第一步:创建一个QWidget实例,并将这个实例设置为 centralWidget:
        QWidget *widget = new QWidget();
        this->setCentralWidget(widget);
  2. 第二部:创建一个主布局mainLayout,并把所需要的所有控件都往里面放(工具栏、菜单栏、状态栏除外):
        QHBoxLayout *mainLayout = new QHBoxLayout;
        mainLayout->addWidget(...);
        mainLayout->addLayout(...);
        ...
  3. 第三步:将 widget 的布局设置为 mainLayout:
        centralWidget()->setLayout(mainLayout);
        //centralWidget()返回的是第一步创建的那个QWidget实例

继承 QMainWindow 时,需要设置 中心部件(即 主界面),如下面代码需要添加三行代码:

  1. main_widget = QWidget() # 界面 实例
  2. self.setCentralWidget(main_widget) # 设置 为 中心界面
  3. ......
  4. ......
  5. self.centralWidget().setLayout(v_box) # 设置中心界面的布局

根据 C++ 示例 步骤改成 python ,完整示例代码如下:

  1. import sys
  2. # QMainWindow 类提供了一个主要的应用程序窗口。
  3. # 你用它可以让应用程序添加状态栏,工具栏和菜单栏。
  4. from PyQt5.QtWidgets import QWidget, QMainWindow
  5. from PyQt5.QtWidgets import (
  6. QApplication, QDesktopWidget, QHBoxLayout, QVBoxLayout,
  7. QPushButton, QListView,
  8. )
  9. class LayoutDemoByQMainWindow(QMainWindow):
  10. def __init__(self):
  11. super(LayoutDemoByQMainWindow, self).__init__()
  12. self.resize(1000, 600) # 重置大小
  13. self._center_display() # 中心显示
  14. self.vertical_layout()
  15. self.show()
  16. def _center_display(self):
  17. """
  18. 控制窗口显示在屏幕中心的方法
  19. :return:
  20. """
  21. # 获得窗口
  22. qr = self.frameGeometry()
  23. # 获得屏幕中心点
  24. cp = QDesktopWidget().availableGeometry().center()
  25. # 显示到屏幕中心
  26. qr.moveCenter(cp)
  27. self.move(qr.topLeft())
  28. def vertical_layout(self):
  29. """
  30. 垂直布局
  31. :return:
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/663098
推荐阅读
相关标签
  

闽ICP备14008679号