Skip to content

PyQt基本UI

一、第一个PyQt程序

1. 程序源码

python
import sys
from PyQt5.QtWidgets import QApplication,QWidget

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

    w = QWidget()	# 创建窗口对象

    # 设置窗口标题
    w.setWindowTitle('第一个PyQt程序')

    # 展示窗口
    w.show()

    # 程序进入循环等待状态
    app.exec_()

image-20250611215542538

2. 源码讲解

QQ20250611-211252

3. 关于Python中的sys.argv

sys.argv 是 Python 中用于获取命令行参数的一个列表,它是 sys 模块的一个重要属性。

基本概念

  1. 定义sys.argv 是一个包含命令行参数的列表
  2. 作用:让 Python 脚本能够接收并处理从命令行传入的参数
  3. 模块:需要先导入 sys 模块才能使用

列表内容

sys.argv 列表包含以下元素:

  • sys.argv[0]:脚本名称(第一个元素总是脚本本身的名称)
  • sys.argv[1]:第一个命令行参数
  • sys.argv[2]:第二个命令行参数
  • 以此类推...

基本用法示例

python
import sys

print("脚本名称:", sys.argv[0])
print("参数个数:", len(sys.argv) - 1)
print("参数列表:", sys.argv[1:])

QQ20250611-212301

实际应用示例

示例1:简单参数传递

python
# test.py
import sys

if len(sys.argv) > 1:
    print(f"Hello, {sys.argv[1]}!")
else:
    print("Hello, World!")
  1. 直接运行

输出:

shell
Hello, World!
  1. 加上参数后运行
python
python test.py Alice

输出:

shell
Hello, Alice!

示例2:计算器功能

python
# test.py
import sys

if len(sys.argv) != 4:
    print("用法: python test.py <数字1> <操作符> <数字2>")
    sys.exit(1)

num1 = float(sys.argv[1])
op = sys.argv[2]
num2 = float(sys.argv[3])

if op == '+':
    result = num1 + num2
elif op == '-':
    result = num1 - num2
elif op == '*':
    result = num1 * num2
elif op == '/':
    if num2 == 0:
        print("除数不能为0!")
        sys.exit(1)
    result = num1 / num2
else:
    print("无效的操作符")
    sys.exit(1)

print(f"结果: {result}")

运行方式:

shell
python test.py 5 '*' 3

输出:

shell
结果: 15.0

注意事项

  1. 参数类型:所有参数都以字符串形式传入,需要根据需要进行类型转换
  2. 参数检查:使用前应先检查参数数量和格式
  3. 错误处理:对于用户输入要做好异常处理
  4. 索引错误:访问不存在的索引会引发 IndexError
  5. 模块导入:必须首先 import sys

二、模块介绍

1. 常用模块

PyQt中有非常多的功能模块,开发中最常用的功能模块主要有三个

  • QtCore:包含了核心的非GUI的功能,主要和时间、文件和文件夹、各种数据、流、URLs、mime类文件、进程与线程一起使用
  • QtGui:包含了窗口系统、事件处理、2D图像、基本绘画、字体和文件类
  • QtWidgets:包含了一系列创建桌面应用程序的UI元素

2. 学习方式

需要什么功能就去查阅与它相关的api或者查阅别人分享的心得,这是学习最快的方式

PyQt所有模块参考文档的官网地址

C++具体实现的API文档地址

三、基本UI

窗口内的所有控件,若想在窗口中显示,都需要表示它的父亲是谁,而不能直接使用show函数显示

1. 按钮

  • 按钮对应的控件名称为QPushButton,位于PyQt5.QtWidgets里面

程序源码

python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

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

    w = QWidget()

    # 设置窗口标题
    w.setWindowTitle('第一个PyQt程序')

    # 在窗口里面添加控件
    # 按钮
    btn = QPushButton("按钮")

    # 设置按钮的父类是当前窗口,等于添加按钮到窗口中显示
    btn.setParent(w)

    # 展示窗口
    w.show()

    # 程序进入循环等待状态
    app.exec_()

源码讲解

QQ20250611-224755

2. 标签

  • 标签控件名称为QLabel,位于PyQt5.QtWidgets里面
  • 标签控件仅仅作为标识显示而已,类似输入内容前的一段提示(账号、密码)

程序源码

python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel

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

    w = QWidget()

    # 设置窗口标题
    w.setWindowTitle('第一个PyQt程序')

    # 在窗口里面添加控件
    # 标签
    label = QLabel("账号:")

    # 设置父对象
    label.setParent(w)

    # 展示窗口
    w.show()

    # 程序进入循环等待状态
    app.exec_()

源码讲解

QQ20250611-230528

3. 输入框

  • 输入框的控件名为QLineEdit,位于PyQt5.QWidgets里面

程序源码

python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit

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

    w = QWidget()

    # 设置窗口标题
    w.setWindowTitle('第一个PyQt程序')

    # 文本框
    edit = QLineEdit()
    edit.setPlaceholderText("请输入账号")

    edit.setParent(w)

    # 展示窗口
    w.show()

    # 程序进入循环等待状态
    app.exec_()

源码讲解

QQ20250612-120427

优化说明

  • 可以在创建控件的时候就进行父类绑定

程序源码

python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit

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

    w = QWidget()

    # 设置窗口标题
    w.setWindowTitle('第一个PyQt程序')

    # 在窗口里面添加控件
    # 文本框
    label = QLineEdit(w)
    label.setPlaceholderText("请输入账号")

    # 设置位置与大小(x,y,w,h)
    label.setGeometry(20,20,400,20)

    # 展示窗口
    w.show()

    # 程序进入循环等待状态
    app.exec_()

源码讲解

QQ20250612-121410

整体基础实战

  • 做一个简单的注册GUI

程序源码

python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton

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

    w = QWidget()

    # 设置窗口标题
    w.setWindowTitle('第一个PyQt程序')

    # 在窗口里面添加控件
    # 标签
    label = QLabel("账号:",w)
    label.setGeometry(20,20,40,20)

    # 文本框
    edit = QLineEdit(w)
    edit.setPlaceholderText("请输入账号")
    edit.setGeometry(65,20,300,20)

    # 按钮
    btn = QPushButton("注册",w)
    btn.setGeometry(182,60,40,25)

    # 展示窗口
    w.show()

    # 程序进入循环等待状态
    app.exec_()

源码讲解

QQ20250612-115500

四、窗口

1. 窗口大小调整

程序源码

python
import sys
from PyQt5.QtWidgets import QApplication, QWidget

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

    w = QWidget()

    # 设置窗口标题
    w.setWindowTitle('第一个PyQt程序')

    # 窗口大小设置(w,h)
    w.resize(400,300)

    # 展示窗口
    w.show()

    # 程序进入循环等待状态
    app.exec_()

源码讲解

QQ20250612-122835

2. 窗口位置调整

将窗口放置到某个坐标

注意:是将窗口的开始位置作为移动的坐标

程序源码

python
import sys
from PyQt5.QtWidgets import QApplication, QWidget

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

    w = QWidget()

    # 设置窗口标题
    w.setWindowTitle('第一个PyQt程序')

    # 窗口大小设置(w,h)
    w.resize(400,300)

    # 将窗口放置到某个坐标(x,y),如放置到左上角
    w.move(0,0)

    # 展示窗口
    w.show()

    # 程序进入循环等待状态
    app.exec_()

源码讲解

QQ20250612-124202

将窗口放置到中央位置

  • 基础版(窗口大小变动的话,计算数值需要手动跟着变动)

程序源码

python
import sys

from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget

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

    w = QWidget()

    # 设置窗口标题
    w.setWindowTitle('第一个PyQt程序')

    # 窗口大小设置(w,h)
    w.resize(400,300)

    # 调整窗口在屏幕中央显示
    center_pointer = QDesktopWidget().availableGeometry().center()
    # print(center_pointer)
    # PyQt5.QtCore.QPoint(959, 509)
    x = center_pointer.x()
    y = center_pointer.y()

    x = x - 200
    y = y - 150

    # 移动窗口至得到的中央坐标
    w.move(x,y)

    # 展示窗口
    w.show()

    # 程序进入循环等待状态
    app.exec_()

源码讲解

QQ20250612-132148

  • 进阶版(窗口大小变动的话,计算数值会自动跟着变动)

程序源码

python
import sys

from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget

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

    w = QWidget()

    # 设置窗口标题
    w.setWindowTitle('第一个PyQt程序')

    # 窗口大小设置(w,h)
    w.resize(400,300)

    # 获取可用屏幕中央坐标
    center_pointer = QDesktopWidget().availableGeometry().center()
    x = center_pointer.x()
    y = center_pointer.y()

    # print(w.frameGeometry())
    # PyQt5.QtCore.QRect(0, 0, 400, 300)
# 打印窗口的位置及大小(x,y,w,h),但是(x,y)如果没有设置过或者使用move移动过,
# 值都会默认识别为(0,0),尽管我们肉眼看到它根本就没在(0,0)坐标上,可能是PyQt的bug
    # print(w.frameGeometry().getRect())
    # (0, 0, 400, 300)
    # 获取窗口位置及大小数据的元组
    # print(type(w.frameGeometry().getRect()))
    # <class 'tuple'>

    # 解包提取窗口的位置及大小数据元组
    x_old , y_old , w_old , h_old = w.frameGeometry().getRect()
    # print(x_old,y_old,w_old,h_old)
    # 0 0 400 300

    x = x - w_old/2
    y = y - h_old/2



    # 展示窗口
    w.show()

    # 程序进入循环等待状态
    app.exec_()

源码讲解

QQ20250612-153333

3. 设置窗口的图标

图标获取途径

  1. 使用已有图片进行在线转换为图标
  2. 在线网站搜索你想要的图标

程序源码

python
import sys

from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget

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

    w = QWidget()

    # 设置窗口标题
    w.setWindowTitle('第一个PyQt程序')

    # 设置窗口图标
    w.setWindowIcon(QIcon('logo.ico'))

    # 展示窗口
    w.show()

    # 程序进入循环等待状态
    app.exec_()

源码讲解

QQ20250612-155953

4. 隐藏窗口标题栏

注意:默认的标题栏较为简陋,一般在实际开发中为满足更为多功能、更为美观的"标题栏",一般选择将默认标题栏进行隐藏,由开发者自行构造自己较为满意的标题栏及功能

程序源码

python
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import Qt

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

    w = QWidget()

    # 设置窗口标志,隐藏标题栏
    w.setWindowFlags(Qt.FramelessWindowHint)

    # 展示窗口
    w.show()

    # 程序进入循环等待状态
    app.exec_()

运行结果展示

image-20250612161833980

源码讲解

QQ20250612-161428