PyQT5

参考资料

https://doc.itprojects.cn/0001.zhishi/python.0008.pyqt5rumen/index.html

1 下载安装PyQT5

1.1 创建新的虚拟环境

为方便PyQT5程序打包,可新建虚拟环境

conda create -n your_env_name python=x.x

1.2 安装PyQT5

pip install pyqt5

1.3 检测代码

# 如果执行成功,没有任何错误提示,则表明环境搭建成功
from PyQt5 import QtWidgets

# 查看PyQt版本
from PyQt5.QtCore import *
print(QT_VERSION_STR)

2 第一个PyQt程序

# -*- coding: UTF-8 -*-
# 导入需要的包
from PyQt5.Qt import *
import sys

# 创建应用程序对象
app = QApplication(sys.argv)

# 控件操作
window = QWidget()
window.setWindowTitle("123")
window.resize(500, 500)
window.move(400, 200)

label = QLabel(window)
label.setText("Hello World")
label.move(200, 200)

window.show()

# 开始执行应用程序,并进入消息循环
sys.exit(app.exec_())

在这里插入图片描述

3 按钮控件 QPushButton

"""
=============================================
    Time     :
    Auther   :
    File     :
    Function : 控件 QPushButton
=============================================
"""
import sys

from PyQt5.QtWidgets import *

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

    w = QWidget()

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

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

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

    # 展示窗口
    w.show()

    # 程序运行循环等待状态
    app.exec()

4 文本控件 QLabel

"""
=============================================
    Time     :
    Auther   :
    File     :
    Function : 控件 QLabel
=============================================
"""
import sys

from PyQt5.QtWidgets import *

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

    w = QWidget()

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


    # # 下面创建一个Label,然后调用方法指定父类
    # label = QLabel("账号")
    # # 设置父对象
    # label.setParent(w)


    # 下面创建一个Label(纯文本),在创建的时候指定了父对象
    label = QLabel("账号", w)
    # 显示位置与大小: x,y,w,h
    label.setGeometry(20, 20, 30, 30)

    # 展示窗口
    w.show()

    # 程序运行循环等待状态
    app.exec()

5 文本框控件 QLineEdit

"""
=============================================
    Time     :
    Auther   :
    File     :
    Function : 文本框控件 QLineEdit
=============================================
"""
import sys

from PyQt5.QtWidgets import *

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

    w = QWidget()

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

    # 纯文本
    label = QLabel("账号", w)
    label.setGeometry(20, 20, 30, 20)

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

    # 在窗口里面添加控件
    btn = QPushButton('注册', w)
    btn.setGeometry(50, 80, 70, 30)

    # 展示窗口
    w.show()

    # 程序运行循环等待状态
    app.exec()

在这里插入图片描述

6 调整窗口的大小和位置

"""
=============================================
    Time     :
    Auther   :
    File     :
    Function : 调整窗口的大小和位置
=============================================
"""
import sys

from PyQt5.QtWidgets import *

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

    w = QWidget()

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

    # 窗口的大小
    w.resize(300, 200)

    # 将窗口设置在屏幕的左上角
    # w.move(0, 0)

    # 调整窗口在屏幕中央显示
    center_pointer = QDesktopWidget().availableGeometry().center()
    x = center_pointer.x()
    y = center_pointer.y()
    # w.move(x, y)
    # w.move(x-150, y-150)
    print(w.frameGeometry())
    print(w.frameGeometry().getRect())
    print(type(w.frameGeometry().getRect()))
    old_x, old_y, width, height = w.frameGeometry().getRect()
    w.move(int(x-width/2), int(y-height/2))


    # 展示窗口
    w.show()

    # 程序运行循环等待状态
    app.exec()

在这里插入图片描述

7 设置窗口图标

可以下载icon图标网站:
https://www.easyicon.cc/
https://www.iconfont.cn/

"""
=============================================
    Time     :
    Auther   :
    File     :
    Function : 设置窗口图标
=============================================
"""
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

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

    w = QWidget()

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

    # 设置图标
    w.setWindowIcon(QIcon('棒棒糖.png'))

    # 展示窗口
    w.show()

    # 程序运行循环等待状态
    app.exec()

在这里插入图片描述

8 垂直布局 BoxLayout

"""
=============================================
    Time     :
    Auther   :
    File     :
    Function : 垂直布局
=============================================
"""
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt

import warnings

warnings.filterwarnings("ignore", category = DeprecationWarning)

class MyWindow(QWidget):
    def __init__(self):
        # 切记一定要调用父类的__init__方法,因为它里面有很多对UI空间的初始化操作
        super().__init__()

        # 设置大小
        self.resize(300, 300)
        # 设置标题
        self.setWindowTitle("垂直布局")

        # 垂直布局
        layout = QVBoxLayout()

        # 作用是在布局器中增加一个伸缩量,里面的参数表示QSpacerItem的个数,默认值为零
        # 会将你放在layout中的空间压缩成默认的大小
        # 下面的比试 1:1:1:2
        # layout.addStretch(1)

        # 按钮1
        btn1 = QPushButton("按钮1")
        # 添加到布局器中
        # layout.addWidget(btn1, Qt.AlignmentFlag.AlignTop)
        layout.addWidget(btn1)

        # 按钮2
        btn2 = QPushButton("按钮2")
        # 添加到布局器中
        layout.addWidget(btn2)

        # 按钮3
        btn3 = QPushButton("按钮3")
        # 添加到布局器中
        layout.addWidget(btn3)

        # 添加一个伸缩器(理解为一个弹簧)
        # layout.addStretch()

        # 让当前的窗口使用这个排列的规则(布局器)
        self.setLayout(layout)


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

    # 创建一个QWidget子类
    w = MyWindow()
    w.show()

    app.exec()

在这里插入图片描述

9 水平布局 BoxLayout

"""
=============================================
    Time     :
    Auther   :
    File     :
    Function : 水平布局
=============================================
"""
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt

import warnings

warnings.filterwarnings("ignore", category = DeprecationWarning)

class MyWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        # 最外层的垂直布局,包含两部分:爱好和性别
        container = QVBoxLayout()

        # 创建第一个组,添加多个组件
        # hobby 主要是保证他们是一个组
        hobby_box = QGroupBox("爱好")
        # v_layout 保证三个爱好是垂直摆放
        v_layout = QVBoxLayout()
        btn1 = QRadioButton("抽烟")
        btn2 = QRadioButton("喝酒")
        btn3 = QRadioButton("烫头")
        # 添加到v_layout中
        v_layout.addWidget(btn1)
        v_layout.addWidget(btn2)
        v_layout.addWidget(btn3)
        # 把v_layout添加到hobby_box中
        hobby_box.setLayout(v_layout)

        # 创建第二个组,添加多个组件
        # gender 主要是保证他们是一个组
        gender_box = QGroupBox("性别")
        # v_layout 保证三个爱好是垂直摆放
        h_layout = QHBoxLayout()
        btn4 = QRadioButton("男")
        btn5 = QRadioButton("女")
        # 添加到v_layout中
        h_layout.addWidget(btn4)
        h_layout.addWidget(btn5)
        # 把h_layout添加到gender_box中
        gender_box.setLayout(h_layout)

        # 把爱好的内容添加到容器中
        container.addWidget(hobby_box)
        # 把爱好的内容添加到容器中
        container.addWidget(gender_box)

        # 设置窗口显示的内容是最外层容器
        self.setLayout(container)

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

    w = MyWindow()
    w.show()

    app.exec()

在这里插入图片描述

10 布局器 GridLayout

"""
=============================================
    Time     :
    Auther   :
    File     :
    Function : 布局器·九宫格
=============================================
"""
import sys
from PyQt5.QtWidgets import *

import warnings

warnings.filterwarnings("ignore", category = DeprecationWarning)

class MyWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle("计算器")

        # 准备数据
        data = {
            0: ["7", "8", "9", "+", "("],
            1: ["4", "5", "9", "+", ")"],
            2: ["7", "8", "9", "+", "("],
            3: ["7", "8", "9", "+", "("]
        }

        # 整体垂直布局
        layout = QVBoxLayout()

        # 输入框
        edit = QLineEdit()
        edit.setPlaceholderText("请输入内容")
        # 把输入框添加到容器中
        layout.addWidget(edit)

        # 网格布局
        grid = QGridLayout()

        # 循环创建追加进去
        for line_number, line_data in data.items():
            # 此时line_number是第几行,line_data是当前行的数据
            for col_number, number in enumerate(line_data):
                # 此时col_number,是第几列,number是要显示的符号
                btn = QPushButton(number)
                # grid.addWidget(btn)
                grid.addWidget(btn, line_number, col_number)

        # 把网格布局追加到容器中
        layout.addLayout(grid)

        self.setLayout(layout)


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

    w = MyWindow()
    w.show()

    app.exec()

在这里插入图片描述

11 布局器3 FormLayout

TODO

12 布局器4 StackedLayout

抽屉布局

"""
=============================================
    Time     :
    Auther   :
    File     :
    Function : 布局器4 StackedLayout
=============================================
"""
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

class Window1(QWidget):
    def __init__(self):
        super().__init__()
        QLabel("我是抽屉一要显示的内容", self)
        self.setStyleSheet("background-color:green;")

class Window2(QWidget):
    def __init__(self):
        super().__init__()
        QLabel("我是抽屉二要显示的内容", self)
        self.setStyleSheet("background-color:red;")

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.create_stacked_layout()
        self.init_ui()

    def create_stacked_layout(self):
        # 创建堆叠(抽屉)布局
        self.stacked_layout = QStackedLayout()
        # 创建单独的Widget
        win1 = Window1()
        win2 = Window2()
        # 将创建的2个Widget添加到抽屉布局器中
        self.stacked_layout.addWidget(win1)
        self.stacked_layout.addWidget(win2)

    def init_ui(self):
        # 设置Widget大小以及固定高度
        self.setFixedSize(300, 200)

        # 1.创建整体的布局器
        container = QVBoxLayout()

        # 2.创建1个要显示具体内容的子Widget
        widget = QWidget()
        widget.setLayout(self.stacked_layout)
        widget.setStyleSheet("background-color:gray;")

        # 3.创建2个按钮,用来点击进行切换抽屉布局器中的Widget
        btn_press1 = QPushButton("抽屉一")
        btn_press2 = QPushButton("抽屉二")
        # 给按钮添加事件(点击后要调用的函数)
        btn_press1.clicked.connect(self.btn_press1_clicked)
        btn_press2.clicked.connect(self.btn_press2_clicked)

        # 将需要展示的空间添加到布局器中
        container.addWidget(widget)
        container.addWidget(btn_press1)
        container.addWidget(btn_press2)

        # 5.设置当前要显示的Widget,从而能够显示这个布局器中的控件
        self.setLayout(container)

    def btn_press1_clicked(self):
        # 设置抽屉布局器的当前索引值。即可切换显示哪个widget
        self.stacked_layout.setCurrentIndex(0)

    def btn_press2_clicked(self):
        # 设置抽屉布局器的当前索引值。即可切换显示哪个widget
        self.stacked_layout.setCurrentIndex(1)

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

    win = MyWindow()
    win.show()

    app.exec()

在这里插入图片描述

13 信号与槽

14 Qt Designer

"""
=============================================
    Time     :
    Auther   :
    File     :
    Function : 动态加载UI文件
=============================================
"""
import sys

from PyQt5.QtWidgets import *
from PyQt5 import uic

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

    ui = uic.loadUi("untitled.ui")
    
    # 展示窗口
    ui.show()

    app.exec()
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值