【使用 PyQt6-第01章】 创建基本的应用程序

使用 PyQt6 创建您的第一个应用程序

目录

  • 一、说明
  • 二、创建应用程序
  • 三、单步执行代码
  • 四、什么是事件循环?
    • 4.1 Qt 中的事件循环。
  • 五、主窗口 QMainWindow
  • 六、调整窗口和小部件的大小

一、说明

   本教程也适用于 PySide6 、 PySide2 和 PyQt5

   在本教程中,我们将学习如何使用 PyQt6 通过 Python 创建桌面应用程序。首先,我们将在桌面上创建一系列简单的窗口,以确保 PyQt 正常工作并介绍一些基本概念。然后我们将简要了解一下事件循环以及它与 Python 中的 GUI 编程的关系。最后我们将看看 Qt,QMainWindow它提供了一些有用的通用界面元素,例如工具栏和菜单。这些将在后续教程中进行更详细的探讨。

二、创建应用程序

   让我们创建我们的第一个应用程序!要开始创建一个新的 Python 文件,您可以将其命名为任何您喜欢的名称(例如app.py)并将其保存在可访问的位置。我们将在此文件中编写简单的应用程序。

   我们将在此文件中进行编辑,您可能想返回到代码的早期版本,因此请记住定期备份。

   该应用程序的源代码如下所示。逐字输入,注意不要出错。如果你确实搞砸了,Python 会让你知道出了什么问题。

from PyQt6.QtWidgets import QApplication, QWidget

# Only needed for access to command line arguments
import sys

# You need one (and only one) QApplication instance per application.
# Pass in sys.argv to allow command line arguments for your app.
# If you know you won't use command line arguments QApplication([]) works too.
app = QApplication(sys.argv)

# Create a Qt widget, which will be our window.
window = QWidget()
window.show()  # IMPORTANT!!!!! Windows are hidden by default.

# Start the event loop.
app.exec()


# Your application won't reach here until you exit and the event
# loop has stopped.

   首先,启动您的应用程序。您可以像任何其他 Python 脚本一样从命令行运行它,例如 –

   运行!您现在将看到您的窗口。 Qt 会自动创建一个带有普通窗口装饰的窗口,您可以像任何窗口一样拖动它并调整它的大小。

   您将看到的内容取决于您运行此示例的平台。下图显示了 Windows、macOS 和 Linux (Ubuntu) 上显示的窗口。
在这里插入图片描述

   我们的窗口,如 Windows、macOS 和 Linux 上所示。

三、单步执行代码

   让我们逐行浏览代码,以便我们准确地了解发生了什么。

   首先,我们导入应用程序所需的 PyQt 类。在这里,我们从模块导入QApplication应用程序处理程序和QWidget基本的空QtWidgetsGUI 小部件。

from PyQt6.QtWidgets import QApplication, QWidget

   Qt 的主要模块是QtWidgets、QtGui和QtCore。

   你可以这样做,from import *但这种全局导入在 Python 中通常是不良好的习惯,所以我们在这里避免它。

   接下来我们创建一个 的实例QApplication,传入sys.arg,它是list包含传递给应用程序的命令行参数的 Python。

app = QApplication(sys.argv)

   如果您知道您不会使用命令行参数来控制 Qt,您可以传入一个空列表,例如

app = QApplication([])

   QWidget接下来我们使用变量 name创建 a 的实例window。

window = QWidget()
window.show()

   在 Qt 中,所有顶级小部件都是窗口——也就是说,它们没有父级,也没有嵌套在另一个小部件或布局中。这意味着您可以在技术上使用您喜欢的任何小部件创建窗口。

   没有父级的 小部件默认是不可见的。因此,创建window对象后,我们必须始终调用.show()以使其可见。您可以删除.show()并运行该应用程序,但您无法退出它!

   什么是窗户? - 保存应用程序的用户界面 - 每个应用程序至少需要一个(…但可以有更多) - 应用程序将(默认情况下)在最后一个窗口关闭时退出

   最后,我们调用app.exec()启动事件循环。

四、什么是事件循环?

   在将窗口显示在屏幕上之前,需要介绍一些有关 Qt 世界中应用程序如何组织的关键概念。如果您已经熟悉事件循环,则可以安全地跳到下一部分。

   每个 Qt 应用程序的核心是QApplication类。每个应用程序都需要一个(而且只需要一个)QApplication对象来运行。该对象保存应用程序的事件循环——控制所有用户与 GUI 交互的核心循环。
在这里插入图片描述

4.1 Qt 中的事件循环。

   与应用程序的每次交互(无论是按下按键、单击鼠标还是移动鼠标)都会生成一个事件,该事件被放置在事件队列中。在事件循环中,每次迭代都会检查队列,如果发现等待事件,则将该事件和控制权传递给该事件的特定事件处理程序。事件处理程序处理该事件,然后将控制权传递回事件循环以等待更多事件。每个应用程序只有一个正在运行的事件循环。

   该类QApplication-QApplication保存 Qt 事件循环 - 需要一个实例 - 您的应用程序在事件循环中等待,直到采取操作 -任何时候都QApplication只有一个事件循环在运行

五、主窗口 QMainWindow

   正如我们在上一部分中发现的,在 Qt 中任何小部件都可以是窗口。例如,如果您替换QtWidget为QPushButton.在下面的示例中,您将看到一个窗口,其中有一个可按的按钮。

import sys
from PyQt6.QtWidgets import QApplication, QPushButton

app = QApplication(sys.argv)

window = QPushButton("Push Me")
window.show()

app.exec()

   这很简洁,但实际上并不是很有用——您很少需要一个仅包含单个控件的 UI!但是,正如我们稍后将发现的,使用布局将小部件嵌套在其他小部件中的能力意味着您可以拥有空的QWidget.

   但是,Qt 已经为您提供了一个解决方案—— QMainWindow.这是一个预制的小部件,提供了许多您将在应用程序中使用的标准窗口功能,包括工具栏、菜单、状态栏、可停靠小部件等。稍后我们将介绍这些高级功能,但现在,我们将向QMainWindow我们的应用程序添加一个简单的空。

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow

app = QApplication(sys.argv)

window = QMainWindow()
window.show()

# Start the event loop.
app.exec()

   运行!您现在将看到主窗口。看上去和以前一模一样!

   所以我们QMainWindow目前并不是很有趣。我们可以通过添加一些内容来解决这个问题。如果您想创建自定义窗口,   最好的方法是子类化QMainWindow,然后将窗口的设置包含在__init__块中。这允许窗口行为是独立的。我们可以添加我们自己的子类QMainWindow- 调用它MainWindow以保持简单。

import sys

from PyQt6.QtCore import QSize, Qt
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton
# Subclass QMainWindow to customize your application's main window
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My App")
        button = QPushButton("Press Me!")

        # Set the central widget of the Window.
        self.setCentralWidget(button)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()

   对于此演示,我们使用的是QPushButton.核心 Qt 小部件始终从命名空间导入QtWidgets,就像QMainWindow和QApplication类一样。使用时QMainWindow,我们通常.setCentralWidget将一个小部件(此处为 a QPushButton)放在QMainWindow- 默认情况下它占据整个窗口。我们将在布局教程中了解如何向窗口添加多个小部件。

   当您子类化 Qt 类时,您必须始终调用 super__init__函数以允许 Qt 设置该对象。

   在我们的__init__块中,我们首先用来.setWindowTitle()更改主窗口的标题。然后我们将第一个小部件 - a QPushButton- 添加到窗口的中间。这是 Qt 中可用的基本小部件之一。创建按钮时,您可以传入希望按钮显示的文本。

   最后,我们调用.setCentralWidget()窗口。这是一个QMainWindow特定的功能,允许您设置位于窗口中间的小部件。

   运行!现在您将再次看到窗口,但这次小QPushButton部件位于中间。按下按钮不会执行任何操作,我们接下来会对此进行排序。

   我们的 QMainWindow 在 Windows、macOS 和 Linux 上带有单个 QPushButton。
   我们在 Windows、macOS 和 Linux 上QMainWindow都有一个版本QPushButton。

   我们很快就会详细介绍更多小部件,但如果您不耐烦并想跳到前面,您可以查看QWidget 文档。尝试将不同的小部件添加到您的窗口!

六、调整窗口和小部件的大小

   该窗口目前可以自由调整大小 - 如果您用鼠标抓住任何角落,则可以拖动它并将其调整为您想要的任何大小。虽然让用户调整应用程序的大小是件好事,但有时您可能希望对最小或最大大小进行限制,或者将窗口锁定为固定大小。

   在 Qt 中,大小是使用QSize对象定义的。这按顺序接受宽度和高度参数。例如,以下将创建一个400x300 像素的固定大小窗口。

import sys

from PyQt6.QtCore import QSize, Qt
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton


# Subclass QMainWindow to customize your application's main window
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My App")
        button = QPushButton("Press Me!")
        self.setFixedSize(QSize(400, 300))

        # Set the central widget of the Window.
        self.setCentralWidget(button)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()

   运行!您将看到一个固定大小的窗口 - 尝试调整它的大小,这是行不通的。

   我们的固定大小窗口,请注意,maximize 控件在 Windows 和 Linux 上被禁用。在 macOS 上,您_可以_最大化应用程序以填满屏幕,但中央小部件不会调整大小。
   我们的固定大小窗口,请注意 maximize
   控制在 Windows 和 Linux 上被禁用。在 macOS 上,您可以最大化应用程序以填满屏幕,但中央小部件不会调整大小。

   .setFixedSize()您还可以调用和.setMinimumSize()分别.setMaximumSize()设置最小和最大尺寸。自己尝试一下!

   您可以在任何小部件上使用这些尺寸方法。

   在本节中,我们介绍了QApplication类、QMainWindow类、事件循环,并尝试向窗口添加一个简单的小部件。在下一节中,我们将了解 Qt 为小部件和窗口之间以及您自己的代码之间进行通信所提供的机制。

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

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

相关文章

钉钉 AI 升级多种功能;智谱AI PC智能助手发布;百度回应与苹果合作

▶ 钉钉 AI 升级上线多种功能 3 月 28 日,钉钉 AI 助理升级。升级后上线了图片理解、文档速读、工作流等产品能力,率先探索多模态、长文本与 RPA 技术在 AI 应用的落地。 基于阿里通义千问大模型,升级后的钉钉 AI 助理可以做到: …

C++ —— C++11新增语法

目录 一,列表初始化 1.1 这是什么? 1.2 initializer_list 1.3 在容器的运用 1.4 STL中的变化 二,右值引用和左值引用 2.1 是什么? 2.2 这两个东西有啥关系? 2.3 有啥用? 三,*移动构…

Jmeter 配置说明之线程组

一、线程组介绍: 线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程组下。所有的任务都是基于线程组: 通俗理解: 线程组:就是一个线程组,里面有若干个请求; 线程&am…

基于JSPM的美食推荐管理系统

背景 互联网的迅猛扩张彻底转变了全球各类组织的运营模式。自20世纪90年代起,中国各级政府和企事业单位便开始探索运用网络系统来处理管理事务。然而,早期的网络覆盖不广、用户接受度不高、相关网络法规不健全以及技术发展不成熟等因素,都曾…

Kubernetes-running app on kube

Docker 安装Docker 首先,您需要在Linux机器上安装Docker。如果您不使用Linux,则需要启动一个Linux虚拟机(VM)并在该虚拟机中运行Docker。如果你使用的是Mac或Windows系统,并按照指令安装Docker, Docker将为你建立一个虚拟机,并在…

uniapp-打包IOS的APP流程

打包前所需配置 在manifest文件内配置 1. APP图标 2. 启动界面 有三种启动界面配置 第一种是 HBuilderX 官方给的通用启动界面,页面单一,屏幕中间就一个圆框图标 第二种是自定义的启动图,无法通过AppStore的审核 第三种是自定义storyboard启动…

亚信安全联合人保财险推出数字安全保障险方案,双重保障企业数字化转型

数字化发展,新兴技术的应用与落地带来网络攻击的进一步演进升级,同时全球产业链供应链融合协同的不断加深,更让网络威胁的影响范围与危害程度不断加剧。 企业单纯依靠自身安全能力建设,能否跟上网络威胁的进化速度?能否…

Go的数据结构与实现【Queue】

介绍 与栈一样,队列也是最基本的数据结构之一。队列也是值的一种容器,其中值的插入和删除遵循“先进先出”(First-In-First-Out, FIFO)的原则⎯⎯也就是说,每次删除的只能是最先插入的值。 实现 队列的抽象数据类型…

进程的等待

文章目录 一、进程等待意义二、进程等待方法 一、进程等待意义 当父进程创建子进程之后,当子进程退出时,需要它的父进程回收它的内核数据结构对象(pcb),因为进程退出之后不回收它会造成内存泄漏问题,子进程退出,若是父进程不管&a…

HarmonyOS ArkTS 骨架屏加载显示(二十五)

目录 前言1、骨架屏代码显示2、代码中引用3、效果图展示 前言 所谓骨架屏,就是在页面进行耗时加载时,先展示的等待 UI, 以告知用户程序目前正在运行,稍等即可。 等待的UI大部分是 loading 转圈的弹窗,有的是自己风格的小动画。其实…

010_documentation_in_Matlab中的帮助与文档

Matlab中的帮助与文档 1. 前言 一眨眼已经写了十篇文章。 000在Matlab中使用Python包CoolProp001Matlab运行时间测试与时间复杂度分析002避免使用for循环003Matlab中的向量约定004Matlab中的矩阵约定005Matlab中的数组索引006Matlab中的逻辑数组索引007Matlab学习的启动与加…

Word、Excel、PPT文件转PDF文件(C#)

一、添加依赖 为wpf项目引用Microsoft.Office.Interop.Excel、Microsoft.Office.Interop.PowerPoint、Microsoft.Office.Interop.Word、Office,依赖文件已经打到源代码包里了。 二、先定义一些命名空间 using Word Microsoft.Office.Interop.Word;using Excel M…

C++项目——集群聊天服务器项目(七)Model层设计、注册业务实现

在前几节的研究中,我们已经实现网络层与业务层分离,本节实现数据层与业务层分离,降低各层之间的耦合性,同时实现用户注册业务。 网络层专注于处理网络通信与读写事件 业务层专注于处理读写事件到来时所需求的各项业务 数据层专…

Polar靶场web(三)

期待得到某一件事物的时候,才是最美好的。 签到 发现不能提交,看一下f12 发现提交按钮被禁用了,且最大输入9个字符,我们可以改一下。 现随便提交一个发现要提交ilovejijcxy session文件包含 发现有文件包含,那先包含…

02正式学习第一天

1、windows上加载socket库 链接输入ws2_32.lib 代码code&#xff1a; #ifdef _WIN32 #include<windows.h> #else #include <sys/socket.h> #include<sys/types.h> #include<unistd.h> #include<cstring> #include<arpa/inet.h> #include…

基于Unity+Vue3通信交互的WebGL项目发布实践

基于UnityVue3通信交互的WebGL项目发布实践 实践路线 基于UnityVue3通信交互的WebGL项目发布实践问题背景准备工作解决方案项目实践小目标搭建Unity测试项目 创建Vue3测试项目运行项目验证unity和vue通信功能总结与展望 问题背景 我们最近需要把unity开发的pc项目迁移到web端&…

文心一言 VS 讯飞星火 VS chatgpt (225)-- 算法导论16.3 7题

七、推广赫夫曼算法&#xff0c;使之能生成三进制的码字(即码字由符号0、1、2组成)&#xff0c;并证明你的算法能生成最优三进制码。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 推广赫夫曼算法以生成三进制码字需要对算法进行一定的修改&#xff0c;确保在每…

阿里云国际DDoS高防如何添加网站配置?

将网站域名配置到DDoS高防后&#xff0c;DDoS高防会为网站生成一个CNAME地址&#xff0c;您需要将网站域名的DNS解析指向高防CNAME地址&#xff0c;DDoS高防才能转发业务流量为网站防御DDoS攻击。本文介绍如何添加网站配置。 注意事项 接入DDoS高防&#xff08;中国内地&#…

WPF中获取TreeView以及ListView获取其本身滚动条进行滚动

实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) TreeView:TreeViewAutomationPeer lvap new TreeViewAutomationPeer(treeView); var svap lvap.GetPattern(PatternInterface.Scroll) as ScrollViewerAutomationPeer; var scroll svap.Owner as ScrollVie…

2024最新软件测试20个基础面试题及答案

什么是软件测试&#xff1f; 答案&#xff1a;软件测试是指在预定的环境中运行程序&#xff0c;为了发现软件存在的错误、缺陷以及其他不符合要求的行为的过程。 软件测试的目的是什么&#xff1f; 答案&#xff1a;软件测试的主要目的是保证软件的质量&#xff0c;并尽可能大…