• GUI设计——PyQt5快速入门


    一、学习目标

    1. 了解有关GUI界面设计的基本语法
    2. 能够编写简单的界面设计程序

    二、PyQt5 安装与环境配置

    首先,本人通过网上的教程,在Index of / (qt.io)官网上下载好了 Qt Designer Qt Creator 。本人下载的版本为 5.14。随后,通过网络的资源,我了解到了一些Qt的基本知识。

    我了解的第一部分,是 Qt 的一些工具。

    • Qmake:核心的项目构建工具,可以生成跨平台的 .pro 项目文件,并能依据不同操作系统和编译工具生成相应的Makefile,用于构建可执行程序或链接库。
    • Qtcreator:集成开发环境,包含项目生成管理、代码编辑、图形界面可视化编辑、 编译生成、程序调试、上下文帮助、版本控制系统集成等众多功能, 还支持手机和嵌入式设备的程序生成部署。
    • Designer:Qt 设计师,专门用于可视化编辑图形用户界面(所见即所得),生成.ui文件用于Qt项目。

    三、Qt Creator 初体验

    本人打开 Qt Creator 的一个实例程序——音乐播放器,体验了一下 Qt 设计的成品,感觉挺有意思的。

    大家可以打开软件亲自动手尝试一下,其中,每一个示例程序对应的都有C语言编写的源代码,可以对照着看代码进行学习。 

    四、PyQt5的相关命令和举例

    1. import sys
    2. from PyQt5.QtWidgets import QApplication, QWidget
    3. if __name__ == '__main__':
    4. app = QApplication(sys.argv)
    5. w = QWidget()
    6. # 设置窗口标题
    7. w.setWindowTitle("第一个PyQt")
    8. # 展示窗口
    9. w.show()
    10. # 程序进行循环等待状态
    11. app.exec()

    通过编写第一个代码,如何运行这个代码,就能得到了一个窗口程序。

    PyQt常用的功能模块如下:

    • QtCore:包含了核心的非GUI的功能。主要和时间、文件与文件夹、各种数据、流、URLs、mime类文件、进程与线程一起使用
    • QtGui:包含了窗口系统、事件处理、2D图像、基本绘画、字体和文字类
    • QtWidgets:包含了一些列创建桌面应用的UI元素

    4.1 按钮

    在窗口里面添加控件

    1. btn = QPushButton("按钮") # 设置按钮的父亲是当前窗口,等于是添加到窗口中显示
    2. btn.setParent(w)

    【示例代码】

    1. import sys
    2. from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
    3. if __name__ == '__main__':
    4. app = QApplication(sys.argv)
    5. w = QWidget()
    6. # 设置窗口标题
    7. w.setWindowTitle("第一个PyQt程序")
    8. # 在窗口里面添加控件
    9. btn = QPushButton("按钮")
    10. # 设置按钮的父亲是当前窗口,等于是添加到窗口中显示
    11. btn.setParent(w)
    12. # 展示窗口
    13. w.show()
    14. # 程序进行循环等待状态
    15. app.exec()

    4.2 文本

    创建一个Label(纯文本),在创建的时候指定了父对象

    1. label = QLabel("James: ", w)
    2. x, y , w, h label.setGeometry(20, 20, 30, 30)

    【示例代码】

    1. import sys
    2. from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel
    3. if __name__ == '__main__':
    4. app = QApplication(sys.argv)
    5. w = QWidget()
    6. # 设置窗口标题
    7. w.setWindowTitle("第一个PyQt")
    8. # # 下面创建一个Label,然后调用方法指定父类
    9. # label = QLabel("账号: ", w)
    10. # # 设置父对象
    11. # label.setParent(w)
    12. # 下面创建一个Label(纯文本),在创建的时候指定了父对象
    13. label = QLabel("账号: ", w)
    14. # 显示位置与大小 : x, y , w, h
    15. label.setGeometry(20, 20, 30, 30)
    16. # 展示窗口
    17. w.show()
    18. # 程序进行循环等待状态
    19. app.exec()

    4.3 文本框

    1. edit = QLineEdit(w) edit.setPlaceholderText("请输入账号") edit.setGeometry(55, 20, 200, 20)
    2. btn = QPushButton("注册", w) btn.setGeometry(50, 80, 70, 30)

    4.4 布局

    Qt 里面布局分为四个大类 :

    • QBoxLayout
    • QGridLayout
    • QFormLayout
    • QStackedLayout

    【示例代码】

    下面是根据网格布局进行设计的一个计算器格式。

    1. import sys
    2. from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLineEdit, QGridLayout
    3. class MyWindow(QWidget):
    4. def __init__(self):
    5. super().__init__()
    6. self.init_ui()
    7. def init_ui(self):
    8. self.setWindowTitle("计算器")
    9. # 准备数据
    10. data = {
    11. 0: ["7", "8", "9", "+", "("],
    12. 1: ["4", "5", "6", "-", ")"],
    13. 2: ["1", "2", "3", "*", "<-"],
    14. 3: ["0", ".", "=", "/", "C"]
    15. }
    16. # 整体垂直布局
    17. layout = QVBoxLayout()
    18. # 输入框
    19. edit = QLineEdit()
    20. edit.setPlaceholderText("请输入内容")
    21. # 把输入框添加到容器中
    22. layout.addWidget(edit)
    23. # 网格布局
    24. grid = QGridLayout()
    25. # 循环创建追加进去
    26. for line_number, line_data in data.items():
    27. # 此时line_number是第几行,line_data是当前行的数据
    28. for col_number, number in enumerate(line_data):
    29. # 此时col_number是第几列,number是要显示的符号
    30. btn = QPushButton(number)
    31. # grid.addWidget(btn)
    32. grid.addWidget(btn, line_number, col_number)
    33. # 把网格布局追加到容器中
    34. layout.addLayout(grid)
    35. self.setLayout(layout)
    36. if __name__ == '__main__':
    37. app = QApplication(sys.argv)
    38. w = MyWindow()
    39. w.show()
    40. app.exec()

    代码运行结果如下:

    4.5 窗口

    在Qt中,生成窗口有三种方式: QWidget、QMainWindow、QDialog

    • QWidget:控件和窗口的父类 ,自由度高(什么都东西都没有),没有划分菜单、工具栏、状态栏、主窗口 等区域
    • QMainWindow:是 QWidget的子类,包含菜单栏,工具栏,状态栏,标题栏等,中间部分则为主窗口区域
    • QDialog:对话框窗口的基类

     【示例代码】

    1. import sys
    2. from PyQt5.QtWidgets import QMainWindow, QLabel, QApplication
    3. class MyWindow(QMainWindow):
    4. def __init__(self):
    5. super().__init__()
    6. self.init_ui()
    7. def init_ui(self):
    8. label = QLabel("这是输出的文字内容噢")
    9. label.setStyleSheet("font-size:30px;color:red")
    10. # 调用父类中的menuBar,从而对菜单栏进行操作
    11. menu = self.menuBar()
    12. # 如果是Mac的话,菜单栏不会在Window中显示而是屏幕顶部系统菜单栏位置
    13. # 下面这一行代码使得Mac也按照Windows的那种方式在Window中显示Menu
    14. menu.setNativeMenuBar(False)
    15. file_menu = menu.addMenu("文件")
    16. file_menu.addAction("新建")
    17. file_menu.addAction("打开")
    18. file_menu.addAction("保存")
    19. edit_menu = menu.addMenu("编辑")
    20. edit_menu.addAction("复制")
    21. edit_menu.addAction("粘贴")
    22. edit_menu.addAction("剪切")
    23. # 设置中心内容显示
    24. self.setCentralWidget(label)
    25. if __name__ == '__main__':
    26. app = QApplication(sys.argv)
    27. w = MyWindow()
    28. # 设置窗口标题
    29. w.setWindowTitle("我是窗口标题....")
    30. # 展示窗口
    31. w.show()
    32. # 程序进行循环等待状态
    33. app.exec()

    4.6 信号与槽

    • 信号:事件(按钮点击 、内容发生改变 、窗口的关闭事件) 或者是 状态 (check选中了, togglebutton 切换。)当程序触发了某种状态或者发生了某种事件(比如:按钮被点击了, 内容改变等等),那么即可发射出来一个信号。
    • 槽:若想捕获这个信号,然后执行相应的逻辑代码,那么就需要使用到 槽 , 槽实际上是一个函数, 当信号发射出来后,会执行与之绑定的槽函数。

    【示例代码】

    1. import sys
    2. import time
    3. from PyQt5.QtWidgets import *
    4. from PyQt5.QtCore import *
    5. class MyWindow(QWidget):
    6. # 声明一个信号 只能放在函数的外面
    7. my_signal = pyqtSignal(str)
    8. def __init__(self):
    9. super().__init__()
    10. self.init_ui()
    11. self.msg_history = list() # 用来存放消息
    12. def init_ui(self):
    13. self.resize(500, 200)
    14. # 创建一个整体布局器
    15. container = QVBoxLayout()
    16. # 用来显示检测到漏洞的信息
    17. self.msg = QLabel("")
    18. self.msg.resize(440, 15)
    19. # print(self.msg.frameSize())
    20. self.msg.setWordWrap(True) # 自动换行
    21. self.msg.setAlignment(Qt.AlignTop) # 靠上
    22. # self.msg.setStyleSheet("background-color: yellow; color: black;")
    23. # 创建一个滚动对象
    24. scroll = QScrollArea()
    25. scroll.setWidget(self.msg)
    26. # 创建垂直布局器,用来添加自动滚动条
    27. v_layout = QVBoxLayout()
    28. v_layout.addWidget(scroll)
    29. # 创建水平布局器
    30. h_layout = QHBoxLayout()
    31. btn = QPushButton("开始检测", self)
    32. # 绑定按钮的点击,点击按钮则开始检测
    33. btn.clicked.connect(self.check)
    34. h_layout.addStretch(1) # 伸缩器
    35. h_layout.addWidget(btn)
    36. h_layout.addStretch(1)
    37. # 操作将要显示的控件以及子布局器添加到container
    38. container.addLayout(v_layout)
    39. container.addLayout(h_layout)
    40. # 设置布局器
    41. self.setLayout(container)
    42. # 绑定信号和槽
    43. self.my_signal.connect(self.my_slot)
    44. def my_slot(self, msg):
    45. # 更新内容
    46. print(msg)
    47. self.msg_history.append(msg)
    48. self.msg.setText("
      "
      .join(self.msg_history))
    49. self.msg.resize(440, self.msg.frameSize().height() + 15)
    50. self.msg.repaint() # 更新内容,如果不更新可能没有显示新内容
    51. def check(self):
    52. for i, ip in enumerate(["192.168.1.%d" % x for x in range(1, 255)]):
    53. msg = "模拟,正在检查 %s 上的漏洞...." % ip
    54. # print(msg)
    55. if i % 5 == 3:
    56. # 表示发射信号 对象.信号.发射(参数)
    57. self.my_signal.emit(msg + "【发现漏洞】")
    58. time.sleep(0.01)
    59. if __name__ == '__main__':
    60. app = QApplication(sys.argv)
    61. w = MyWindow()
    62. w.show()
    63. app.exec()

    总结

    本人从安装 PyQt5 并配置相关的环境,到体验Qt Creator,讲解 PyQt5 的相关命令和控件,同时通过示例代码进行详细的说明,带大家入门了使用 PyQt5 进行的GUI设计。

  • 相关阅读:
    Apache 网站服务基础
    小程序新增功能页面
    Java学习笔记:高级数据过滤
    “云炬众创”小程序的操作演示
    第四章 文件管理 十、文件系统的全局结构
    事务_基本演示和事务_默认自动提交&手动提交
    vue的watch使用 监听数据变化
    Python - flask后端开发笔记
    vs2019测试sizeof(string)的长度是28
    软件工程开发和文档流程(及概要设计+详细设计)
  • 原文地址:https://blog.csdn.net/weixin_65688914/article/details/133979721