PyQt5学习笔记

来源:王铭东老师的B站教程

链接:PyQt5 快速入门_哔哩哔哩_bilibili

基本控件 

QRadioButton

​​​​​​QLineedit

#清空
xxx.clear()
#插入新内容到最右光标处
xxx.insert("内容")

布局

1. 水平布局

  1. 创建组
# hobby 主要是保证他们是一个组。
hobby_box = QGroupBox("爱好")
  1. 设置hobby_box的布局
  2. 将组中内容添加到该组的容器中
  3. 将组hobby_box添加到最外层的布局container中
# 把爱好的内容添加到容器中
container.addWidget(hobby_box)

完整代码

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGroupBox, QVBoxLayout, QHBoxLayout, QRadioButton


class MyWindow(QWidget):

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

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

        # -----创建第1个组,添加多个组件-----
        # 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)

        # -----创建第2个组,添加多个组件-----
        # 性别组
        gender_box = QGroupBox("性别")
        # 性别容器
        h_layout = QHBoxLayout()
        # 性别选项
        btn4 = QRadioButton("男")
        btn5 = QRadioButton("女")
        # 追加到性别容器中
        h_layout.addWidget(btn4)
        h_layout.addWidget(btn5)
        # 添加到 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()

2. 垂直布局

网格布局(九宫格布局)

输入框

#创建输入框
edit = QLineEdit()
#设置无输入时显示的内容
edit.setPlaceholderText("请输入内容")

完整代码: 

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLineEdit, QGridLayout


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", "6", "-", ")"],
            2: ["1", "2", "3", "*", "<-"],
            3: ["0", ".", "=", "/", "C"]
        }

        # 整体垂直布局
        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()

3. QStackedLayout: 抽屉布局

        创建抽屉布局及其所需的窗口,将窗口添加到布局器中,然后将按钮点击链接到窗口切换的事件中。其余创建最外层容器等基本操作不再赘述。

1. 创建抽屉布局和窗口

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)

2. 设定窗口函数

class Window1(QWidget):
    def __init__(self):
        super().__init__()
        QLabel("我是抽屉1要显示的内容", self)
        #非必要:设定窗口样式
        self.setStyleSheet("background-color:green;")

3. 添加事件,链接到显示界面切换。(下图是按钮)

# 给按钮添加事件(即点击后要调用的函数)
btn_press1.clicked.connect(self.btn_press1_clicked)

窗口

1. QWidget

        一般作为主窗口。当要精心设计时选用。

2. QMainWindow

        带有任务栏和状态栏的窗口。

注意与QWidget不同的点,QWidget可以将布局作为最外层,而QMainWindow必须是窗口。因此代码需要添加下面一段。

#QMainWindow需要将窗口作为最外层
widget = QWidget()
widget.setLayout(container)
self.setCentralWidget(widget)

3. QDialog    

对话框一般不应该作为主窗口的存在,而是通过点击操作弹出,起到提示作用

信号与槽

对象.信号.connect(槽函数)

信号(singal)

自定义信号

        必须定义在函数外的类中(建议放在类起始处)。

步骤:

# 1. 声明一个信号 只能放在函数的外面
my_signal = pyqtSignal(str)

# 2. 绑定信号和槽
self.my_signal.connect(self.my_slot)

# 3. 自定义函数
def my_slot(self, msg):

槽(slot)

槽实际上是一个函数, 当信号发射出来后,会执行与之绑定的槽函数。

Qt Designer

基本框架

        利用Qt Designer设计界面与手写的类似,区别是要加载ui文件,而导入ui文件则需要导入PyQt5 中的 uic 模块,如下面程序所示:

import sys

from PyQt5.QtWidgets import QApplication
from PyQt5 import uic

if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    #加载ui
    ui = uic.loadUi("./test.ui")

    ui.show()

    app.exec()

可以把uic.loadUi放在窗口类中:

# 模板
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic


class MyWindow(QWidget):

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

    def init_ui(self):
        self.ui = uic.loadUi("./login.ui")
        ...

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

    w = MyWindow()
    w.ui.show()
    app.exec()

调用控件

        将控件赋给一个已命名的变量 ,该变量即可调用控件的各种属性,例如:

self.user_name_qwidget = self.ui.lineEdit  # 用户名输入框
user_name = self.user_name_qwidget.text()
if user_name == "admin"
    ...

在PyQt中使用多线程

线程与进程

        多线程是属于同一个进程中的,当一个进程关闭后,所有的线程都会被关闭。因此pyqt使用多线程来管理。

用法

在pyqt中使用多线程需要以下步骤:

  • 创建一个线程的类,并在run()函数下编写运行的代码
  • 创建线程
  • 开始线程

        首先是创建一个继承于QThread的类:

class MyThread(QThread):
    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(10):
            print("是MyThread线程中执行....%d" % (i + 1))
            time.sleep(1)

        然后创建并开始线程,注意:如果在子函数编写代码,这里的self不能省略,否则会导致my_thread被释放,线程运行被破坏;

self.my_thread = MyThread()  # 创建线程
self.my_thread.start()  # 开始线程

         最终的参考模板:

import sys
import time

from PyQt5 import uic
from PyQt5.Qt import QApplication, QWidget, QThread


class MyThread(QThread):
    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(10):
            time.sleep(1)


class MyWin(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.ui = uic.loadUi("./thread-1.ui")
        xxx.clicked.connect(self.xxx)  # 绑定槽函数


    def xxx(self):
        self.my_thread = MyThread()  # 创建线程
        self.my_thread.start()  # 开始线程


if __name__ == "__main__":
    app = QApplication(sys.argv)
    myshow = MyWin()
    myshow.ui.show()
    app.exec()

你可能感兴趣的:(qt,学习,笔记)