PyQt上手指南

news2024/11/26 0:33:28

文章目录

    • 前言
    • 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 的动态可视化绘图》 源代码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

thinkphp 使用phpmailer发送邮件以及使用消息队列异步解耦发送邮件

邮箱注册配置&#xff1a; 注册163或qq邮箱&#xff0c;开启smtp服务 25端口 ssl则465端口 下载phpmailer composer 安装phpmailer composer require phpmailer/phpmailer设置配置文件 配置文件 书写代码 代码 <?php namespace app\job; use think\facade\Log; us…

安卓(uniapp)上架华为踩坑合集

1.如果是离线打包&#xff0c;注意在manifest那里修改&#xff1a; android:debuggablefalse2…您的应用targetsdk版本低于30&#xff0c;不符合华为应用市场审核标准。 修改建议&#xff1a;请您将应用targetsdk等级升级到30或30以上。 因为之前我升到30被打回来过&#xff…

【LAMMPS学习】三、构建LAMMPS(5)可选的构建设置

3、构建LAMMPS 3.5.可选的构建设置 LAMMPS 可以通过多种可选设置来构建。每个小节都解释了如何使用 CMake 和 make 进行构建。 3.5.1. C11 标准合规性 编译 LAMMPS 需要 C11 标准兼容编译器。 LAMMPS 2020 年 3 月 3 版是核心代码和大多数软件包与之前的 C98 标准兼容的最…

使用 Flink + Faker Connector 生成测试数据压测 MySQL

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

基于java校园在线打印预约系统设计与实现

摘 要 二十一世纪以来&#xff0c;计算机行业应用技术不断发展&#xff0c;人们的观念也在不断改变。传统打印行业&#xff0c;用户已经意识到传统的打印文件方法等待时间太长。校园在线打印预约系统可以通过网络来打印文件&#xff0c;用户可以在特定的时间预约打印文件&#…

【RabbitMQ | 第一篇】消息队列基础知识

文章目录 1.消息队列基础知识1.1什么是消息队列&#xff1f;1.2消息队列有什么用&#xff1f;&#xff08;结合项目说&#xff09;1.2.1异步处理1.2.2削峰/限流1.2.3降低系统耦合性1.2.4实现分布式事务 1.3消息队列的缺点1.4JMS和AMQP1.4.1 JMS的两种消息模型&#xff08;1&…

PSQLException:limit must not be negative

limit must not be negative异常原因及解决 在PostgreSQL中遇到PsqlException: limit must not be negative异常&#xff0c;通常是由于在执行SQL查询时&#xff0c;传递给LIMIT子句的值为负数导致的。LIMIT子句用于限制查询结果的数量&#xff0c;其值必须是非负整数。 解决这…

C++ Qt开发:QUdpSocket实现组播通信

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QUdpSocket组件实现基于UDP的组播通信…

15届蓝桥杯第二期模拟赛所有题目解析

文章目录 &#x1f9e1;&#x1f9e1;t1_求余&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t2_灌水&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t3_字符显示&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t4_区间最大和…

Mysql:行锁,间隙锁,next-key锁?

注&#xff1a;以下讨论基于InnoDB引擎。 文章目录 问题引入猜想1&#xff1a;只加了一行写锁&#xff0c;锁住要修改的这一行。语义问题数据一致性问题 猜想2&#xff1a;要修改的这一行加写锁&#xff0c;扫描过程中遇到其它行加读锁猜想3&#xff1a;要修改的这一行加写锁&…

[ C++ ] STL---list的使用指南

目录 list简介 list的常用接口 构造函数 赋值运算符重载 迭代器 容量相关接口 元素访问接口 修改相关接口 头插push_front() 头删pop_front() 尾插push_back() 尾删pop_back() insert() erase() list的迭代器失效 list简介 1. list是可以以O(1)的时间复杂度在任意…

ORACLE 上机操作3-1

sqlplus / as sysdba 显示parameter结构 SQL> set pause on SQL> desc v$parameter 显示系统静态参数 SQL> select name from v$parameter where isses_modifiable FALSE; 显示db_files是否可以用命令修改 SQL> select isses_modifiable, issys_modifiable, ismod…

使用 OpenAI 的 Embedding模型 构建知识向量库并进行相似搜索

OpenAI的embedding模型的使用 首先第一篇文章中探讨和使用了ChatGPT4的API-Key实现基础的多轮对话和流式输出&#xff0c;完成了对GPT-API的一个初探索&#xff0c;那第二步打算使用OpenAI的embedding模型来构建一个知识向量库&#xff0c;其实知识向量库本质上就是一个包含着一…

四、HarmonyOS应用开发-ArkTS开发语言介绍

目录 1、TypeScript快速入门 1.1、编程语言介绍 1.2、基础类型 1.3、条件语句 1.4、函数 1.5、类 1.6、模块 1.7、迭代器 2、ArkTs 基础&#xff08;浅析ArkTS的起源和演进&#xff09; 2.1、引言 2.2、JS 2.3、TS 2.4、ArkTS 2.5、下一步演进 3、ArkTs 开发实践…

【Linux】网络基础一

网络基础一 1.计算机网络背景1.1 网络发展1.2 认识 “协议” 2.网络协议初识2.1 协议分层2.2 OSI七层模型2.3 TCP/IP五层(或四层)模型 3. 网络传输基本流程3.1 网络传输流程图 4.数据包封装和分用5.网络中的地址管理 从今天开始我们将要从系统横跨到网络的学习了&#xff0c;因…

微信支付宝--充ChatGPTPLUS/openAI key

ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够基于在预训练阶段所见的模式和统计规律&#xff0c;来生成回答&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完成撰写论文、邮件、脚本、文案、翻译、代码等…

MFC界面美化第四篇----自绘list列表(重绘列表)

1.前言 最近发现读者对我的mfc美化的专栏比较感兴趣&#xff0c;因此在这里进行续写&#xff0c;这里我会计划写几个连续的篇章&#xff0c;包括对MFC按钮的美化&#xff0c;菜单栏的美化&#xff0c;标题栏的美化&#xff0c;list列表的美化&#xff0c;直到最后形成一个完整…

【Python】反编译PyInstaller打包的exe

查看exe基本信息 需要反编译的exe 查看exe文件的打包工具&#xff0c;查看exe信息的软件叫Detect It Easy(查壳工具) 由图我们可以看出当前选中的exe文件是由名叫PyInstaller的打包工具打包好的exe 反编译 exe反编译工具&#xff1a;pyinstxtractor.py 使用方法 python py…

VMWare虚拟机使用openmediavault搭建NAS服务器完整步聚

下载: gopenmediavault - The open network attached storage solution 下载好openmediavault的ISO镜像后,打开虚拟机并安装 系统类型选择Debian 启动虚拟机并安装openmediavault 选择中文 地区选中国 键盘配置选汉语 开始安装 配置网络信息 配置root密码 确认密码 系统安装中…

spark基本原理UI界面解读

这里是引用 1 八股文 1.1 基本原理 driver节点是整个应用程序的指挥所 指挥官是sparkcontext 环境&#xff1a;构建一个集群 应用程序提交 确定主节点&#xff0c;确定指挥所driver&#xff0c;确定指挥官sparkcontext sparkcontext会向资源管理器申请资源 会将作业分…