Python开发GUI常用库PyQt6和PySide6介绍之四:开发示例

news2024/11/28 16:51:19

Python开发GUI常用库PyQt6和PySide6介绍之四:开发示例

Python开发GUI常用库PyQt6 和 PySide6 介绍系列,已发表的:

之一:简介与安装https://blog.csdn.net/cnds123/article/details/135069944

之二:设计师(Designer)https://blog.csdn.net/cnds123/article/details/135101580

之三:交互和通信方式讲解 https://blog.csdn.net/cnds123/article/details/135190542

不使用Qt Designer时的一般的使用步骤

对于较小的GUI界面程序,如果界面相对简单,不涉及复杂的布局和控件设置,不用Qt Designer(Qt 设计师)直接在代码中创建和布局控件可能更为方便和快捷。

当涉及到使用 PyQt6 或 PySide6 进行图形用户界面 (GUI) 开发时,不使用Qt Designer时的一般的使用步骤:

1)首先,确保已经安装了 PyQt6 或 PySide6 库。

2)导入模块:在代码中导入所需的模块。

☆导入整个库:

对于PySide6

from PySide6 import QtCore, QtGui, QtWidgets

对于PyQt6

from PyQt6 import QtCore, QtGui, QtWidgets

这种方式会导入整个PySide6或PyQt6库,并使你可以使用其提供的所有模块、类和函数。你可以通过模块名称来访问库中的各种Widget(小部件)。

☆导入特定模块或类:

对于PySide6,例如

from PySide6.QtWidgets import QApplication, QMainWindow, QLabel

对于PyQt6,例如

from PyQt6.QtWidgets import QApplication, QMainWindow, QLabel

这种方式只导入了你需要使用的特定模块或类。这样可以减少导入的内容,并使代码更具可读性。

3)创建应用程序对象:创建一个 QApplication 实例。这是你的 GUI 应用程序的主要入口点。

app = QApplication([])

4)创建主窗口:创建一个 QMainWindow 实例作为主窗口。你可以添加其他控件和布局来构建你的界面。

window = QMainWindow()

5)创建控件并添加到窗口:创建你需要的各种Widget(小部件)件,例如 QLabel、QPushButton 等,并将它们添加到主窗口中。

label = QLabel("Hello World!", window)

window.setCentralWidget(label)

6)显示窗口:通过调用 show() 方法来显示主窗口。

window.show()

7)运行应用程序:通过调用 app.exec() 方法来运行应用程序的事件循环,使应用程序保持运行状态。

app.exec()

提示:Widget(小部件)是Qt中可视化的用户界面元素,也有人称为组件或控件,是Qt中QWidget类的实例。它可以是窗口、按钮、标签、文本框、复选框等等。Widget可以用于创建用户界面的各种元素,以响应用户的输入和显示相关的信息。

PySide6是由Qt公司(The Qt Company)开发和支持的。PySide6是Qt官方推荐的Python绑定库,由Qt公司提供支持。它与Qt框架紧密集成,具有与Qt C++版本的高度兼容性。

PyQt6是由Riverbank Computing开发和支持的。它由Riverbank Computing开发和支持,提供了与Qt C++版本相似的功能和API,并且与Qt官方的兼容性很高。

【当软件开发者提到"Qt"时,它可以指两个不同的事物:Qt指The Qt Company,也指Qt开发框架:

1、Qt公司(The Qt Company):这是一家软件公司,主要负责开发和维护Qt开发框架。Qt公司提供商业许可和支持服务,并积极推动Qt的发展和创新。

2、Qt开发框架:这是由Qt公司开发的跨平台的应用程序和用户界面开发框架。Qt开发框架提供了丰富的工具、类库和API,使开发人员能够以一致的方式构建高效、现代和可扩展的应用程序。

当软件开发者提到"Qt"时,需要根据上下文来确定是指Qt公司还是Qt开发框架。】

使用PySide6的简单GUI界面程序示例

源码如下:

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QMessageBox

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # 创建一个按钮
        self.button = QPushButton("Click me", self)
        self.button.move(100, 100) #move方法来设置其位置,两个参数:横坐标和纵坐标
        
        # 将按钮的点击信号连接到我们定义的槽函数
        self.button.clicked.connect(self.on_button_clicked)

    # 当按钮被点击时,这个槽函数会被调用
    def on_button_clicked(self):
        message_box = QMessageBox()
        message_box.setText("Button was clicked!") # 创建一个消息框并显示消息
        message_box.exec()

app = QApplication([])
window = MainWindow()
window.setWindowTitle("PySide6示例")
window.setGeometry(300, 300, 400, 300)
window.show()
app.exec()

运行效果如下

对于上面这个简单的例子,若想改用PyQt6实现,将PySide6替换为PyQt6,即可。你可以试试在此就不给出源码和演示效果了。

用PyQt6实现龙年烟花特效

先给出效果图:

下面给出源码:

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QLabel
from PySide6.QtCore import Qt, QTimer, QPointF, QRectF
from PySide6.QtGui import QPainter, QColor, QFont, QPen, QBrush
import random
import math

class Particle:
    def __init__(self, x, y, color):
        self.x = x
        self.y = y
        self.color = color
        self.radius = random.randint(2, 4)
        self.angle = random.uniform(0, 2 * math.pi)
        self.speed = random.uniform(1, 3)
        self.gravity = 0.1

    def move(self):
        self.x += math.cos(self.angle) * self.speed
        self.y += math.sin(self.angle) * self.speed + self.gravity
        self.radius -= 0.1  # 粒子逐渐变小

    def draw(self, painter):
        painter.setPen(Qt.NoPen)
        painter.setBrush(QColor(*self.color))
        painter.drawEllipse(QPointF(self.x, self.y), self.radius, self.radius)

class Firework:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
        self.particles = []
        self.exploded = False
        self.explode_height = random.randint(100, 400)  # 设置爆炸高度

        self.speed = random.randint(5, 10)  # 设置上升速度
        self.angle = math.pi / 2  # 设置上升角度为垂直向上

    def launch(self):
        if not self.exploded:
            self.y -= self.speed * math.sin(self.angle)
            if self.y <= self.explode_height:  # 到达设定高度后爆炸
                self.explode()
                self.exploded = True

    def explode(self):
        for _ in range(100):  # 爆炸产生的粒子数量
            self.particles.append(Particle(self.x, self.y, self.color))

    def draw(self, painter):
        if not self.exploded:
            painter.setPen(QPen(Qt.NoPen))
            painter.setBrush(QColor(*self.color))
            painter.drawEllipse(QPointF(self.x, self.y), 5, 5)
        else:
            for particle in self.particles:
                particle.move()
                particle.draw(painter)

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Fireworks")
        self.setFixedSize(800, 600)
        self.fireworks = []
        self.timer = QTimer()
        self.timer.timeout.connect(self.updateFireworks)
        self.timer.start(30)  # 控制帧率

    def updateFireworks(self):
        if random.randint(1, 20) == 1:  # 控制烟花发射频率
            self.fireworks.append(Firework(random.randint(0, self.width()), self.height()))

        self.update()

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.fillRect(self.rect(), Qt.black)

        font = QFont("simsun", 36)
        painter.setFont(font)
        painter.setPen(QPen(Qt.red))
        painter.drawText(self.rect(), Qt.AlignCenter, "2024龙年快乐")

        for firework in self.fireworks[:]:
            firework.launch()
            firework.draw(painter)
            if firework.exploded and all(p.radius <= 0 for p in firework.particles):
                self.fireworks.remove(firework)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

用PyQt6实现简单的记事本

下面是一个PySide6实现一个简单的记事本,文件菜单包括:打开、保存、清除、关闭。

先给出效果图:

源码如下:

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QTextEdit, QFileDialog
from PySide6.QtGui import QAction, QIcon

class NotepadWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("记事本")
        self.setWindowIcon(QIcon("notepad-icon.png"))
        self.text_edit = QTextEdit()
        self.setCentralWidget(self.text_edit)
        self.create_menu()
        self.resize(400, 300) #设置窗体的宽度和高度(单位像素)

    def create_menu(self):
        menu = self.menuBar()
        file_menu = menu.addMenu("文件")

        # 打开文件
        open_action = QAction(QIcon("open-icon.png"), "打开", self)
        open_action.setShortcut("Ctrl+O")
        open_action.triggered.connect(self.open_file)
        file_menu.addAction(open_action)

        # 保存文件
        save_action = QAction(QIcon("save-icon.png"), "保存", self)
        save_action.setShortcut("Ctrl+S")
        save_action.triggered.connect(self.save_file)
        file_menu.addAction(save_action)

        #清文本内容除
        clear_action = QAction(QIcon("clear-icon.png"), "清除", self)
        clear_action.setShortcut("Ctrl+Shift+C")
        clear_action.triggered.connect(self.clear_text)
        file_menu.addAction(clear_action)

        # 关闭窗口
        close_action = QAction("关闭", self)
        close_action.setShortcut("Ctrl+Q")
        close_action.triggered.connect(self.close)
        file_menu.addAction(close_action)

    def open_file(self):
        file_dialog = QFileDialog(self)
        file_dialog.setNameFilter("Text Files (*.txt)")
        if file_dialog.exec() == QFileDialog.Accepted:
            file_path = file_dialog.selectedFiles()[0]
            with open(file_path, "r",encoding="utf-8") as file:
                content = file.read()
                self.text_edit.setPlainText(content)

    def save_file(self):
        file_dialog = QFileDialog(self)
        file_dialog.setDefaultSuffix("txt")
        file_dialog.setNameFilter("Text Files (*.txt)")
        if file_dialog.exec() == QFileDialog.Accepted:
            file_path = file_dialog.selectedFiles()[0]
            content = self.text_edit.toPlainText()
            with open(file_path, "w", encoding="utf-8") as file:
                file.write(content)

    def clear_text(self):
        self.text_edit.clear()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = NotepadWindow()
    window.show()
    sys.exit(app.exec())

注意,其中的“encoding="utf-8"”,在大多数情况下,默认的编码方式是根据你的操作系统的默认编码来确定的。如果你不确定文件的实际编码方式,可以尝试使用一些常见的编码方式(如 utf-8、gbk、utf-16 等)进行尝试,以找到正确的编码方式。

顺便说明,代码中假设已经有名为notepad-icon.png、open-icon.png、save-icon.png和clear-icon.png的图标文件可以在当前工作目录下找到,即和代码文件保存在同一目录中,你可以将对应的图标文件替换为你自己的图标文件,若不能或不想供图标文件,可以将代码中self.setWindowIcon(QIcon("notepad-icon.png"))和类似QAction(QIcon("open-icon.png"), "打开", self) 语句中的“QIcon("open-icon.png"),” 部分删除,不删除也不报错,只是运行时不显示图标而已。

附录、PyQt6 vs PySide6 - 这两个Python Qt库之间有什么区别?https://juejin.cn/post/7166899345185308702

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

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

相关文章

python的初识(print+intput函数和变量的基本运用)

#主页传送&#xff1a;江南的江 #每日鸡汤&#xff1a;你要知是非以不辩为解脱&#xff0c;烦恼以忍辱为智慧&#xff0c;办事以尽力为有功&#xff0c;处人以真诚为品格。做人的方略是&#xff1a;把好自己的口&#xff0c;明了心中的事&#xff0c;干好手里的活&#xff0c;走…

鸿蒙 Ark Ui UIAbility组件生命周期

前言&#xff1a; 各位同学有段时间没有见面 因为一直很忙所以就没有去更新博客。最近有在学习这个鸿蒙的ark ui开发 因为鸿蒙不是发布了一个鸿蒙next的测试版本 明年会启动纯血鸿蒙应用 所以我就想提前给大家写一些博客文章 今天要讲的是生命周期&#xff1a; 效果图 &#…

连续分配管理方式-第四十三天

目录 前言 单一连续分配 固定分区分配 分区大小相等 分区大小不等 分区说明表 动态分区分配 问题 用什么样的数据结构记录内存的使用情况 应该选择哪个分区进行分配 分区的分配与回收操作 分配 回收 结论 本节思维导图 前言 连续分配指为用户进程分配的必须是一…

大数据计算基础真题回忆

转载学长20 21的真题 转载链接 注&#xff1a;每年的课件可能会有更改&#xff0c;内容不一样&#xff0c;所以读者复习的时候以所在年份的课件为准 2020 ​ 2021 笔者2023秋 2023 都是大题&#xff0c;没有选择题。 改进的近似算法中&#xff0c;结合具体的例子说明&am…

《3D数学基础-图形和游戏开发》阅读笔记 | 3D数学基础 (学习中 1.4更新)

文章目录 3D数学基础矢量/向量概述 - 什么是向量单位矢量&#xff1a;只关注方向不关注大小 数学运算矢量的加法与减法减法的几何意义计算一个点到另一个点的位移矢量的点积与叉积 矩阵方阵几何意义 - 表示空间坐标的变换 3D数学基础 矢量/向量 在笔记中 变量使用小写字母表…

Python 标准库中的 csv 包

0. Abstract 官方文档很罗嗦&#xff0c;长篇大论例子少。本文将举例说明 csv 包的用法&#xff0c;然后补充一些必要的说明。 1.0 CSV 文件 CSV(Comma-Separated Values,逗号分隔值)文件是一种常见的以纯文本形式存储数据的文件格式。它使用逗号作为字段之间的分隔符&#…

UG装配-引用集

引用集是控制组件的图素在装配体中显示与隐藏 装配体体环境控制组件显示与隐藏的四种方式 1、图层 2、引用集 3、隐藏命令 Ctrl B 4、抑制&#xff0c;取消此组件装配&#xff0c;但保留操作在导航器方便启用 引用集有两种类型 1、UG自动创建的引用集 2、用户定义的引…

ElasticSearch使用Grafana监控服务状态-Docker版

文章目录 版本信息构建docker-compose.yml参数说明 创建Prometheus配置文件启动验证配置Grafana导入监控模板模板说明 参考资料 版本信息 ElasticSearch&#xff1a;7.14.2 elasticsearch_exporter&#xff1a;1.7.0&#xff08;latest&#xff09; 下载地址&#xff1a;http…

部署清华ChatGLM-6B(Linux版)

引言 前段时间,清华公布了中英双语对话模型 ChatGLM-6B,具有60亿的参数,初具问答和对话功能。最!最!最重要的是它能够支持私有化部署,大部分实验室的服务器基本上都能跑起来。因为条件特殊,实验室网络不通,那么如何进行离线部署呢? 「部署环境」:CUDA Version 11.0,…

中国移动联合玻色量子打造“人人可用的量子计算”——恒山光量子算力平台公测上线

​2023年12月1日&#xff0c;中国移动云能力中心&#xff08;简称“移动云”&#xff09;联合北京玻色量子科技有限公司&#xff08;简称“玻色量子”&#xff09;共同打造的“五岳量子计算云平台——恒山光量子算力平台”在苏州正式发布。这是玻色量子继2023年5月16日成功发布…

医院信息系统集成平台—统一身份认证授权平台

统一的数字身份管理包括统一身份管理与授权管理。身份管理和授权管理是访问控制的前提,身份管理对用户的身份进行标识与鉴别;授权管理对用户访问资源的权限进行标识与管理。统一身份管理与授权管理系统作为安全管理中心的一部分,部署于安全管理区域。 医院集成信息平台在医…

大数据应用安全策略包括什么

大数据应用安全策略是为了保障大数据应用中的数据安全而采取的一系列措施&#xff0c;其重要性不容小觑。以下是大数据应用安全策略所包含的主要内容&#xff1a; 一、数据加密与安全存储 数据加密&#xff1a;对于敏感数据&#xff0c;应采用加密技术进行保护&#xff0c;包括…

关于酒的几点思考

你说什么情况下&#xff0c;会让两个大男人手牵着手走路&#xff1f;甚至十指相扣。 不言而明&#xff0c;那肯定是“喝大了”之后。当酒精麻痹了人的神经之后&#xff0c;会让人忘却一切烦恼&#xff0c;让人回归“本真”。当血液中乙醇浓度在0.05-0.1%时&#xff0c;人开始朦…

Android 文字垂直排列,文字向右旋转90度

public class VerticalTextView extends View {private final int ROTATION_ANGLE 90; // 旋转角度&#xff0c;用于将文本垂直排列private String text; // 要显示的文本private TextPaint textPaint; // 用于绘制文本的画笔private Rect textBounds;// 文本边界float x, y;/…

解析为什么Go语言要使用[]rune而不是string来表示中文字符

众所周知&#xff0c;Go语言中有以下这些数据类型。但rune32这个go语言特有的数据类型&#xff0c;比较有意思却经常遭到忽视。所以今天探索学习一下这个数据类型的功能、用法。 Go基本数据类型 布尔&#xff1a;bool 字符串&#xff1a;string 整数&#xff1a; int int8 …

实现vue加载指令 v-loading

文章目录 为什么使用指令实现 loading具体实现封装准备实现 loading 效果loading 显示与隐藏使用修饰符扩展 完整代码与结语 本文不会详细的说明 vue 中指令这些知识点&#xff0c;如果存在疑问&#xff0c;请自行查阅文档或者其他资料 为什么使用指令实现 loading 在日常的开…

(Linux)虚拟机配置固定IP

Linux操作系统的IP地址是通过DHCP服务获取的&#xff0c;也就是动态获取IP地址&#xff0c;每次重启设备后都会获取一次&#xff0c;会导致IP地址频繁变更&#xff0c;为了不频繁更新映射关系&#xff0c;我们需要IP地址固定下来。 1.在VM中配置IP地址网关和网段 打开虚拟网络…

Prometheus-AlertManager 邮件告警

环境,软件准备 本次演示环境&#xff0c;我是在虚拟机上安装 Linux 系统来执行操作&#xff0c;以下是安装的软件及版本&#xff1a; System: CentOS Linux release 7.6Docker: 24.0.5Prometheus: v2.37.6Consul: 1.6.1 docker 安装prometheus,alertmanage,说明一下这里直接将…

2024-01-04 用llama.cpp部署本地llama2-7b大模型

点击 <C 语言编程核心突破> 快速C语言入门 用llama.cpp部署本地llama2-7b大模型 前言一、下载llama.cpp以及llama2-7B模型文件二、具体调用总结 使用协议: License to use Creative Commons Zero - CC0 该图片个人及商用免费&#xff0c;无需显示归属&#xff0c;但如果…

Proxy 与 defineProperty 的理解、区别、优势、劣势

一、Object.defineProperty() 文档&#xff1a;Object.defineProperty() - JavaScript | MDN 作用&#xff1a;对一个对象进行操作的方法。可以为一个对象增加一个属性&#xff0c;同时也可以对一个属性进行修改和删除。 它是在 ES5 中引入的&#xff0c;使用了 getter 和 s…