PyQt上手指南

文章目录

    • 前言
    • PyQt的好处
    • 从一个最简单的例子入手
    • PyQt5基础
      • 组件体系
      • 源码结构
    • Qt Designer
    • 基础
    • 布局
    • 高级界面
      • Web控件
    • 多线程
    • 列表
    • 图形绘制
      • PyQt5.QtGui
      • PyQtGraph
      • matplotlib和PyQt结合
      • 和mplfinance结合
    • 工具使用
    • 打包
    • 链接

前言

用户界面开发,我搞过visual C++ MFC、Delphi VCL、Java Swing/JavaFX、SWT、Electron,当然web里jQuery EasyUI、ExtJS、Dojo以及现在流行的React和Vue也算。如果把Kotlin之Jetpack和SwiftUI/UIKit加上,就琳琅满目、品类齐全了。唉,程序员这一生被技术给耽误了。

PyQt的好处

目前Python上主要的GUI开发工具包括:tkinter、PyQt、PyGTK和wxPython。PyQt最正统,和其它桌面系统相比,有开发速度快,组件丰富,生命力强的优势(受众群体大、社区支持强),当然性能也不差。

从一个最简单的例子入手

if __name__ == '__main__':
    app = QApplication(sys.argv)
    # main = FixBtn()
    main = QPushButton("测试")
    main.show()
    sys.exit(app.exec_())

任何一个QWidget都能独立show(),这点和其它编程语言的GUI框架不同。一个QWidget可以设置一个layout,通过layout.addWidget()就能添加组件,然后就能独立显示。QMainWindow、QFrame、QDialog只是功能更齐全的窗口而已。

递进一步就是:

if __name__ == '__main__':
    app = QApplication(sys.argv)

    panel = QWidget()
    layout = QHBoxLayout()

    btn1 = QPushButton("按钮1")
    btn2 = QPushButton("按钮2")
    btn3 = QPushButton("按钮3")

    layout.addWidget(btn1, 1, Qt.AlignLeft)
    layout.addWidget(btn2, 2, Qt.AlignCenter)
    layout.addWidget(btn3, 3, Qt.AlignRight)

    panel.setLayout(layout)
    panel.show()

    sys.exit(app.exec_())

PyQt5基础

组件体系

在这里插入图片描述

源码结构

在这里插入图片描述

  • QWidget类是所有用户界面对象的基类。窗口部件(QWidget)是用户界面的一个基本单元:它从窗口系统接收鼠标,键盘和其他事件,并且在屏幕上绘制自己。每个窗口部件都是矩形的,并且它们按Z轴顺时针排列。一个窗口部件可以把他的父窗口部件或者它前面的窗口部件盖住一部分。QMainWindow、QDialog、QFrame是三个直接继承于QWidget的容器类,三者是平级的,能独立存在。
  • QMainWindow 类提供一个菜单条、锚接窗口(如工具栏)和一个状态条的主应用程序窗口。主窗口通常用在提供一个大的中央窗口部件以及周围菜单、工具条和一个状态条。QMainWindow常常被继承,因为这使的封装中央部件、菜单和工具以及窗口状态条变得容易,当用户点击菜单项或工具条按钮时,槽会被调用。基于主窗口的应用程序,默认已经有了自己的布局管理器。
  • QDialog类是对话框窗口的基类。对话框窗口是主要用于短时期任务以及用户进行简要通讯的顶级窗口。QDialog可以是模态对话框也可以是非模态对话框。QDialog支持扩展性并且可以提供返回值。他们可以有默认按钮。QDialog也可以有一个QSizeGrip在它的右下方,使用setSizeGripEnable()。注意:QDialog使用父窗口部件的方法和Qt中其他类不同。对话框总是顶级窗口部件,但是如果它有一个父对象,它的默认位置就是父对象的中间。他也将和父对象共享工具条条目。
  • QFrame类是有框架的窗口部件的基类。它绘制部件并且调用一个虚函数drawContents()函数来填充这个框架。这个函数是被子类重新实现的。QFrame类也可以之间创建没有任何内容的简单框架,尽管通常情况下,要用到QHBox 或QVBox,因为它们可以自动布置你放到框架的窗口部件
  • QScrollArea是有滚动条的窗口,继承QFrame
  • 组件的Parent。没有parent的QWidget类被认为是最上层的窗体(通常是MainWindow),由于MainWindow的一些操作生成的新窗体对象,parent都应该指向MainWindow。由于parent-child关系的存在,它保证了child窗体在主窗体被回收之时也被回收。parent作为构造函数的最后一个参数被传入,但通常情况下不必显示去指定parent对象。因为当调用局管理器时,部局管理器会自动处理这种parent-child关系。但是在一些特殊的情况下,我们必须显示的指定parent-child关系。如当生成的子类不是QWidget对象但继承了QObject对象,用作dock widgets的QWidget对象。

Qt Designer

先秦的Delphi可视化工具深入人心,现在Qt Designer也不遑多让。
每一次运行QtDesigner修改了UI后,都需要通过PyUIC转换为新的.py文件,都会覆盖掉我们自己的代码,所以一般新建一个新的文件来写入自己的代码。

pyuic5 mainwindow.ui -o MainWindow.py

pyuic5可以将ui文件转为python文件。但Qt6里似乎没有提供pyuic工具,但可以如下使用:

import sys
from PyQt6 import QtWidgets, uic
 
app = QtWidgets.QApplication(sys.argv)
 
window = uic.loadUi("mainwindow.ui")
window.show()
app.exec()

当然,安装PyQt6-tools:pip install PyQt6-tools之后就有pyuic6了。和pycharm集成:
在这里插入图片描述

$FileName$ -o $FileNameWithoutExtension$.py

基础

布局

常用的布局:QHBoxLayout 、QVBoxLayout、QGridLayout、QFormLayout、QSplitter。
通过设置伸缩量stretch可以调节一个layout里组件的比例。主要是两个方法addStretch()和setStretch()。

    app = QApplication(sys.argv)

    panel = QWidget()
    layout = QHBoxLayout()

    btn1 = QPushButton("按钮1")
    btn2 = QPushButton("按钮2")
    btn3 = QPushButton("按钮3")

    # layout.addWidget(btn1, 1, Qt.AlignLeft)
    # layout.addWidget(btn2, 2, Qt.AlignCenter)
    # layout.addWidget(btn3, 4, Qt.AlignRight)
    layout.addWidget(btn1)
    layout.addWidget(btn2)
    layout.addWidget(btn3)

    # 设置组件占据的空间比例
    layout.setStretch(0, 1)
    layout.setStretch(1, 2)
    layout.setStretch(2, 4)

    layout.setSpacing(10)

    panel.setLayout(layout)
    panel.resize(600, 280)
    panel.show()

    sys.exit(app.exec_())

这个stretch值,既可以在addWidget()时设置,也可以是在add后调用addStretch()或setStretch()设置,效果是等同的。但是,layout.addWidget(btn1, 1, Qt.AlignLeft)和layout.addWidget(btn1, 1)是有区别的。

如果在第一个控件之前addStretch(),就可以添加一个空的占位控件,这也是布局的一个技巧。
在这里插入图片描述

高级界面

比较复杂的控件有:QTableView、QListView、QListWidget、QTableWidget、QTreeView

Web控件

以前是QWebView,Qt5.6 后改为QWebEngineView。通过qwebchannel.js与页面中JS进行交互。

多线程

  • QTimer: 提供重复的和音效的定时器
  • QThread:要使用QThread开始一个线程,可以创建它的一个子类,然后覆盖其QThread.run()函数。QThread有started和finished信号,可以为这2个信号指定槽函数。

列表

QTableWidget 继承自QTableView,主要区别是QTableView 可以使用自定义的数据模型来显示内容(先要通过setModel 来绑定数据源),而QTableWidget 只能使用标准的数据模型,并且其单元格数据是通过QTableWidgetltem 对象来实现的。

图形绘制

在PyQt中常用的图像类有4个,即QPixmap、QImage、QPicture和QBitmap。

  • QPixmap是专门为绘图而设计的,在绘制图片时需要使用QPixmap;
  • QImage提供了一个与硬件无关的图像表示函数,可以用于图片的像素级访问;
  • QPicture是一个绘图设备类,它继承自QPainter类,可以使用QPainter的begin()函数在QPicture上绘图,使用end()函数结束绘图,使用QPicture的save()函数将QPainter所使用过的绘图指令保存到文件中;
  • QBitmap是一个继承自QPixmap的简单类,它提供了1bit深度的二值图像的类,QBitmap提供的单色图像可以用来制作游标(QCursor)或者笔刷(QBrush)。

绘图库:PyQt5.QtGui,PyQtGraph,Matpoltlib、Plotly

PyQt5.QtGui

painter = QPainter(self)               
painter.setPen(self.pen1)
painter.drawLine(100, 10, 500, 10)  

PyQtGraph

PyQtGraph 是一个基于 PyQt 和 Numpy 构建的纯 Python 图形和 GUI 库,应用于数学、科学、等工程数据可视化应用,它的主要目标是提供用于显示数据的快速交互式图形,以及提供应用程序快速开发的工具。

matplotlib和PyQt结合

让plt在画布上画图:

self.fig = plt.figure(figsize=(8, 5))
self.canvas = FigureCanvas(self.fig)
self.chartlayout.addWidget(self.canvas)
ax = self.fig.add_subplot(111)
ax = df.plot(data.......)
self.canvas.draw()

和mplfinance结合

mplfinance是一个画K线图的库。

import mplfinance as mpf
fig, axlist = mpf.plot(ohlcv_dataframe, figratio=(8, 5), returnfig=True)
canvas = FigureCanvas(fig)
chartlayout.addWidget(canvas)
canvas.draw()

工具使用

Qt Designer生成的.ui文件(实质上是XML格式的文件)通过pyuic5工具转换成.py文件。

打包

PyInstaller,加-F参数可以打成一个单一的文件。然后解开,根据需要裁剪瘦身。
python3.8是最后一个支持32位程序的版本,其runtime为最小,如果程序没有加载大数据的需求,建议采用3.8作为rumtime。

链接

  • Plotly : Low-Code Python Data Apps
  • PythonPlotlyCodes: 《Python 数据分析:基于 Plotly 的动态可视化绘图》 源代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/471630.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【链表】Leetcode 142. 环形链表 II【中等】

环形链表 II 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系…

ruoyi-activiti添加用车申请流程(二)

实体类Car中必须要有String userId属性。 设置自定义表单为system/car/deptleadercheck: 然后在CarController中编写system/car/deptleadercheck对应的函数: GetMapping("/deptleadercheck")public String deptleadercheck(String taskid, M…

学习总结!

最近主要学习了java&#xff0c;题目的话就写了两道。 这道题目运用三维的bfs&#xff0c;第一次做时无从下手&#xff0c;原来可以利用三维数组&#xff08;第一次用三维数组&#xff09;可以解决这类问题&#xff0c;然后套bfs模板即可。 #include<iostream> #include…

算法体系-11 第十一节:二叉树基本算法(上)

一 两链表相交 1.1 题目描述 给定两个可能有环也可能无环的单链表&#xff0c;头节点head1和head2。请实现一个函数&#xff0c;如果两个链表相交&#xff0c;请返回相交的 第一个节点。如果不相交&#xff0c;返回null 【要求】 如果两个链表长度之和为N&#xff0c;时间复杂…

瑞_Redis_短信登录_基于Session实现登录流程

文章目录 项目介绍1 短信登录1.1 项目准备1.2 基于Session实现登录流程1.2.1 功能流程介绍1.2.1.1 发送短信验证码1.2.1.2 短信验证码登录、注册1.2.1.3 校验登录状态 1.2.2 实现发送短信验证码功能1.2.2.1 页面流程1.2.2.2 代码实现1.2.2.3 测试 1.2.3 实现短信验证码登录、注…

SLAM 算法综述

LiDAR SLAM 其主要思想是通过两个算法&#xff1a;一个高频激光里程计进行低精度的运动估计&#xff0c;即使用激光雷达做里程计计算两次扫描之间的位姿变换&#xff1b;另一个是执行低频但是高精度的建图与校正里程计&#xff0c;利用多次扫描的结果构建地图&#xff0c;细化位…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 3月20日,星期三

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年3月20日 星期三 农历二月十一 春分 1、 教育部发布新增24种本科专业 涉及智能视觉工程、足球运动等。 2、 香港特区立法会全票通过《维护国家安全条例》&#xff0c;将于23日刊宪。 3、 国际乒联更新世界排名&#xff0c…

高效数据处理:亚信安慧AntDB在行动

亚信安慧AntDB数据库在运营商自主可控替换项目中的成功应用&#xff0c;具有极其重要的意义。该数据库的落地&#xff0c;不仅为这一项目注入了强大的支持力量&#xff0c;还在更大程度上提升了整体的运营效能。作为一种高效可靠的数据库解决方案&#xff0c;AntDB引入了先进的…

【项目】YOLOv5+PaddleOCR实现艺术字验证码识别

YOLOv5PaddleOCR实现艺术字类验证码识别 一、引言1.1 实现目标1.2 人手动点选验证码逻辑1.3 计算机点选逻辑 二、计算机验证方法2.1 PaddleOCR下方文字识别方法2.2 YOLOv5目标检测方法2.3 艺术字分类方法2.4 返回结果 三、代码获取 一、引言 1.1 实现目标 要识别的验证码类型…

浏览器的渲染原理

浏览器的渲染原理 来总结一下最近理解的浏览器渲染原理和流程 首先浏览器是多进程的&#xff0c;分为渲染进程、插件进程、主进程、网络进程以及GPU进程 而我们打包出来的js html css文件&#xff0c;经过浏览器的渲染进程&#xff0c;就会展示出看到的页面。下面主要来了解一…

mysql索引实现

什么是索引失效 在MySQL中&#xff0c;索引失效指的是查询语句无法有效地使用索引&#xff0c;而必须进行全表扫描。索引失效可能会导致查询性能下降&#xff0c;特别是在处理大量数据时。 索引失效的原因 1.索引列进行了运算或函数操作 如果对索引列进行了运算或使用了函数…

第十届电气工程、控制和机器人技术国际会议(ICRAS 2024)即将召开!

2024年第十届电气工程、控制和机器人技术国际会议&#xff08;ICRAS 2024&#xff09;将于2024年6月21日至23日在日本东京举行。本次会议由中国地质大学&#xff08;武汉&#xff09;和北京控制机器人与智能技术研究所主办。ICRAS 2024旨在聚集来自世界各地的教授、研究人员、学…

遇到大量的照片需要尺寸调整怎么办?跟着小编往下看 轻松帮你解决照片尺寸修改的烦恼

在日常的摄影后期处理中&#xff0c;我们可能会遇到需要将大量照片上传至社交媒体、制作相册、或者进行打印等需求。不同的平台或用途对照片的尺寸有不同的要求&#xff0c;因此我们需要对照片的尺寸进行调整以满足这些要求。此外&#xff0c;随着手机、相机等设备的普及&#…

开源问卷调查系统

Java Vue 开源问卷调查系统 附项目地址 Astar问卷调查系统 基于SpringBootVue前后端分离的问卷调查系统 平台简介 本项目旨在提供一个简单易用的问卷调查平台&#xff0c;帮助用户创建、分享问卷&#xff0c;并收集、分析调查数据。我们希望能够为各行各业的调查需求提供一种…

【python】python结合js逆向,让有道翻译成为你的翻译官,实现本地免费实时翻译

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者等等。 🏆《博客》:Python全栈,前后端开发,人工智能,js逆向,A…

理清大数据技术与架构

大数据并不是一个系统软件&#xff0c;更不是一个单一的软件&#xff0c;它实际上是一种技术体系、一种数据处理方法&#xff0c;甚至可以说是一个服务平台。在这个技术体系中&#xff0c;涵盖了许多不同的部件&#xff0c;比如Hadoop服务平台。这一服务平台可以根据具体情况自…

管理类联考–复试–英文面试–问题–WhatWhyHow--纯英文汇总版

文章目录 Do you have any hobbies? What are you interested in? What do you usually do in your spare time? Could you tell me something about your family&#xff1f; Could you briefly introduce your family? What is your hometown like? Please tell me so…

复旦发布层次性奖励学习框架,增强大模型人类偏好对齐

在人工智能领域&#xff0c;强化学习&#xff08;Reinforcement Learning, RL&#xff09;一直是实现智能体自主学习的关键技术之一。通过与环境的交互&#xff0c;智能体能够自我优化其行为策略&#xff0c;以获得更多的奖励。然而&#xff0c;当涉及到复杂的人类偏好时&#…

顶顶通呼叫中心中间件-机器人话术编辑器意向问题详解

文章目录 前言联系我们意向页面和分类页面的区别意向权重意向权重的计算意向权重的作用 分类规则如何分类 前言 顶顶通旗下有一款机器人话术可视化编辑工具&#xff0c;可以根据用户的需求编辑话术流程。针对该话术编辑工具的意向功能进行讲解&#xff1a; 机器人话术可视化工…

案例练习:敲桌子

大家好&#xff1a; 衷心希望各位点赞。 您的问题请留在评论区&#xff0c;我会及时回答。 案例描述 从1开始数到数字100&#xff0c;如果数字的个位含有7&#xff0c;或者数字是7的倍数&#xff0c;我们打印输出“敲桌子”&#xff0c;其余数字直接打印输出。 代码 #includ…