一文掌握python图形界面开发PyQt6--(一)基本操作、控件、信号与槽、常用控件、布局管理、事件处理、文件对话框

目录

 

1、 PyQt6 简介

2. 创建一个基本窗口

3. 添加控件

4. 信号与槽

5. 基本布局管理

1、水平布局示例:

2、网格布局示例

6. PyQt6 常用控件及其用法

6.1 QLabel(显示文本或图像)

1)显示文本

2)显示图像

6.2 QPushButton(按钮)

6.3 QLineEdit(文本输入框)

6.4 QComboBox(下拉列表框)

6.5 QCheckBox 和 QRadioButton

1)QCheckBox ,复选框

2)QRadioButton,单选按钮

6.6 QSlider(调整数值范围和显示进度) 和 QProgressBar(显示某个任务的完成进度)

7. 布局管理器

7.1 QVBoxLayout 和 QHBoxLayout

7.2 QGridLayout

7.3 QFormLayout

8. 事件处理和信号与槽

8.1 事件处理

8.2 自定义信号与槽

9. 文件对话框

9.1 打开文件对话框

1)使用原生对话框

2)不使用原生对话框

9.2 保存文件对话框

1)使用原生对话框

2)不使用原生对话框


1、 PyQt6 简介

PyQt6 是 Qt 6 框架的 Python 绑定,它提供了对 Qt 的所有核心功能的访问,包括窗口管理、UI 控件、事件处理等。PyQt6 是一个跨平台工具,支持 Windows、MacOS 和 Linux 系统,可以用来开发桌面应用、数据可视化、游戏界面等多种类型的图形界面应用。

安装 PyQt6:

要开始使用 PyQt6,首先需要安装它。可以通过 pip 来安装:

pip install PyQt6

安装完成后,你就可以开始编写 PyQt6 应用了。

2. 创建一个基本窗口

我们从一个最简单的窗口开始。PyQt6 提供了 QWidget 类作为所有 GUI 控件的基类,而 QMainWindow 类用于创建主窗口。

下面是一个创建简单窗口的代码示例:

import sys
from PyQt6.QtWidgets import QApplication, QWidget

# 创建一个简单的窗口
class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("pyqt6 基本窗口")
        # 100:窗口左上角的x坐标,即窗口在屏幕上的水平位置。值为100意味着窗口距离屏幕左边缘100像素。
        # 200:窗口左上角的y坐标,即窗口在屏幕上的垂直位置。值为200意味着窗口距离屏幕顶部200像素。
        # 400:窗口的宽度,单位为像素。在此例中,窗口的宽度是400像素。
        # 300:窗口的高度,单位为像素。在此例中,窗口的高度是300像素。
        self.setGeometry(100, 100, 400, 300)

def main():
    app = QApplication(sys.argv)  # 创建应用对象
    window = MyWindow()  # 创建窗口对象
    window.show()  # 显示窗口
    sys.exit(app.exec())  # 启动事件循环

if __name__ == '__main__':
    main()

代码解读:

  1. QApplication(sys.argv):每个 PyQt 应用都需要一个 QApplication 实例来管理应用的控制流和主要设置。
  2. QWidget 是 PyQt6 中所有控件的基类。我们通过继承 QWidget 创建了一个自定义窗口类 MyWindow,并在其中设置了窗口标题和窗口大小。
  3. show() 用于显示窗口,exec() 启动应用的事件循环,确保应用能够响应用户操作。

运行上面的代码,将看到一个简单的窗口弹出。

 

3. 添加控件

PyQt6 提供了许多常见的 UI 控件,如按钮、文本框、标签等。通过布局管理器和控件将界面进行组合。

例如,下面的代码展示了如何创建一个简单的窗口,包含一个按钮和一个标签:

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt6 控件示例")
        self.setGeometry(100, 100, 300, 200)

        # 创建控件
        self.label = QLabel("Hello, PyQt6!", self)
        self.button = QPushButton("点击我", self)

        # 创建垂直布局器
        layout = QVBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.button)

        # 设置窗口的布局
        self.setLayout(layout)

        # 连接按钮点击信号
        self.button.clicked.connect(self.on_click)

    def on_click(self):
        self.label.setText("按钮已点击!")

def main():
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec())

if __name__ == '__main__':
    main()

代码解读:

  • QLabel 用来显示文本,QPushButton 用来创建按钮。
  • QVBoxLayout 是一种布局管理器,能够将控件垂直排列(自动布局)。我们通过 layout.addWidget() 将控件添加到布局中。
  • self.button.clicked.connect(self.on_click) 将按钮的点击事件(clicked 信号)连接到 on_click 方法。当按钮被点击时,on_click 方法会改变标签的文本。

增加一个退出点击事件:


import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QMessageBox

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.title = 'PyQt6 Window'
        self.left = 100
        self.top = 100
        self.width = 640
        self.height = 480
        self.init_ui()
    def init_ui(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        # 创建控件
        self.label = QLabel('Hello, pyqt6:', self)
        self.label2 = QLabel('请输入你的名字:', self)
        self.label3 = QLabel('你好,', self)
        self.button = QPushButton('点击我', self)
        self.button2 = QPushButton('退出', self)

        # 创建垂直布局器
        layout = QVBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.label2)
        layout.addWidget(self.label3)
        layout.addWidget(self.button)
        layout.addWidget(self.button2)

        # 设置窗口的布局
        self.setLayout(layout)

        # 连接按钮点击信号
        self.button.clicked.connect(self.on_click)

        self.button2.clicked.connect(self.on_exit)

    def on_click(self):
        self.label.setText('你按钮已经被点击了!')

    def on_exit(self):
        reply = QMessageBox.question(
            self, '退出', '确认退出吗?',
            QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
            QMessageBox.StandardButton.No)
        if reply == QMessageBox.StandardButton.Yes:
            QApplication.quit()
        else:
            print('取消退出')

def main():
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

4. 信号与槽

在 PyQt6 中,信号与槽是事件处理的核心机制。信号是由某些事件触发的消息,比如按钮被点击、文本框内容发生变化等;槽是响应信号的函数。当信号被发出时,连接到该信号的槽会自动执行。

在前面的代码中已经用到过信号(connect发送信号)与槽(例如按钮点击事件)。这里再简单解释一下:

self.button.clicked.connect(self.on_click)

上面的代码表示当按钮被点击时,on_click 方法将会被执行(on_click 方法就是槽)。可以为每个控件绑定不同的信号与槽,创建交互丰富的应用。

5. 基本布局管理

布局管理器是 PyQt 中用于自动排列控件的位置和大小的工具。除了 QVBoxLayout(垂直布局),PyQt6 还提供了其他布局管理器,如 QHBoxLayout(水平布局)、QGridLayout(网格布局)等。

1、水平布局示例:

import sys
from PyQt6.QtWidgets import QHBoxLayout, QLineEdit, QPushButton, QWidget, QApplication

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("水平布局示例")
        self.setGeometry(100, 100, 300, 100)

        # 创建控件
        self.line_edit = QLineEdit(self)  # 单行输入框
        self.button = QPushButton("提交", self)

        # 创建水平布局器
        layout = QHBoxLayout()
        layout.addWidget(self.line_edit)
        layout.addWidget(self.button)

        # 设置布局
        self.setLayout(layout)

def main():
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec())

if __name__ == '__main__':
    main()

代码解读:

  • QHBoxLayout 会将控件水平排列,适合于在一行中展示多个控件。

2、网格布局示例

import sys
from PyQt6.QtWidgets import (
    QApplication,
    QWidget,
    QLabel,
    QLineEdit,
    QPushButton,
    QGridLayout,
)


class GridLayoutExample(QWidget):
    def __init__(self):
        super().__init__()

        self.init_ui()

    def init_ui(self):
        # 设置窗口标题
        self.setWindowTitle("PyQt6 网格布局示例")

        # 创建一个网格布局
        grid = QGridLayout()

        # 添加标签和输入框
        grid.addWidget(QLabel("姓名:"), 0, 0)  # 在第0行第0列添加标签
        grid.addWidget(QLineEdit(), 0, 1)    # 在第0行第1列添加输入框

        grid.addWidget(QLabel("邮箱:"), 1, 0)  # 在第1行第0列添加标签
        grid.addWidget(QLineEdit(), 1, 1)    # 在第1行第1列添加输入框

        # 添加按钮
        grid.addWidget(QPushButton("确定"), 2, 0)  # 在第2行第0列添加按钮
        grid.addWidget(QPushButton("取消"), 2, 1)  # 在第2行第1列添加按钮

        # 设置窗口布局
        self.setLayout(grid)


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

    # 创建窗口实例
    window = GridLayoutExample()
    window.resize(300, 150)  # 设置窗口大小
    window.show()            # 显示窗口

    sys.exit(app.exec())
  • QGridLayout

    • addWidget(widget, row, column):将控件添加到网格布局中的指定位置。
    • 行和列从 0 开始编号。
  • 控件的排列

    • 第一行放置了一个标签和一个输入框。
    • 第二行放置了另一个标签和输入框。
    • 第三行放置了两个按钮,分别位于不同的列。

6. PyQt6 常用控件及其用法

6.1 QLabel(显示文本或图像

QLabel 是一个用于显示文本或图像的控件。它通常用于显示静态信息,比如应用程序的标题、图标等。

1)显示文本
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QFont


class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        # 创建一个QLabel实例,并设置其文本内容
        label = QLabel('Hello, PyQt6!', self)
        label.setAlignment(Qt.AlignmentFlag.AlignCenter)  # 设置文本居中
        label.setFont(QFont('Arial', 20, QFont.Weight.Bold))  # 设置文本加粗
        label.setWordWrap(True)  # 设置文本自动换行

        # 创建一个垂直布局并添加QLabel到这个布局中
        vbox = QVBoxLayout()
        vbox.addWidget(label)

        # 设置窗口的布局
        self.setLayout(vbox)

        # 设置窗口的一些属性
        self.setWindowTitle('QLabel示例 - 文本')
        self.setGeometry(300, 300, 300, 200)  # x, y, width, height

        # 显示窗口
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app
### 回答1: "Keil5显示No J-Link found"的错误信息通常意味着Keil5无法找到连接到计算机的J-Link仿真器。 要解决此问题,您可以尝试以下步骤: 1. 确保J-Link仿真器已正确连接到计算机并已安装相应的驱动程序。 2. 确保您正在使用最新版本的Keil5,并已正确配置它以使用J-Link仿真器。您可以尝试重新安装Keil5并检查其配置。 3. 如果以上步骤都无法解决问题,您可以尝试更新J-Link仿真器的固件版本。您可以在Segger官网上下载最新版本的固件并按照说明进行更新。 希望这些步骤能帮助您解决问题。 ### 回答2: Keil是用于嵌入式开发的常见软件工具,在使用Keil进行编程和调试时,有时会出现“No J-Link found”的提示。这种情况的发生可能是由于以下原因造成的: 1.连接不正确:连接错误是常见的原因之,当J-Link设备连接不正确时,Keil会提示“No J-Link found”。在这种情况下,应该首先检查J-Link和设备之间的连接是否正确,并重新连接次试试是否可以解决问题。 2.J-Link驱动程序未安装或驱动程序不完整:在使用Keil进行开发时,需要安装J-Link驱动程序,如果驱动程序未正确安装或驱动程序不完整,那么Keil也会提示“No J-Link found”错误。解决该问题的方法是重新安装J-Link驱动程序。 3.权限问题:有时用户可能没有权限运行J-Link驱动程序或Keil软件,这也可能导致“No J-Link found”错误。解决方法是以管理员身份运行软件或驱动程序。 4.硬件问题:最后可能导致“No J-Link found”错误的可能原因是硬件问题。在这种情况下,需要检查J-Link本身是否正常工作,检查设备连接的线缆是否被损坏,或检查接口是否损坏。 总结下,出现“No J-Link found”错误是很常见的,但是如果仔细检查并在遵循正确步骤的情况下进行操作,则可以轻松解决该问题。 ### 回答3: Keil5是常用的嵌入式开发工具,它可以帮助开发者完成各种嵌入式软件开发任务。当Keil5显示“No J-Link Found”时,通常意味着它无法找到可以连接到计算机的J-Link设备。J-Link是种流行的硬件调试器和编程器,它被广泛应用于嵌入式系统开发。 出现该问题的原因可能有以下几个方面: 1. 连接故障:检查J-Link设备是否正确连接电脑,并确认USB端口是否正常工作。 2. 驱动问题:确认电脑上是否已经安装了J-Link驱动程序,如果没有,请到官方网站下载安装。 3. Keil5配置问题:检查Keil5的“Options for Target”设置中,Debug选项卡中的“Use”选择是否为“J-Link / J-Trace”,如果不是需要修改为正确的选项。 4. J-Link设备被占用:当多个应用程序使用J-Link时,会发生冲突,导致Keil5无法找到J-Link设备。此时需要关闭其他占用J-Link的应用程序。 5. J-Link设备损坏:如果奥德赛J-Link设备损坏,也会导致Keil5无法找到这个设备。 对于以上几种问题,有些解决方法可以尝试: 1. 首先确认J-Link设备是否正确连接,并确认USB端口是否正常工作。如果不行,可以尝试更换USB端口和数据线。 2. 下载并安装J-Link驱动程序,并按照官方说明进行安装配置操作。 3. 进入Keil5的“Options for Target”设置中,Debug选项卡中的“Use”选择项进行配置。此时需要选择正确的选项,即“J-Link / J-Trace”。 4. 关闭其他占用J-Link的应用程序,避免出现冲突。可以通过任务管理器关闭其他进程。 5. 如果设备损坏,则需要更换新的J-Link设备。 在以上操作完成后,可以重启计算机并重新运行Keil5软件,再次检查是否出现“No J-Link Found”问题。如果问题仍然存在,可以考虑联系J-Link设备厂家或Keil5技术支持中心,获取进步的技术支持和解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值