pyqt5 各种基础组件使用方式(一)

pyqt5 各种基础组件使用方式(一)


0_FirstMainWin

import sys
from PyQt5.QtWidgets import QMainWindow,QApplication        # QMainWindow:主窗口;QApplication:创建应用程序
from PyQt5.QtGui import QIcon           # 用来添加图标

class FirstMainwin(QMainWindow):
    def __init__(self):
        super(FirstMainwin,self).__init__()

        # 设置主窗口的标题
        self.setWindowTitle("第一个主窗口应用")

        # 设置窗口的尺寸
        self.resize(400,300)

        # 状态栏
        self.status = self.statusBar()  # 获取当前的状态栏

        # 在状态栏上显示信息
        self.status.showMessage("只存在5秒的消息",5000)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setWindowIcon(QIcon("./images/Dragon.ico"))     # 设置应用程序的图标
    main_ = FirstMainwin()
    main_.show()
    sys.exit(app.exec())

显示效果如下所示:在这里插入图片描述

1_窗口居中显示


# QDesktopWidget        通过此API得到整个屏幕的尺寸
import sys
from PyQt5.QtWidgets import QMainWindow,QApplication,QDesktopWidget        # QMainWindow:主窗口;QApplication:创建应用程序 ;QDesktopWidget:用于获取桌面信息参数
from PyQt5.QtGui import QIcon           # 用来添加图标

class CenterForm(QMainWindow):
    def __init__(self):
        super(CenterForm,self).__init__()

        # 设置主窗口的标题
        self.setWindowTitle("设置窗口在桌面的位置")

        # 设置窗口的尺寸
        self.resize(400,300)

    def center(self):
        screen = QDesktopWidget().screenGeometry()      # 获取屏幕坐标
        size = self.geometry()      # 获取窗口的坐标系

        newLeft=(screen.width()-size.width())/2         # 得到居中窗口左边缘的横坐标
        newTop=(screen.height()-size.height())/2        # 得到居中窗口顶部边缘的纵坐标

        self.move(newLeft,newTop)           # 使用该方法移动窗口

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setWindowIcon(QIcon("./images/Dragon.ico"))     # 设置应用程序的图标
    main_ = CenterForm()
    main_.show()
    sys.exit(app.exec())

显示效果如下所示:
在这里插入图片描述

2_退出窗口

import sys
# QMainWindow:主窗口;QApplication:创建应用程序;QHBoxLayout:水平布局;QWidget:控件;   QPushButton:button对象类
from PyQt5.QtWidgets import QHBoxLayout,QMainWindow,QApplication,QPushButton,QWidget
from PyQt5.QtGui import QIcon           # 用来添加图标
class QuitApplication(QMainWindow):
    def __init__(self):
        super(QuitApplication,self).__init__()
        self.resize(300,120)
        self.setWindowTitle('退出应用程序')

        # 添加Button

        self.button1 = QPushButton('退出应用程序')
        # 将信号与槽关联
        self.button1.clicked.connect(self.onClick_Button)

        # 创建水平布局
        layout = QHBoxLayout()
        # 将组件添加到水平布局上
        layout.addWidget(self.button1)

        # 创建所有控件的根
        mainFrame = QWidget()
        # 将水平布局放在根上
        mainFrame.setLayout(layout)
        # 将主框架放在整个窗口上
        self.setCentralWidget(mainFrame)

    # 按钮单击事件的方法(自定义的槽)
    # 按钮单击事件的方法
    def onClick_Button(self):
        sender = self.sender()      # 通过sender()来获取button
        print(sender.text() + ' 按钮被按下')
        app = QApplication.instance()       # 得到实例,然后退出应用程序
        # 退出应用程序
        app.quit()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setWindowIcon(QIcon("./images/Dragon.ico"))  # 设置应用程序的图标
    main = QuitApplication()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

3_屏幕坐标系

import sys
# QMainWindow:主窗口;QApplication:创建应用程序;QHBoxLayout:水平布局;QWidget:控件;   QPushButton:button对象类
from PyQt5.QtWidgets import QHBoxLayout, QMainWindow, QApplication, QPushButton, QWidget
from PyQt5.QtGui import QIcon  # 用来添加图标


def onClick_button():
    print("1")
    print("widget.x()=%d" % (widget.x()))       # 250 窗口横坐标
    print("widget.y()=%d" % (widget.y()))       # 200  窗口纵坐标  含有顶部边框(即包含标签栏)
    print("widget.width()=%d" % (widget.width()))      # 300   工作区的宽度
    print("widget.height()=%d" % (widget.height()))     # 240   工作区的高度

    print("2")
    print("widget.geometry().x()=%d" % (widget.geometry().x()))
    print("widget.geometry().y()=%d" % (widget.geometry().y()))     # 不含有顶部边框(即不包含标签栏)
    print("widget.geometry().width()=%d" % (widget.geometry().width()))
    print("widget.geometry().height()=%d" % (widget.geometry().height()))

    print("3")
    print("widget.frameGeometry().x()=%d" % (widget.frameGeometry().x()))
    print("widget.frameGeometry().y()=%d" % (widget.frameGeometry().y()))  # 不含有顶部边框(即不包含标签栏)
    print("widget.frameGeometry().width()=%d" % (widget.frameGeometry().width()))
    print("widget.frameGeometry().height()=%d" % (widget.frameGeometry().height()))

app = QApplication(sys.argv)
widget = QWidget()  # 创建窗口
btn = QPushButton(widget)
btn.setText("按钮")
btn.clicked.connect(onClick_button)  # 绑定事件

btn.move(24, 52)  # 将按钮移动到相应的位置

widget.resize(300, 240)         # 设置的是工作区的尺寸
widget.move(250, 200)  # 移动窗口

widget.setWindowTitle("屏幕坐标系")
widget.show()
sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

4_设置窗口和应用程序图标


import sys
"""
    窗口的setWindowIcon方法用于设置窗口的图标,只在Windows中可用
    QApplication中的setWindowIcon方法用于设置主窗口的图标和应用程序图标,但调用了窗口的setWindowIcon方法
    QApplication中的setWindowIcon方法就只能设置应用程序图标了

"""
# QDesktopWidget        通过此API得到整个屏幕的尺寸

from PyQt5.QtWidgets import QMainWindow,QApplication,QDesktopWidget        # QMainWindow:主窗口;QApplication:创建应用程序 ;QDesktopWidget:用于获取桌面信息参数
from PyQt5.QtGui import QIcon           # 用来添加图标

class CenterForm(QMainWindow):
    def __init__(self):
        super(CenterForm,self).__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300,300,250,250)
        # 设置主窗口的标题
        self.setWindowTitle("设置窗口图标")
        # 设置窗口图标
        self.setWindowIcon(QIcon("./images/Dragon.ico"))        # 设置窗口图标方式


if __name__ == '__main__':
    app = QApplication(sys.argv)
    # app.setWindowIcon(QIcon("./images/Dragon.ico"))     # 设置应用程序的图标
    main_ = CenterForm()
    main_.show()
    sys.exit(app.exec())

显示效果如下所示:
在这里插入图片描述

5_显示空间提示信息


import sys
from PyQt5.QtWidgets import QMainWindow,QApplication,QDesktopWidget,QHBoxLayout,QWidget,QToolTip,QPushButton       # QMainWindow:主窗口;QApplication:创建应用程序 ;QDesktopWidget:用于获取桌面信息参数
from PyQt5.QtGui import QIcon           # 用来添加图标
from PyQt5.QtGui import QFont

class CenterForm(QMainWindow):
    def __init__(self):
        super(CenterForm,self).__init__()
        self.initUI()

    def initUI(self):
        # 设置字体
        QToolTip.setFont(QFont('SansSerif', 12))
        self.setToolTip("今天是<b>星期五</b>")
        self.setGeometry(300,200,200,300)
        self.resize(250,250)
        # 设置主窗口的标题
        self.setWindowTitle("设置控件提示信息")
        # 设置窗口图标
        self.setWindowIcon(QIcon("./images/Dragon.ico"))        # 设置窗口图标方式

        self.button1 = QPushButton("我的按钮")
        self.button1.setToolTip("这是一个按钮,Are you ok?")

        layout = QHBoxLayout()
        layout.addWidget(self.button1)

        mainFrame = QWidget()
        mainFrame.setLayout(layout)
        self.setCentralWidget(mainFrame)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    # app.setWindowIcon(QIcon("./images/Dragon.ico"))     # 设置应用程序的图标
    main_ = CenterForm()
    main_.show()
    sys.exit(app.exec())

显示效果如下所示:
在这里插入图片描述

6_pyqt5常用控件


"""
QLbael控件:
setAligment():设置文本的对其方式
setIndent():设置文本缩进
text():     获取文本内容
setBuddy():设置伙伴关系
setText():  设置文本内容
selectedText():返回所选择的字符
setWordWrap():设置是否允许换行

QLabel常用信号(事件):
1、当鼠标滑过QLabel控件时触发:linkHovered
2、当鼠标单击QLabel控件时触发:linkActivated

"""
import sys
from PyQt5.QtWidgets import QMainWindow,QApplication,QDesktopWidget,QVBoxLayout,QWidget,QLabel       # QMainWindow:主窗口;QApplication:创建应用程序 ;QDesktopWidget:用于获取桌面信息参数
from PyQt5.QtGui import QIcon           # 用来添加图标
from PyQt5.QtGui import QFont           # 设置字体
from PyQt5.QtGui import QPalette        # 调试版,设置背景色的
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap         # 用于显示图片

class QLabelDemo(QWidget):
    def __init__(self):
        super(QLabelDemo,self).__init__()
        self.initUI()

    def initUI(self):
        label1 = QLabel(self)       # QLbael控件
        label2 = QLabel(self)
        label3 = QLabel(self)
        label4 = QLabel(self)

        label1.setText("<font color=yellow>这是一个文本标签。</font>")       # 为第一个label设置文本
        label1.setAutoFillBackground(True)      # 设置自动填充背景

        paltette = QPalette()    # 创建调试板
        paltette.setColor(QPalette.Window,Qt.blue)       # 设置颜色

        label1.setPalette(paltette) # 对lebel使用调试板
        label1.setAlignment(Qt.AlignCenter)     # 设置文本居中对齐

        label2.setText("<a href='#'>欢迎使用Python  GUI程序</a>")

        label3.setAlignment(Qt.AlignCenter)
        label3.setToolTip("这是一个图片标签")
        label3.setPixmap(QPixmap("./images/python.jpg"))        # 设置图片

        label4.setOpenExternalLinks(True)       # 如果设为True,用浏览器打开网页;如果设为False,调用槽函数
        label4.setText("<a href='https://item.jd.com/12417265.html'>感谢关注《这本书》</a>")
        label4.setAlignment(Qt.AlignRight)  # 设置文本右对齐
        label4.setToolTip("这是一个超级链接")

        # 使用垂直布局
        vbox = QVBoxLayout()
        vbox.addWidget(label1)
        vbox.addWidget(label2)
        vbox.addWidget(label3)
        vbox.addWidget(label4)

        # 绑定相应事件
        label2.linkHovered.connect(self.linkHovered)
        label2.linkActivated.connect(self.linkclicked)

        self.setLayout(vbox)    # 设置布局
        self.setWindowTitle("QLabel控件演示")

    def linkHovered(self):
        print("当鼠标滑过label2标签时,触发事件")
    def linkclicked(self):
        print("当鼠标单击label4标签时,触发事件")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    # app.setWindowIcon(QIcon("./images/Dragon.ico"))     # 设置应用程序的图标
    main_ = QLabelDemo()
    main_.show()
    sys.exit(app.exec())

显示效果如下所示:
在这里插入图片描述

7_QLabe与伙伴关系

"""
QLabel与伙伴控件
mainlayout.addWidget(控件对象,行索引,列索引,占用多少行,占用多少列)

"""

from PyQt5.QtWidgets import *
import sys


class QLabelBuddy(QDialog):
    def __init__(self):
        super(QLabelBuddy, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("QLabel与伙伴控件")
        nameLabel = QLabel("&Name", self)  # 同时设置热键
        nameLineRdit = QLineEdit(self)
        # 设置伙伴控件
        nameLabel.setBuddy(nameLineRdit)

        passwordLabel = QLabel("&PassWord", self)
        passwordLineEdit = QLineEdit(self)
        # 设置伙伴控件
        passwordLabel.setBuddy(passwordLineEdit)

        btnOK = QPushButton("&OK")  # 创建按钮
        btnCancel = QPushButton("&Cancel")

        # 使用栅格布局
        mainlayout = QGridLayout(self)
        mainlayout.addWidget(nameLabel, 0, 0)
        mainlayout.addWidget(nameLineRdit, 0, 1, 1, 2)  # 表示放置在第0行,第1列,占用一行两列

        mainlayout.addWidget(passwordLabel, 1, 0)
        mainlayout.addWidget(passwordLineEdit, 1, 1, 1, 2)  # 表示放置在第1行,第1列,占用一行两列

        mainlayout.addWidget(btnOK, 2, 1)
        mainlayout.addWidget(btnCancel, 2, 2)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    # app.setWindowIcon(QIcon("./images/Dragon.ico"))     # 设置应用程序的图标
    main_ = QLabelBuddy()
    main_.show()
    sys.exit(app.exec())

显示效果如下所示:
在这里插入图片描述

8_QLineEdit控件与回显模式

"""
QLineEdit控件与回显模式:
基本功能:输入单行的文本
EchoMode(设置回显模式):
        其支持四种回显模式
        1、Normal
        2、NoEcho(不回显模式)
        3、Password:
        4、PasswordEchoOnEdit:
"""

from PyQt5.QtWidgets import *

import sys


class QLineEditEchoMode(QDialog):
    def __init__(self):
        super(QLineEditEchoMode, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("文本输入框的回显模式")

        formlayout = QFormLayout()      # 创建表单布局

        # 创建控件
        normalLineEdit = QLineEdit()
        noEchoLineEdit=QLineEdit()
        passwordLineEdit = QLineEdit()
        passwordEchoOnLineEdit = QLineEdit()

        # 将控件添加到布局中
        formlayout.addRow("Normal",normalLineEdit)
        formlayout.addRow("NoEcho", noEchoLineEdit)
        formlayout.addRow("Password", passwordLineEdit)
        formlayout.addRow("passwordEchoOnLineEdit", passwordEchoOnLineEdit)

        # 为文本输入框设置placeholdertext
        normalLineEdit.setPlaceholderText("Normal")
        noEchoLineEdit.setPlaceholderText("NoEcho")
        passwordLineEdit.setPlaceholderText("Password")
        passwordEchoOnLineEdit.setPlaceholderText("passwordEchoOnLineEdit")

        # 设置回显模式
        normalLineEdit.setEchoMode(QLineEdit.Normal)
        noEchoLineEdit.setEchoMode(QLineEdit.NoEcho)
        passwordLineEdit.setEchoMode(QLineEdit.Password)
        passwordEchoOnLineEdit.setEchoMode(QLineEdit.PasswordEchoOnEdit)

        self.setLayout(formlayout)




if __name__ == '__main__':
    app = QApplication(sys.argv)
    # app.setWindowIcon(QIcon("./images/Dragon.ico"))     # 设置应用程序的图标
    main_ = QLineEditEchoMode()
    main_.show()
    sys.exit(app.exec())

显示效果如下所示:
在这里插入图片描述

9_使用校验器限制QLineEdit控件的输入

"""
限制QLineEdit控件的输入(校验器)
    即限制只能输入整数、浮点数或者满足一定条件的字符串

"""

from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIntValidator,QDoubleValidator,QRegExpValidator     # QIntValidator:校验整数;QDoubleValidator:校验浮点数;QRegExpValidator:检验正则表达式
from PyQt5.QtCore import QRegExp      # 正则表达式的类
import sys


class QLineEditValidator(QDialog):
    def __init__(self):
        super(QLineEditValidator, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("校验器")

        formlayout = QFormLayout()      # 创建表单布局

        # 创建三个控件
        intLineEdit = QLineEdit()
        doubleLineEdit = QLineEdit()
        validatorLineEdit = QLineEdit()

        # 将三个控件添加到表单布局中
        formlayout.addRow("整数类型",intLineEdit)
        formlayout.addRow("浮点类型", doubleLineEdit)
        formlayout.addRow("数字和字母类型", validatorLineEdit)

        # 设置placeholderText
        intLineEdit.setPlaceholderText("整形")
        doubleLineEdit.setPlaceholderText("浮点型")
        validatorLineEdit.setPlaceholderText("数字和字母类型")

        # 整数校验器
        intValidator = QIntValidator(self)
        intValidator.setRange(1,99)     # 设定整数范围在[1,99]

        # 浮点校验器
        doubleValidator = QDoubleValidator(self)
        doubleValidator.setRange(-360,360)      # 设定浮点数范围[-360,360]
        doubleValidator.setNotation(QDoubleValidator.StandardNotation)      # 设置正常的表示浮点数
        doubleValidator.setDecimals(2)      # 设置精度,小数点后2位

        # 字符和数字
        reg = QRegExp("[a-z0-9]+$")     # 正则表达式类
        validator = QRegExpValidator(self)      # 正则表达式校验器
        validator.setRegExp(reg)                # 将正则表达式与正则表达式校验器绑定

        # 设置校验器(即将校验器与对应的控件绑定)
        intLineEdit.setValidator(intValidator)
        doubleLineEdit.setValidator(doubleValidator)
        validatorLineEdit.setValidator(validator)


        self.setLayout(formlayout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    # app.setWindowIcon(QIcon("./images/Dragon.ico"))     # 设置应用程序的图标
    main_ = QLineEditValidator()
    main_.show()
    sys.exit(app.exec())

显示效果如下所示:
在这里插入图片描述

10_使用掩码限制QLineEdit的输入

'''

用掩码限制QLineEdit控件的输入

A    ASCII字母字符是必须输入的(A-Z、a-z)
a    ASCII字母字符是允许输入的,但不是必需的(A-Z、a-z)
N    ASCII字母字符是必须输入的(A-Z、a-z、0-9)
n    ASII字母字符是允许输入的,但不是必需的(A-Z、a-z、0-9)
X    任何字符都是必须输入的
x    任何字符都是允许输入的,但不是必需的
9    ASCII数字字符是必须输入的(0-9)
0    ASCII数字字符是允许输入的,但不是必需的(0-9)
D    ASCII数字字符是必须输入的(1-9)
d    ASCII数字字符是允许输入的,但不是必需的(1-9)
#    ASCI数字字符或加减符号是允许输入的,但不是必需的
H    十六进制格式字符是必须输入的(A-F、a-f、0-9)
h    十六进制格式字符是允许输入的,但不是必需的(A-F、a-f、0-9)
B    二进制格式字符是必须输入的(0,1)
b    二进制格式字符是允许输入的,但不是必需的(0,1)
>    所有的字母字符都大写
<    所有的字母字符都小写
!    关闭大小写转换
\    使用"\"转义上面列出的字符
'''

from PyQt5.QtWidgets import *
import sys
from PyQt5.QtGui import QIcon  # 用来添加图标


class QLineEditMask(QWidget):
    def __init__(self):
        super(QLineEditMask, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("用掩码限制QLibeEdit控件的输入")
        self.setWindowIcon(QIcon("./images/Dragon.ico"))  # 设置窗口图标方式
        formLayout = QFormLayout()  # 表单布局

        ipLineEdit = QLineEdit()
        mackLineEdit = QLineEdit()
        dateLineEdit = QLineEdit()
        licenseLineEdit = QLineEdit()

        # 192.168.21.45
        ipLineEdit.setInputMask("000,000,000,000;_")  # 设置IP
        mackLineEdit.setInputMask("HH:HH:HH:HH:HH:HH;_")  # 设置mak地址
        dateLineEdit.setInputMask("0000-00-00")  # 设置日期
        licenseLineEdit.setInputMask(">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#")  # 设置序列号 没有输入用#代替

        formLayout.addRow("数字掩码IP", ipLineEdit)
        formLayout.addRow("mak地址", mackLineEdit)
        formLayout.addRow("日期掩码", dateLineEdit)
        formLayout.addRow("序列号掩码", licenseLineEdit)

        self.setLayout(formLayout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QLineEditMask()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

11_QLineEdit综合案例

'''
QLineEdit综合案例

'''
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon           # 用来添加图标
import sys

class QLineEditDemo(QWidget) :
    def __init__(self):
        super(QLineEditDemo,self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('QLineEdit综合案例')
        formlayout = QFormLayout()  # 创建表单布局
        self.setWindowIcon(QIcon('./images/doc.ico'))

        edit1 = QLineEdit()
        # 使用int校验器
        edit1.setValidator(QIntValidator())
        edit1.setMaxLength(4)    # 设置文本框输入的最大长度
        edit1.setAlignment(Qt.AlignLeft)       # 设置左对齐
        edit1.setFont(QFont('Arial',10))        # 设置字体和字号

        # 使用浮点数校验器
        edit2=QLineEdit()
        edit2.setValidator(QDoubleValidator(0.99,99.99,2))     # 即表示从0.99~99.99,保留后两位

        #使用掩码校验
        edit3=QLineEdit()
        edit3.setInputMask('99_9999_999999;#')

        # 文本内容改变触发事件
        edit4=QLineEdit()
        edit4.textChanged.connect(self.textChange)

        # 设置回显的效果
        edit5=QLineEdit()
        edit5.setEchoMode(QLineEdit.Password)
        edit5.editingFinished.connect(self.enterPress)      # 绑定编辑完成事件

        # 设置只读文本输入框
        edit6 = QLineEdit("Hllo Pyqt5")
        edit6.setReadOnly(True)

        formlayout.addRow("整数校验",edit1)
        formlayout.addRow("浮点数校验", edit2)
        formlayout.addRow("掩码校验", edit3)
        formlayout.addRow("文本内容改变触发事件", edit4)
        formlayout.addRow("密码回显",edit5)
        formlayout.addRow("只读文本输入框", edit6)

        self.setLayout(formlayout)

    def textChange(self):
        sender = self.sender()
        print("输入的内容:"+sender.text())

    def enterPress(self):
        print("已输入值")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QLineEditDemo()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

12_使用QTextEdit输入多行文本

'''
QTextEdit综合案例

'''
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon  # 用来添加图标
import sys


class QLineEditDemo(QWidget):
    def __init__(self):
        super(QLineEditDemo, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('使用QTextEdit输入多行文本')
        self.setWindowIcon(QIcon('./images/doc.ico'))
        self.resize(300, 280)

        self.textEdit = QTextEdit()
        self.buttonText = QPushButton("显示文本")
        self.buttonHTML = QPushButton("显示HTML")

        self.buttonGetText = QPushButton("获取文本")
        self.buttonGetHTML = QPushButton("获取HTML")

        layout = QVBoxLayout()  # 创建垂直布局
        layout.addWidget(self.textEdit)
        layout.addWidget(self.buttonText)
        layout.addWidget(self.buttonHTML)
        layout.addWidget(self.buttonGetText)
        layout.addWidget(self.buttonGetHTML)

        # 设置布局
        self.setLayout(layout)

        # 绑定事件
        self.buttonText.clicked.connect(self.onClick_ButtonText)
        self.buttonHTML.clicked.connect(self.onClick_ButtonHTML)
        self.buttonGetText.clicked.connect(self.onClick_ButtonGetText)
        self.buttonGetHTML.clicked.connect(self.onClick_ButtonGetHtml)

    def onClick_ButtonText(self):
        self.textEdit.setPlainText("Hello World,世界你好吗")

    def onClick_ButtonHTML(self):
        self.textEdit.setHtml('<font color="blue" size="5">hello world</font>')

    def onClick_ButtonGetText(self):
        print(self.textEdit.toPlainText())  # 获取多行文本框内的文字内容

    def onClick_ButtonGetHtml(self):
        print(self.textEdit.toHtml())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QLineEditDemo()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

13_按钮控件QPushButton

'''
按钮控件QPushButton
QAbstractButton (父类)

QPushButton
AToolButton:工具条按钮
QRadioButton:单选按钮
QCheckbox:多选按钮

'''

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys


class QLineEditMask(QDialog):
    def __init__(self):
        super(QLineEditMask, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('QPushButton Demo')
        layout = QVBoxLayout()  # 使用垂直布局

        self.button1 = QPushButton("第1个按钮")
        self.button1.setText("First Button1")       # 设置按钮的文本
        self.button1.setCheckable(True)  # 是该按钮具备可选状态
        self.button1.toggle()
        self.button1.clicked.connect(lambda: self.whichButton(self.button1))
        self.button1.clicked.connect(self.buttonState)

        # 在文本前面显示图像
        self.button2 = QPushButton("图像按钮")
        self.button2.setIcon(QIcon(QPixmap("./images/python.png")))
        self.button2.clicked.connect(lambda :self.whichButton(self.button2))

        # 设置按钮不可用
        self.button3 = QPushButton("不可用的按钮")
        self.button3.setEnabled(False)

        self.button4 = QPushButton("&MyButton")
        self.button4.setDefault(True)       # 一个布局中只允许有一个默认按钮
        self.button4.clicked.connect(lambda :self.whichButton(self.button4))

        layout.addWidget(self.button1)
        layout.addWidget(self.button2)
        layout.addWidget(self.button3)
        layout.addWidget(self.button4)
        self.setLayout(layout)
        self.resize(400,300)

    def whichButton(self, btn):
        print("被单击的按钮是<" + btn.text() + ">")

    def buttonState(self):
        if self.button1.isChecked():
            print("按钮1已经被选中")
        else:
            print("按钮1未被选中")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QLineEditMask()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

14_单选按钮控件QRadioButton

'''
单选按钮控件(QRadioButton)
'''
from PyQt5.QtWidgets import *
import sys


class QRadioButtonDemo(QDialog):
    def __init__(self):
        super(QRadioButtonDemo, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('QRadioButton Demo')
        layout = QHBoxLayout()  # 使用水平布局

        self.button1 = QRadioButton("单选按钮1")
        self.button1.setChecked(True)  # 默认此按钮是选中状态
        self.button1.toggled.connect(self.buttonState)
        layout.addWidget(self.button1)

        self.button2 = QRadioButton("单选按钮2")
        self.button2.toggled.connect(self.buttonState)
        layout.addWidget(self.button2)

        self.setLayout(layout)


    def buttonState(self):
        radioButton = self.sender()
        if radioButton.text() == "单选按钮1":
            if radioButton.isChecked() == True:
                print("<" + radioButton.text() + ">" + "被选中")
            else:
                print("<" + radioButton.text() + ">" + "取消被选中状态")

        if radioButton.text() == "单选按钮2":
            if radioButton.isChecked() == True:
                print("<" + radioButton.text() + ">" + "被选中")
            else:
                print("<" + radioButton.text() + ">" + "取消被选中状态")




if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QRadioButtonDemo()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

15_复选框控件

'''
复选框控件(QCheckBox)
    3中状态:
        未选中:0
        半选中:1
        选中:2
'''
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys


class QCheckBoxDemo(QWidget):
    def __init__(self):
        super(QCheckBoxDemo, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('复选框控件演示')
        layout = QHBoxLayout()  # 使用水平布局

        self.checkBox1 = QCheckBox("复选框控件1")
        self.checkBox1.setChecked(True)  # 默认选中状态
        self.checkBox1.stateChanged.connect(lambda :self.checkBoxState(self.checkBox1))
        layout.addWidget(self.checkBox1)

        self.checkBox2 = QCheckBox("复选框控件2")
        self.checkBox2.stateChanged.connect(lambda: self.checkBoxState(self.checkBox2))
        layout.addWidget(self.checkBox2)

        self.checkBox3 = QCheckBox("复选框控件3(半选中状态)")
        self.checkBox3.stateChanged.connect(lambda: self.checkBoxState(self.checkBox3))
        self.checkBox3.setTristate(True)        # 设置半选中的状态
        self.checkBox3.setCheckState(Qt.PartiallyChecked)       # 设置半选中的状态
        layout.addWidget(self.checkBox3)

        self.setLayout(layout)

    def checkBoxState(self, cb):
        check1Status = self.checkBox1.text() + ", isChecked=" + str(
            self.checkBox1.isChecked()) + ",checkState=" + str(self.checkBox1.checkState()) + "\n"
        check2Status = self.checkBox2.text() + ", isChecked=" + str(
            self.checkBox2.isChecked()) + ",checkState=" + str(self.checkBox2.checkState()) + "\n"
        check3Status = self.checkBox3.text() + ", isChecked=" + str(
            self.checkBox3.isChecked()) + ",checkState=" + str(self.checkBox3.checkState()) + "\n"
        print(check1Status)
        print(check2Status)
        print(check3Status)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QCheckBoxDemo()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

16_下拉列表控件

'''
下拉列表控件
    1、如何将列表项添加到QComBox控件中
    2、如何获取选中的列表项
'''
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys


class QComboxDemo(QWidget):
    def __init__(self):
        super(QComboxDemo, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('复选框控件演示')
        self.resize(300, 100)
        layout = QVBoxLayout()  # 使用垂直布局

        self.label = QLabel("请选择编程语言")

        self.cb = QComboBox()
        self.cb.addItem("C++")
        self.cb.addItem("Python")
        self.cb.addItems(["Java", "C#", "Ruby"])  # 也可以添加列表

        self.cb.currentIndexChanged.connect(self.selectionChange)

        layout.addWidget(self.label)
        layout.addWidget(self.cb)
        self.setLayout(layout)

    def selectionChange(self, i):
        self.label.setText(self.cb.currentText())
        self.label.adjustSize()     # 自适应调整尺寸

        for count in range(self.cb.count()):
            print("item" + str(count) + "=" + self.cb.itemText(count))
        print("current index", i, "select changed", self.cb.currentText())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QComboxDemo()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

17_滑块控件QSlider

'''
计数器控件(QSpinBox)
'''
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys


class QSliderDemo(QWidget):
    def __init__(self):
        super(QSliderDemo, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('滑块演示')
        self.resize(300, 700)
        self.setWindowIcon(QIcon('./images/doc.ico'))
        layout = QVBoxLayout()  # 使用垂直布局

        self.label = QLabel("你好,PyQt5")
        self.label.setAlignment(Qt.AlignCenter)
        layout.addWidget(self.label)

        """创建水平的滑块"""
        self.slider=QSlider(Qt.Horizontal)      # 设置水平的滑块
        # 设置最小值
        self.slider.setMinimum(12)      # 设置最小值
        # 设置最大值
        self.slider.setMaximum(48)      # 设置最大值
        # 步长
        self.slider.setSingleStep(3)     # 设置步长
        # 设置当前值
        self.slider.setValue(18)            # 设置当前值
        # 设置刻度的位置,刻度在下方
        self.slider.setTickPosition(QSlider.TicksBelow)     # QSlider.TicksBelow:刻度在下方
        # 设置刻度的间隔
        self.slider.setTickInterval(6)

        """创建竖直的滑块"""
        self.slider2 = QSlider(Qt.Vertical)  # 创建垂直的滑块
        # 设置最小值
        self.slider2.setMinimum(12)  # 设置最小值
        # 设置最大值
        self.slider2.setMaximum(48)  # 设置最大值
        # 步长
        self.slider2.setSingleStep(3)  # 设置步长
        # 设置当前值
        self.slider2.setValue(18)  # 设置当前值
        # 设置刻度的位置,刻度在下方
        self.slider2.setTickPosition(QSlider.TicksLeft)  # QSlider.TicksBelow:刻度在下方
        # 设置刻度的间隔
        self.slider2.setTickInterval(6)

        layout.addWidget(self.slider)
        layout.addWidget(self.slider2)

        self.slider.valueChanged.connect(self.valueChange)      # 进行信号的绑定
        self.slider2.valueChanged.connect(self.valueChange)  # 进行信号的绑定
        self.setLayout(layout)

    def valueChange(self):
        print("当前值:%s"%(self.sender().value()))       # 输出当前值
        size=self.sender().value()
        self.label.setFont(QFont("Arial",size))



if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QSliderDemo()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

18_计数器控件QSpinBox

'''
下拉列表控件(QSpinBox)
    1、如何将列表项添加到QComBox控件中
    2、如何获取选中的列表项
'''
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys


class QSpinBoxDemo(QWidget):
    def __init__(self):
        super(QSpinBoxDemo, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('计数器控件演示')
        self.resize(300, 100)
        self.setWindowIcon(QIcon('./images/doc.ico'))

        layout = QVBoxLayout()  # 使用水平布局

        self.label=QLabel("当前值")
        self.label.setAlignment(Qt.AlignCenter)
        layout.addWidget(self.label)

        self.sb=QSpinBox()  # 设置计数器控件
        self.sb.setValue(18)    # 设置当前默认值
        self.sb.setRange(10,999)    # 设置当前竖直范围
        self.sb.setSingleStep(3)    # 设置每次数值变化的步长
        layout.addWidget(self.sb)
        self.sb.valueChanged.connect(self.valueChange)
        self.setLayout(layout)


    def valueChange(self):
        self.label.setText("当前值:"+str(self.sb.value()))



if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QSpinBoxDemo()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

19_对话框控件QDialog

'''
对话框(QDialog)
    QMessageBox:显示消息对话框
    QColorDialog:显示颜色对话框
    QFileDialog:用来显示文件打开或者保存对话框的
    QFontDialog:用来显示字体对话框的
    QInputDialog:用来获取用户输入信息对话框

    QMainWindow
    QWidget
    QDialog

'''
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys

class QDialogDemo(QMainWindow):
    def __init__(self):
        super(QDialogDemo,self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('QDialog案例')
        self.resize(300,200)

        self.button = QPushButton(self)     # 传入self,直接把button放置在窗口上
        self.button.setText('弹出对话框')
        self.button.move(50,50)         # 将按钮移动到窗口的相应位置
        self.button.clicked.connect(self.showDialog)

    def showDialog(self):
        dialog = QDialog()      # 创建对话框的实例
        button = QPushButton('确定',dialog)       # 将控件放置在对话框内
        button.clicked.connect(dialog.close)
        button.move(50,50)
        dialog.setWindowTitle('对话框')
        dialog.setWindowModality(Qt.ApplicationModal)   # 设置对话框以模式的状态显示,即给对话框显示时,窗口中其他的对话框皆不可用,除非关闭此对话框

        dialog.exec()       # 显示对话框

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QDialogDemo()
    main.show()
    sys.exit(app.exec_())

在这里插入图片描述

20_消息对话框QMessageBox

'''
消息对话框(QMessageBox)
    1、关于对话框
    2、错误对话框
    3、警告对话框
    4、提问对话框
    5、消息对话框

    有2点差异:
    1、显示的对话框图标可能不同
    2、显示的按钮是不一样的

'''
import sys
from PyQt5.QtWidgets import *

class QMessageBoxDemo(QWidget):
    def __init__(self):
        super(QMessageBoxDemo, self).__init__()
        self.initUI()
    def initUI(self):
        self.setWindowTitle("QMessageBox案例")
        self.resize(300,400)

        layout = QVBoxLayout()
        self.button1 = QPushButton()
        self.button1.setText("显示关于对话框")
        self.button1.clicked.connect(self.showDialog)

        self.button2 = QPushButton()
        self.button2.setText("显示消息对话框")
        self.button2.clicked.connect(self.showDialog)

        self.button3=QPushButton()
        self.button3.setText("显示警告对话框")
        self.button3.clicked.connect(self.showDialog)

        self.button4 = QPushButton()
        self.button4.setText("显示错误对话框")
        self.button4.clicked.connect(self.showDialog)

        self.button5 = QPushButton()
        self.button5.setText("显示提问对话框")
        self.button5.clicked.connect(self.showDialog)



        layout.addWidget(self.button1)
        layout.addWidget(self.button2)
        layout.addWidget(self.button3)
        layout.addWidget(self.button4)
        layout.addWidget(self.button5)
        self.setLayout(layout)
    def showDialog(self):
        text = self.sender().text()
        if text=="显示关于对话框":
            QMessageBox.about(self,"关于","这是一个关于对话框")
        elif text=="显示消息对话框":
            reply = QMessageBox.information(self, "消息", "这是一个消息对话框", QMessageBox.Yes | QMessageBox.No,
                                                  QMessageBox.Yes)
            print(reply,reply==QMessageBox.Yes)
        elif text=="显示警告对话框":
            reply = QMessageBox.warning(self, "警告", "这是一个警告对话框", QMessageBox.Yes | QMessageBox.No,
                                                  QMessageBox.Yes)
            print(reply, reply == QMessageBox.Yes)
        elif text=="显示错误对话框":
            reply = QMessageBox.critical(self, "错误", "这是一个错误对话框", QMessageBox.Yes | QMessageBox.No,
                                                  QMessageBox.Yes)
            print(reply, reply == QMessageBox.Yes)
        elif text=="显示提问对话框":
            reply = QMessageBox.question(self, "提问", "这是一个提问对话框", QMessageBox.Yes | QMessageBox.No,
                                                  QMessageBox.Yes)
            print(reply, reply == QMessageBox.Yes)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QMessageBoxDemo()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

21_输入对话框QInputDialog

'''
输入对话框:QInputDialog

QInputDialog.getItem
QInputDialog.getText
QInputDialog.getInt

'''

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class QInputDialogDemo(QWidget):
    def __init__(self):
        super(QInputDialogDemo,self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('输入对话框')
        layout = QFormLayout()

        self.button1 = QPushButton('获取列表中的选项')      # 创建按钮控件
        self.button1.clicked.connect(self.getItem)          # 绑定按钮事件
        self.lineEdit1 = QLineEdit()                        # 添加文本按钮控件
        layout.addRow(self.button1, self.lineEdit1)            # 添加到表单布局中

        self.button2 = QPushButton('获取字符串')
        self.button2.clicked.connect(self.getText)
        self.lineEdit2 = QLineEdit()
        layout.addRow(self.button2, self.lineEdit2)

        self.button3 = QPushButton('获取整数')
        self.button3.clicked.connect(self.getInt)
        self.lineEdit3 = QLineEdit()
        layout.addRow(self.button3, self.lineEdit3)

        self.setLayout(layout)

    def getItem(self):
        items = ('C','C++','Ruby','Python','Java')
        item, ok =QInputDialog.getItem(self,'请选择编程语言','语言列表',items)
        if ok and item:
            self.lineEdit1.setText(item)
    def getText(self):
        text, ok =QInputDialog.getText(self,'文本输入框','输入姓名')
        if ok and text:
            self.lineEdit2.setText(text)
    def getInt(self):
        num, ok =QInputDialog.getInt(self,'整数输入框','输入数字')
        if ok and num:
            self.lineEdit3.setText(str(num))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QInputDialogDemo()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

22_字体对话框QFontDialog

'''
字体对话框(QFontDialog)
'''
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys


class QFontDialogDemo(QWidget):
    def __init__(self):
        super(QFontDialogDemo, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Font Dialog例子')
        layout = QVBoxLayout()  # 使用垂直布局
        self.fontButton = QPushButton("选择字体")
        self.fontButton.clicked.connect(self.getFont)
        layout.addWidget(self.fontButton)

        self.fontLabel = QLabel("测试字体的例子")
        layout.addWidget(self.fontLabel)
        self.setLayout(layout)

    def getFont(self):
        font,ok = QFontDialog.getFont()
        if ok:
            self.fontLabel.setFont(font)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QFontDialogDemo()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

23_颜色对话框

'''
颜色对话框:(QColorDialog)
'''
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys


class QColorDialogDemo(QWidget):
    def __init__(self):
        super(QColorDialogDemo, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Color Dialog例子')
        layout = QVBoxLayout()
        self.colorButton = QPushButton('设置颜色')
        self.colorButton.clicked.connect(self.getColor)
        layout.addWidget(self.colorButton)

        self.colorButton1 = QPushButton('设置背景颜色')
        self.colorButton1.clicked.connect(self.getBGColor)
        layout.addWidget(self.colorButton1)

        self.colorLabel = QLabel('Hello,测试颜色例子')
        layout.addWidget(self.colorLabel)

        self.setLayout(layout)  # 将布局放入窗口

    def getColor(self):
        color = QColorDialog.getColor()  # 获取颜色
        p = QPalette()
        p.setColor(QPalette.WindowText, color)
        self.colorLabel.setPalette(p)

    def getBGColor(self):
        color = QColorDialog.getColor()
        p = QPalette()  # 调色板控件
        p.setColor(QPalette.Window, color)  # 设置颜色
        # self.colorLabel.setAutoFillBackground(True)         # 设置背景色自动填充
        # self.colorLabel.setPalette(p)

        self.setAutoFillBackground(True)  # 设置背景色自动填充
        self.setPalette(p)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QColorDialogDemo()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

24_文件对话框QFileDialog

'''
文件对话框:QFileDialog
'''

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class QFileDialogDemo(QWidget):
    def __init__(self):
        super(QFileDialogDemo,self).__init__()
        self.initUI()

    def initUI(self):
        layout = QVBoxLayout()      # 创建垂直布局
        self.button1 = QPushButton('加载图片')      # 创建点击控件
        self.button1.clicked.connect(self.loadImage)        # 绑定点击事件
        layout.addWidget(self.button1)                      # 将按钮添加到垂直布局

        self.imageLabel = QLabel()          # 创建Label,并将图像显示在上面
        layout.addWidget(self.imageLabel)

        self.button2 = QPushButton('加载文本文件')
        self.button2.clicked.connect(self.loadText)
        layout.addWidget(self.button2)

        self.contents = QTextEdit()         # 创建多行文本控件
        layout.addWidget(self.contents)

        self.setLayout(layout)
        self.setWindowTitle('文件对话框演示 ')

    def loadImage(self):
        fname,_ = QFileDialog.getOpenFileName(self,'打开文件','.','图像文件(*.jpg *.png)')
        self.imageLabel.setPixmap(QPixmap(fname))

    def loadText(self):
        dialog = QFileDialog()
        dialog.setFileMode(QFileDialog.AnyFile)     # 设置打开文件的模式---即打开任何文件
        dialog.setFilter(QDir.Files)        # 选择文件

        if dialog.exec():       # 打开文件
            filenames = dialog.selectedFiles()
            f = open(filenames[0],encoding='utf-8',mode='r')
            with f:
                data = f.read()
                self.contents.setText(data)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QFileDialogDemo()
    main.show()
    sys.exit(app.exec_())

效果如下所示:
在这里插入图片描述

24_文件对话框QFileDialog_2

import sys
import os
from PyQt5.QtWidgets import *

class MainForm(QWidget):
    def __init__(self, name = 'MainForm'):
        super(MainForm,self).__init__()
        self.setWindowTitle(name)
        self.cwd = os.getcwd() # 获取当前程序文件位置
        self.resize(300,200)   # 设置窗体大小
        # btn 1
        self.btn_chooseDir = QPushButton(self)
        self.btn_chooseDir.setObjectName("btn_chooseDir")
        self.btn_chooseDir.setText("选择文件夹")


        # btn 2
        self.btn_chooseFile = QPushButton(self)
        self.btn_chooseFile.setObjectName("btn_chooseFile")
        self.btn_chooseFile.setText("选取文件")



        # btn 3
        self.btn_chooseMutiFile = QPushButton(self)
        self.btn_chooseMutiFile.setObjectName("btn_chooseMutiFile")
        self.btn_chooseMutiFile.setText("多文件选择")



        # btn 4
        self.btn_saveFile = QPushButton(self)
        self.btn_saveFile.setObjectName("btn_saveFile")
        self.btn_saveFile.setText("文件保存")

        # 设置布局
        layout = QVBoxLayout()
        layout.addWidget(self.btn_chooseDir)
        layout.addWidget(self.btn_chooseFile)
        layout.addWidget(self.btn_chooseMutiFile)
        layout.addWidget(self.btn_saveFile)
        self.setLayout(layout)


        # 设置信号
        self.btn_chooseDir.clicked.connect(self.slot_btn_chooseDir)
        self.btn_chooseFile.clicked.connect(self.slot_btn_chooseFile)
        self.btn_chooseMutiFile.clicked.connect(self.slot_btn_chooseMutiFile)
        self.btn_saveFile.clicked.connect(self.slot_btn_saveFile)



    def slot_btn_chooseDir(self):
        dir_choose = QFileDialog.getExistingDirectory(self,
                                    "选取文件夹",
                                    self.cwd) # 起始路径

        if dir_choose == "":
            print("\n取消选择")
            return

        print("\n你选择的文件夹为:")
        print(dir_choose)


    def slot_btn_chooseFile(self):
        fileName_choose, filetype = QFileDialog.getOpenFileName(self,
                                    "选取文件",
                                    self.cwd, # 起始路径
                                    "All Files (*);;Text Files (*.txt)")   # 设置文件扩展名过滤,用双分号间隔

        if fileName_choose == "":
            print("\n取消选择")
            return

        print("\n你选择的文件为:")
        print(fileName_choose)
        print("文件筛选器类型: ",filetype)


    def slot_btn_chooseMutiFile(self):
        files, filetype = QFileDialog.getOpenFileNames(self,
                                    "多文件选择",
                                    self.cwd, # 起始路径
                                    "All Files (*);;PDF Files (*.pdf);;Text Files (*.txt)")

        if len(files) == 0:
            print("\n取消选择")
            return

        print("\n你选择的文件为:")
        for file in files:
            print(file)
        print("文件筛选器类型: ",filetype)


    def slot_btn_saveFile(self):
        fileName_choose, filetype = QFileDialog.getSaveFileName(self,
                                    "文件保存",
                                    self.cwd, # 起始路径
                                    "All Files (*);;Text Files (*.txt)")

        if fileName_choose == "":
            print("\n取消选择")
            return

        print("\n你选择要保存的文件为:")
        print(fileName_choose)
        print("文件筛选器类型: ",filetype)

if __name__=="__main__":
    app = QApplication(sys.argv)
    mainForm = MainForm('测试QFileDialog')
    mainForm.show()
    sys.exit(app.exec_())


25_在窗口上绘制文本

'''

绘图API:绘制文本

1. 文本
2. 各种图形(直线,点,椭圆,弧,扇形,多边形等)
3. 图像

QPainter

painter = QPainter()

painter.begin()

painter.drawText(...)

painter.end()
必须在paintEvent事件方法中绘制各种元素

'''

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QColor, QFont
from PyQt5.QtCore import Qt


class DrawText(QWidget):
    def __init__(self):
        super(DrawText, self).__init__()
        self.setWindowTitle('在窗口上绘制文本')
        self.resize(300, 200)
        self.text = "Python从菜鸟到高手"

    # 此事件,窗口创建时会自动调用
    def paintEvent(self, event):
        painter = QPainter(self)  # 创建QPainter对象
        painter.begin(self)     # 初始化画板
        print("窗口改变")
        painter.setPen(QColor(150, 43, 5))  # 设置笔的颜色
        painter.setFont(QFont('SimSun', 25))  # 设置字体
        painter.drawText(event.rect(), Qt.AlignCenter, self.text)  # 第一个参数表示绘制的位置
        painter.end()



if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = DrawText()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

26_绘制正弦函数图像

'''

用像素点绘制正弦曲线

-2PI  2PI

drawPoint(x,y)

'''

import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt

class DrawPoints(QWidget):
    def __init__(self):
        super(DrawPoints,self).__init__()
        self.resize(400,300)
        self.setWindowTitle('在窗口上用像素点绘制2个周期的正弦曲线')

    def paintEvent(self, event):
        painter = QPainter()
        painter.begin(self)
        painter.setPen(Qt.blue)     # 设置笔的颜色
        size = self.size()      # 获取窗口的尺寸

        for i in range(1000):
            x = 100 * (-1 + 2.0 * i/1000) + size.width()/2.0
            y = -50 * math.sin((x - size.width()/2.0) * math.pi/50) + size.height()/2.0
            painter.drawPoint(x,y)

        painter.end()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = DrawPoints()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

27_绘制不同类型的直线

'''

绘制不同类型的直线

'''

import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt

class DrawMultiLine(QWidget):
    def __init__(self):
        super(DrawMultiLine,self).__init__()
        self.resize(300,300)
        self.setWindowTitle('设置Pen的样式')

    def paintEvent(self, event):
        painter = QPainter()
        painter.begin(self)


        pen = QPen(Qt.red,3,Qt.SolidLine)       # 创建画笔(颜色、画笔粗细、线型)

        painter.setPen(pen)             # 设置对象
        painter.drawLine(20,40,250,40)          # 设置其实位置

        pen.setStyle(Qt.DashLine)       # 设置不同的线类型-------设置完线的风格后,必须得重新设置下pen对象,否则不会起作用
        painter.setPen(pen)             # 必须得重新设置下pen对象,否则不会起作用
        painter.drawLine(20, 80, 250, 80)

        pen.setStyle(Qt.DashDotDotLine)
        painter.setPen(pen)
        painter.drawLine(20, 120, 250, 120)

        pen.setStyle(Qt.DotLine)
        painter.setPen(pen)             # 必须得重新设置下pen对象,否则不会起作用
        painter.drawLine(20, 160, 250, 160)

        pen.setStyle(Qt.DashDotDotLine)
        painter.setPen(pen)
        painter.drawLine(20, 200, 250, 200)

        pen.setStyle(Qt.CustomDashLine)     # Qt.CustomDashLine:设置自定义的线
        pen.setDashPattern([1,10,5,8])
        painter.setPen(pen)
        painter.drawLine(20, 240, 250, 240)


        painter.end()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = DrawMultiLine()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

28_绘制多种形状并将图像装载到窗口


绘制各种图形

弧
圆形
椭圆
矩形(正方形)
多边形
绘制图像

'''

import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class DrawAll(QWidget):
    def __init__(self):
        super(DrawAll,self).__init__()
        self.resize(300,600)
        self.setWindowTitle('绘制各种图形')
    def paintEvent(self, event):
        qp = QPainter()
        qp.begin(self)

        qp.setPen(Qt.blue)      # 设置笔的颜色
        # 绘制弧
        rect = QRect(0,10,100,100)  # 绘制弧,需要先确定矩形区域    前两个参数为顶点坐标,后两个参数为宽度与高度
        # alen: 1个alen等于1/1645 * 16
        qp.drawArc(rect,0, 50 * 16)     #       drawArc(弧形区域,起始的角度,结束的角度)


        # 通过弧绘制圆
        qp.setPen(Qt.red)
        qp.drawArc(120,10,100,100,0, 360 * 16)

        # 绘制带弦的弧
        qp.drawChord(10,120,100,100,12,130*16)

        # 绘制扇形
        qp.drawPie(10,240,100,100,12,130*16)

        # 椭圆
        qp.drawEllipse(120,120,150,100)


        # 绘制5边形
        point1 = QPoint(140,380)
        point2 = QPoint(270,420)
        point3 = QPoint(290,512)
        point4 = QPoint(290,588)
        point5 = QPoint(200,533)
        polygon = QPolygon([point1,point2,point3,point4,point5])        # 绘制多边形对象
        # 绘制多边形图像
        qp.drawPolygon(polygon)


        # 将一个图像绘制到窗口上
        image = QImage('./images/book1.png')        # 装载图像
        rect = QRect(10, 400, image.width()/3, image.height()/3)        # 指定将图像绘制到多大的区域
        #image.save('./images/book1.png')
        qp.drawImage(rect,image)

        qp.end()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = DrawAll()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

29_使用画刷填充图像区域

'''
用画刷填充图形区域
'''
import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class FillRect(QWidget):
    def __init__(self):
        super(FillRect,self).__init__()
        self.resize(600,600)
        self.setWindowTitle('用画刷填充区域')

    def paintEvent(self,e):
        qp = QPainter()     # 获得一个画布
        qp.begin(self)
        brush = QBrush(Qt.SolidPattern)     # 创建画刷对象,,Qt.SolidPattern:实型模式
        qp.setBrush(brush)      # 设置画刷对象
        qp.drawRect(10,15,90,60)        # 绘制矩形

        brush = QBrush(Qt.Dense1Pattern)
        qp.setBrush(brush)
        qp.drawRect(130,15,90,60)

        brush = QBrush(Qt.Dense2Pattern)
        qp.setBrush(brush)
        qp.drawRect(250,15,90,60)

        brush = QBrush(Qt.Dense3Pattern)
        qp.setBrush(brush)
        qp.drawRect(10, 105, 90, 60)

        brush = QBrush(Qt.HorPattern)
        qp.setBrush(brush)
        qp.drawRect(130, 105, 90, 60)
        qp.end()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = FillRect()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

30_让控件支持拖拽动作

'''
让控件支持拖拽动作
A.setDragEnabled(True)      # 使的A可以被拖拽

B.setAcceptDrops(True)      # 使的B可以接受拖拽的内容

B需要两个事件
1. dragEnterEvent   将A拖到B触发
2. dropEvent        在B的区域放下A时触发


'''

import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class MyComboBox(QComboBox) :       # 继承QComboBox控件
    def __init__(self):
        super(MyComboBox,self).__init__()
        self.setAcceptDrops(True)       # 表示其可以接受别的控件了
    def dragEnterEvent(self,e):     # 表示别的控件拖进来后,还没有松开鼠标时触发
        print(e)
        if e.mimeData().hasText():      # 表示有文本,就接受;没有文本,就忽略
            e.accept()
        else:
            e.ignore()
    def dropEvent(self,e):      # 放下控件时触发
        self.addItem(e.mimeData().text())       # 将A控件中的文本放置到B控件内

class DrapDropDemo(QWidget):
    def __init__(self):
        super(DrapDropDemo,self).__init__()
        formLayout = QFormLayout()
        # formLayout.addRow("说明",QLabel("请将左边的文本拖拽到右边的下拉列表中"))
        formLayout.addRow(QLabel("请将左边的文本拖拽到右边的下拉列表中"))

        lineEdit = QLineEdit()
        lineEdit.setDragEnabled(True)  # 让QLineEdit控件可被拖动

        combo = MyComboBox()
        formLayout.addRow(lineEdit,combo)
        self.setLayout(formLayout)
        self.setWindowTitle('拖拽案例')
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = DrapDropDemo()
    main.show()
    sys.exit(app.exec_())

演示效果如下所示:

在这里插入图片描述

31_使用剪贴板

'''
使用剪贴板
'''

import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class ClipBoard(QDialog):
    def __init__(self):
        super(ClipBoard,self).__init__()
        textCopyButton = QPushButton('复制文本')
        textPasteButton = QPushButton('粘贴文本')

        htmlCopyButton = QPushButton('复制HTML')
        htmlPasteButton = QPushButton('粘贴HTML')

        imageCopyButton = QPushButton('复制图像')
        imagePasteButton = QPushButton('粘贴图像')

        self.textLabel  = QLabel('默认文本')
        self.imageLabel=QLabel()        # 创建用于显示图像的label
        self.imageLabel.setPixmap(QPixmap('./images/book1.png'))

        layout = QGridLayout()      # 使用栅格布局
        layout.addWidget(textCopyButton,0,0)
        layout.addWidget(imageCopyButton,0,1)
        layout.addWidget(htmlCopyButton,0,2)
        layout.addWidget(textPasteButton,1,0)
        layout.addWidget(htmlPasteButton,1,1)
        layout.addWidget(imagePasteButton,1,2)

        layout.addWidget(self.textLabel,2,0,1,2)
        layout.addWidget(self.imageLabel,2,2)

        self.setLayout(layout)

        textCopyButton.clicked.connect(self.copyText)
        textPasteButton.clicked.connect(self.pasteText)
        htmlCopyButton.clicked.connect(self.copyHtml)
        htmlPasteButton.clicked.connect(self.pasteHtml)
        imageCopyButton.clicked.connect(self.copyImage)
        imagePasteButton.clicked.connect(self.pasteImage)

        self.setWindowTitle('剪贴板演示')

    def copyText(self):
        clipboard = QApplication.clipboard()    # 获取剪切板对象
        clipboard.setText('hello world')        # 将文本复制到剪切板板上
    def pasteText(self):
        clipboard = QApplication.clipboard()        # 获取剪切板对象
        self.textLabel.setText(clipboard.text())        # 将剪切板上的文本复制到对应的空间上

    def copyImage(self):
        clipboard = QApplication.clipboard()        # 获取剪切板对象
        clipboard.setPixmap(QPixmap('./images/book.png'))       # 将图像复制到剪切板板上

    def pasteImage(self):
        clipboard = QApplication.clipboard()        # 获取剪切板对象
        self.imageLabel.setPixmap(clipboard.pixmap())       # 将剪切板上的图像复制到对应的空间上

    def copyHtml(self):
        mimeData = QMimeData()      # 得到剪切板内的数据类型
        mimeData.setHtml('<b>Bold and <font color=red>Red</font></b>')
        clipboard = QApplication.clipboard()
        clipboard.setMimeData(mimeData)     # 将html代码复制到剪切板里

    def pasteHtml(self):
        clipboard = QApplication.clipboard()        # 获取剪切板
        mimeData = clipboard.mimeData()             # 获得数据类型
        if mimeData.hasHtml():                      # 如果数据为html类型,则继续处理
            self.textLabel.setText(mimeData.html())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = ClipBoard()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

32_日历控件设置

'''
日历控件
QCalendarWidget
'''

import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class MyCalendar(QWidget):
    def __init__(self):
        super(MyCalendar, self).__init__()
        self.initUI()
    def initUI(self):
        self.cal = QCalendarWidget(self)    # 创建日历控件
        self.cal.setMinimumDate(QDate(1988,1,1))        # 设置允许显示的最小日期
        self.cal.setMaximumDate(QDate(2088,1,1))        # 设置允许显示的最大日期

        self.cal.setGridVisible(True)       # 设置日期以网格的形式显示

        self.cal.move(20,20)
        self.cal.clicked.connect(self.showDate)
        self.label = QLabel(self)
        date = self.cal.selectedDate()
        self.label.setText(date.toString("yyyy-MM-dd dddd"))
        self.label.move(20,300)

        self.resize(400,350)
        self.setWindowTitle("日历演示")

    def showDate(self,date):
        #self.label.setText((date.toString("yyyy-MM-dd dddd")))
        self.label.setText((self.cal.selectedDate().toString("yyyy-MM-dd dddd")))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MyCalendar()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

33_日期和时间控件的高级操作

'''
输入各种风格的日期和时间

QDateTimeEdit

'''

import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class DateTimeEdit(QWidget):
    def __init__(self):
        super(DateTimeEdit, self).__init__()
        self.initUI()
    def initUI(self):
        vlayout = QVBoxLayout()

        dateTimeEdit1 = QDateTimeEdit()     # 创建时间控件
        dateTimeEdit1.setMinimumDate(QDate.currentDate().addDays(-365))     # 设置最小日期   减去365天
        dateTimeEdit1.setMaximumDate(QDate.currentDate().addDays(365))      # 设置最大日期  加上365天
        self.dateTimeEdit = dateTimeEdit1
        dateTimeEdit1.setDisplayFormat("yyyy-MM-dd HH:mm:ss")

        dateTimeEdit2 = QDateTimeEdit(QDateTime.currentDateTime())  # 创建时间控件并传入当前时间
        dateTimeEdit2.setCalendarPopup(True)    # 为True:表示可以通过日历控件设置
        dateTimeEdit2.setDisplayFormat("yyyy/MM/dd HH-mm-ss")


        dateEdit = QDateTimeEdit(QDate.currentDate())
        dateEdit.setDisplayFormat("yyyy.MM.dd")
        timeEdit = QDateTimeEdit(QTime.currentTime())
        timeEdit.setDisplayFormat("HH:mm:ss")

        # 第一个控件变化触发事件
        dateTimeEdit1.dateChanged.connect(self.onDateChanged)
        dateTimeEdit1.timeChanged.connect(self.onTimeChanged)
        dateTimeEdit1.dateTimeChanged.connect(self.onDateTimeChanged)

        vlayout.addWidget(dateTimeEdit1)
        vlayout.addWidget(dateTimeEdit2)
        vlayout.addWidget(dateEdit)
        vlayout.addWidget(timeEdit)

        self.btn = QPushButton('获取日期和时间')
        self.btn.clicked.connect(self.onButtonClick)
        vlayout.addWidget(self.btn)
        self.setLayout(vlayout)

        self.resize(300,90)
        self.setWindowTitle("设置不同风格的日期和时间")

    # 日期变化
    def onDateChanged(self,date):
        print(date)

    # 时间变化
    def onTimeChanged(self,time):
        print(time)

    # 日期和时间变化
    def onDateTimeChanged(self,datetime):
        print(datetime)

    def onButtonClick(self):
        datetime = self.dateTimeEdit.dateTime()
        print(datetime)

        # 最大日期
        print(self.dateTimeEdit.maximumDate())
        # 最大日期和时间
        print(self.dateTimeEdit.maximumDateTime())

        # 最小日期
        print(self.dateTimeEdit.minimumDateTime())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = DateTimeEdit()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

34_创建和使用菜单栏

'''
创建和使用菜单
'''
import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class Menu(QMainWindow) :
    def __init__(self):
        super(Menu,self).__init__()
        self.resize(300,300)
        bar = self.menuBar()  # 获取菜单栏

        file = bar.addMenu("文件")
        file.addAction("新建")        # 利用文本创建        (方式一)

        save = QAction("保存",self)                   #(方式二)
        save.setShortcut("Ctrl + S")    # 设置快捷键
        file.addAction(save)        # 也可以利用带有动作的菜单创建
        save.triggered.connect(self.process)

        quit = QAction("退出", self)
        file.addAction(quit)


        edit = bar.addMenu("Edit")
        edit.addAction("copy")
        edit.addAction("paste")


    def process(self,a):
        print(self.sender().text())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = Menu()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

35_创建和使用工具栏

'''

创建和使用工具栏

工具栏默认按钮:只显示图标,将文本作为悬停提示展示

工具栏按钮有3中显示状态

1.  只显示图标
2.  只显示文本
3.  同时显示文本和图标
'''

import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class Toolbar(QMainWindow) :
    def __init__(self):
        super(Toolbar,self).__init__()
        self.initUI()
    def initUI(self):
        self.setWindowTitle("工具栏例子")
        self.resize(300,200)

        tb1 = self.addToolBar("File")       # 使用该方法来添加工具栏

        new = QAction(QIcon('./images/new.png'),"new",self)     # 将一个按钮添加至工具栏上      设置相应的图标以及悬停提示
        tb1.addAction(new)

        open = QAction(QIcon('./images/open.png'),"open",self)
        tb1.addAction(open)

        save = QAction(QIcon('./images/save.png'),"save",self)
        tb1.addAction(save)


        tb2 = self.addToolBar("File1")      # 添加工具栏
        new1 = QAction(QIcon('./images/new.png'),"新建",self)
        tb2.addAction(new1)

        tb2.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)      #设置按钮类型  使其既显示图标又显示文本,并使得文本在图标下显示
        # tb2.setToolButtonStyle(Qt.ToolButtonTextOnly)         # 设置只显示文本

        tb1.actionTriggered.connect(self.toolbtnpressed)

        tb2.actionTriggered.connect(self.toolbtnpressed)
    def toolbtnpressed(self,a):
        print("按下的工具栏按钮是",a.text())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = Toolbar()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

36_创建和使用状态栏


# 创建和使用状态栏


import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class StatusBar(QMainWindow) :
    def __init__(self):
        super(StatusBar,self).__init__()
        self.initUI()
    def initUI(self):
        self.setWindowTitle("状态栏演示")
        self.resize(300,200)

        bar = self.menuBar()        # 创建顶层菜单
        file = bar.addMenu("File")      # 创建子菜单
        file.addAction("show")
        file.triggered.connect(self.processTrigger)     # 绑定菜单触发动作
        self.setCentralWidget(QTextEdit())      # 在窗口放置中心的控件

        self.statusBar = QStatusBar()       # 创建状态栏对象
        self.setStatusBar(self.statusBar)       # 设置状态栏


    def processTrigger(self,q):
        if q.text() == "show" :
            self.statusBar.showMessage(q.text() + " 菜单被点击了",5000)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = StatusBar()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

37_使用打印机


# 使用打印机

from PyQt5 import QtGui, QtWidgets, QtPrintSupport
from PyQt5.QtWidgets import *
import sys

class PrintSupport(QMainWindow):
    def __init__(self):
        super(PrintSupport,self).__init__()
        self.setGeometry(500, 200, 300, 300)
        self.button = QPushButton('打印QTextEdit控件中的内容',self)
        self.button.setGeometry(20,20,260,30)   # 设置按钮控件的位置
        self.button.clicked.connect(self.print)

        self.editor = QTextEdit('默认文本',self)
        self.editor.setGeometry(20,60,260,200)



    def print(self):
        printer = QtPrintSupport.QPrinter()     # 创建打印对象

        painter = QtGui.QPainter()      # 获得一个画布
        # 将绘制的目标重定向到打印机
        painter.begin(printer)      # 将数据绘制到打印机
        screen = self.editor.grab()     # 获取控件内所有的内容
        painter.drawPixmap(10,10,screen)        # 把内容当成一个图来打印           ----10,10表示从该坐标处开始打印,而非定格打印)
        painter.end()
        print("print")


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    gui = PrintSupport()
    gui.show()
    app.exec_()

显示效果如下所示:
在这里插入图片描述

38_显示打印对话框


# 显示打印对话框

from PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QTextEdit, QFileDialog, QDialog
from PyQt5.QtPrintSupport import QPageSetupDialog, QPrintDialog, QPrinter
import sys

class PrintDialog(QWidget):
    def __init__(self):
        super(PrintDialog,self).__init__()
        self.printer = QPrinter()       # 创建打印对象
        self.initUI()



    def initUI(self):
        self.setGeometry(300, 300, 500, 400)
        self.setWindowTitle('打印对话框')

        self.editor = QTextEdit(self)
        self.editor.setGeometry(20,20,300,270)

        self.openButton = QPushButton('打开文件',self)
        self.openButton.move(350,20)

        self.settingsButton = QPushButton('打印设置',self)
        self.settingsButton.move(350,50)

        self.printButton = QPushButton('打印文档',self)
        self.printButton.move(350,80)

        self.openButton.clicked.connect(self.openFile)
        self.settingsButton.clicked.connect(self.showSettingsDialog)
        self.printButton.clicked.connect(self.showPrintDialog)

    # 打开文件
    def openFile(self):
        fname = QFileDialog.getOpenFileName(self,'打开文本文件','./')
        if fname[0]:
            with open(fname[0],'r',encoding='utf-8',errors = 'ignore') as f:
                self.editor.setText(f.read())
    # 显示打印设置对话框
    def showSettingsDialog(self):
        printDialog = QPageSetupDialog(self.printer,self)       # 显示打印设置对话框     并将设置的打印参数传到打印对象
        printDialog.exec()

    # 显示打印对话框
    def showPrintDialog(self):
        printdialog = QPrintDialog(self.printer,self)           # 显示打印对话框
        if QDialog.Accepted == printdialog.exec():      # 如果点击打印按钮
            self.editor.print(self.printer)





if __name__ == '__main__':
    app = QApplication(sys.argv)
    gui = PrintDialog()
    gui.show()
    sys.exit(app.exec_())

显示效果如下图所示:

在这里插入图片描述

39_显示二维表数据(QTableView)

'''

显示二维表数据(QTableView控件)
数据源
Model
需要创建QTableView实例和一个数据源(Model),然后将两者关联
MVC:Model   Viewer   Controller
MVC的目的是将后端的数据和前端页面的耦合度降低

'''
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys

class TableView(QWidget):

	def __init__(self, arg=None):
		super(TableView, self).__init__(arg)
		self.setWindowTitle("QTableView表格视图控件演示")
		self.resize(500,300);

		self.model = QStandardItemModel(4,3)		# 设置二维表的行与列数
		self.model.setHorizontalHeaderLabels(['id','姓名','年龄'])		# 为二维表设置字段标题

		self.tableview = QTableView()		# 创建QTableView实例
		# 关联QTableView控件和Model
		self.tableview.setModel(self.model)		# QTableView实例和一个数据源(Model),然后将两者关联


		# 添加数据
		item11 = QStandardItem('10')
		item12 = QStandardItem('雷神')
		item13 = QStandardItem('2000')
		self.model.setItem(0,0,item11)
		self.model.setItem(0,1, item12)
		self.model.setItem(0,2, item13)

		item31 = QStandardItem('30')
		item32 = QStandardItem('死亡女神')
		item33 = QStandardItem('3000')
		self.model.setItem(2,0,item31)
		self.model.setItem(2,1, item32)
		self.model.setItem(2,2, item33)

		layout = QVBoxLayout()
		layout.addWidget(self.tableview)
		self.setLayout(layout)


if __name__ == '__main__':
	app = QApplication(sys.argv)	
	table = TableView()
	table.show()
	sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

40_显示列数据(QListView控件)

'''
显示列表数据(QListView控件)
'''
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QListView, QMessageBox
from PyQt5.QtCore import QStringListModel
import sys


class ListViewDemo(QWidget):
    def __init__(self, parent=None):
        super(ListViewDemo, self).__init__(parent)
        self.setWindowTitle("QListView 例子")
        self.resize(300, 270)
        layout = QVBoxLayout()

        listview = QListView()      # 创建QListView控件
        listModel = QStringListModel()      # 创建字符串列表模型
        self.list = ["列表项1","列表项2", "列表项3"]         # 数据源

        listModel.setStringList(self.list)      # 将模型与列表数据源相关联

        listview.setModel(listModel)        # 将模型与控件关联
        listview.clicked.connect(self.clicked)      # 绑定控件单击事件
        layout.addWidget(listview)

        self.setLayout(layout)

    def clicked(self,item):
        QMessageBox.information(self,"QListView","您选择了:" + self.list[item.row()])



if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = ListViewDemo()
    win.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

41_扩展的列表控件(QListWidget)

'''
扩展的列表控件(QListWidget)
QListWidget是QListView的子类
'''
from PyQt5.QtWidgets import *
import sys

class ListWidgetDemo(QMainWindow):
	def __init__(self, parent=None):
		super(ListWidgetDemo, self).__init__(parent)
		self.setWindowTitle("QListWidget 例子")
		self.resize(300, 270)
		self.listwidget = QListWidget()
		self.listwidget.addItem("item1")
		self.listwidget.addItem("item2")
		self.listwidget.addItem("item3")
		self.listwidget.addItem("item4")
		self.listwidget.addItem("item5")
		self.listwidget.itemClicked.connect(self.clicked)
		self.setCentralWidget(self.listwidget)		# 设置为中心控件(使其充满整个屏幕)
	def clicked(self,Index):
		QMessageBox.information(self,"QListWidget","您选择了:" + self.listwidget.item(self.listwidget.row(Index)).text())



if __name__ == "__main__":
	app = QApplication(sys.argv)
	win = ListWidgetDemo()
	win.show()
	sys.exit(app.exec_())

效果如下图所示:
在这里插入图片描述

42_扩展的表格控件(TableWidget)


# 扩展的表格控件(QTableWidget)
# QTableWidget是QTableView的子类
# 每一个Cell(单元格)是一个QTableWidgetItem



import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem, QAbstractItemView)


class TableWidgetDemo(QWidget):
    def __init__(self):
        super(TableWidgetDemo,self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("QTableWidget演示")
        self.resize(430, 230);
        layout = QHBoxLayout()
        tablewidget = QTableWidget()        # 创建QTableWidget对象
        tablewidget.setRowCount(4)          # 设置行数
        tablewidget.setColumnCount(3)       # 设置列数

        layout.addWidget(tablewidget)

        tablewidget.setHorizontalHeaderLabels(['姓名','年龄','籍贯'])     # 设置字段名称
        nameItem = QTableWidgetItem("小明")
        tablewidget.setItem(0,0,nameItem)

        ageItem = QTableWidgetItem("24")
        tablewidget.setItem(0,1,ageItem)

        jgItem = QTableWidgetItem("北京")
        tablewidget.setItem(0,2,jgItem)

        # 禁止编辑
        tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers)       # 设置禁止编辑

        # 整行选择
        tablewidget.setSelectionBehavior(QAbstractItemView.SelectRows)
        # 调整列和行(即行与列的大小根据内容调整)
        tablewidget.resizeColumnsToContents()
        tablewidget.resizeRowsToContents()

        # 隐藏或显示水平与垂直表格字段名称
        tablewidget.horizontalHeader().setVisible(True)        # 设置水平表头是否可见
        tablewidget.verticalHeader().setVisible(False)         # 设置垂直头是否课件

        tablewidget.setVerticalHeaderLabels(["a","b"])      # 设置垂直的头名称

        # 隐藏表格线
        tablewidget.setShowGrid(True)       # 设置单元格的网格线是否可见

        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = TableWidgetDemo()
    example.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

43_在单元格中放置控件(PlaceControlInCell)


# 在单元格中放置控件
# setItem:将文本放到单元格中
# setCellWidget:将控件放到单元格中
# setStyleSheet:设置控件的样式(QSS)


import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem, QAbstractItemView,
                              QComboBox, QPushButton)


class PlaceControlInCell(QWidget):
    def __init__(self):
        super(PlaceControlInCell,self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("在单元格中放置控件")
        self.resize(430, 300);
        layout = QHBoxLayout()
        tableWidget = QTableWidget()        # 创建QTableWidget控件
        tableWidget.setRowCount(4)          # 为QTableWidget指定行数
        tableWidget.setColumnCount(3)       # 为QTableWidget指定列数

        layout.addWidget(tableWidget)       # 将QTableWidget添加到布局中

        tableWidget.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])     # 为QTableWidget添加水平的头
        textItem = QTableWidgetItem('小明')
        tableWidget.setItem(0,0,textItem)           # setItem:将文本放到单元格中

        combox = QComboBox()        # 创建下拉列表控件
        combox.addItem('男')
        combox.addItem('女')
        # QSS Qt StyleSheet
        combox.setStyleSheet('QComboBox{margin:3px};')      # setStyleSheet 设置空间的样式属性
        tableWidget.setCellWidget(0,1,combox)           # setCellWidget:将控件放到单元格中

        modifyButton = QPushButton('修改')
        modifyButton.setDown(True)      # 设置空间默认的是按下的状态
        modifyButton.setStyleSheet('QPushButton{margin:3px};')
        tableWidget.setCellWidget(0,2,modifyButton)

        self.setLayout(layout)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = PlaceControlInCell()
    example.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

44_在表表格中搜索Cell和行定位(DataLocation)


# 在表格中快速定位到特定的行
# 1. 数据的定位:findItems  返回一个列表
# 2. 如果找到了满足条件的单元格,会定位到单元格所在的行:setSliderPosition(row)

import sys
from PyQt5.QtWidgets import *
from PyQt5 import QtCore
from PyQt5.QtGui import QColor, QBrush
class DataLocation(QWidget):
    def __init__(self):
        super(DataLocation,self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("QTableWidget 例子")
        self.resize(600, 800);

        layout = QHBoxLayout()
        tableWidget = QTableWidget()        # 创建QTableWidget对象
        tableWidget.setRowCount(40)
        tableWidget.setColumnCount(4)

        layout.addWidget(tableWidget)

        for i in range(40):     # 对行循环
            for j in range(4):      # 对列循环
                itemContent = '(%d,%d)' %(i,j)
                tableWidget.setItem(i,j,QTableWidgetItem(itemContent))
        self.setLayout(layout)


        """*********开始搜索满足条件的Cell*********"""
        # 搜索满足条件的Cell
        text = '(1'     # 表示要搜索的文本内容
        items = tableWidget.findItems(text,QtCore.Qt.MatchStartsWith)       # QtCore.Qt.MatchStartsWith:表示搜索的模式  (模糊匹配)
                                                                            # QtCore.Qt.MatchExactly:表示精确匹配

        if len(items) > 0:
            item = items[0]     # 即满足条件的第一个值
            item.setBackground(QBrush(QColor(0,255,0)))     # 设置背景色
            item.setForeground(QBrush(QColor(255,0,0)))     # 设置文字的颜色

            row = item.row()        # 获取当前项所在的行

            # 定位到指定的行
            tableWidget.verticalScrollBar().setSliderPosition(row)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = DataLocation()
    example.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

45_设置单元格字体和颜色(CellFontAndColor)


# 设置单元格字体和颜色



import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem)
from PyQt5.QtGui import QBrush, QColor, QFont


class CellFontAndColor(QWidget):
    def __init__(self):
        super(CellFontAndColor,self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("设置单元格字体和颜色")
        self.resize(430, 230);
        layout = QHBoxLayout()
        tableWidget = QTableWidget()
        tableWidget.setRowCount(4)
        tableWidget.setColumnCount(3)
        layout.addWidget(tableWidget)

        tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])

        newItem = QTableWidgetItem('雷神')
        newItem.setFont(QFont('Times',14,QFont.Black))
        newItem.setForeground(QBrush(QColor(255,0,0)))      # setForeground:设置字体的颜色,借助QBrush
        tableWidget.setItem(0,0,newItem)

        newItem = QTableWidgetItem('女生')
        newItem.setForeground(QBrush(QColor(255,255,0)))
        newItem.setFont(QFont('Times', 20))     # 设置文字的字体与字号
        newItem.setBackground(QBrush(QColor(0,0,255)))       # setBackground:设置背景色
        tableWidget.setItem(0,1,newItem)

        newItem = QTableWidgetItem('160')
        newItem.setFont(QFont('Times',20,QFont.Black))      # 设置文字的字体与字号、颜色
        newItem.setForeground(QBrush(QColor(0,0,255)))      # setForeground:设置字体的颜色,借助QBrush
        tableWidget.setItem(0,2,newItem)

        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = CellFontAndColor()
    example.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

46_按照表格的某一列进行排序(ColumnSort)


# 按列排序
# 1. 按哪一列排序
# 2. 排序类型:升序或降序
# sortItems(columnIndex,orderType)      第一个参数:列索引;第二个参数:排序类型

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *


class ColumnSort(QWidget):
    def __init__(self):
        super(ColumnSort,self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("按列排序")
        self.resize(430, 230);
        layout = QVBoxLayout()
        self.tableWidget = QTableWidget()       # 创建表格控件
        self.tableWidget.setRowCount(4)
        self.tableWidget.setColumnCount(3)
        layout.addWidget(self.tableWidget)

        self.tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])

        newItem = QTableWidgetItem('张三')
        self.tableWidget.setItem(0,0,newItem)

        newItem=QTableWidgetItem('男')
        self.tableWidget.setItem(0,1,newItem)

        newItem=QTableWidgetItem('165')
        self.tableWidget.setItem(0,2,newItem)

        newItem = QTableWidgetItem('李四')
        self.tableWidget.setItem(1, 0, newItem)

        newItem = QTableWidgetItem('女')
        self.tableWidget.setItem(1, 1, newItem)

        newItem = QTableWidgetItem('160')
        self.tableWidget.setItem(1, 2, newItem)

        newItem = QTableWidgetItem('王五')
        self.tableWidget.setItem(2, 0, newItem)

        newItem = QTableWidgetItem('男')
        self.tableWidget.setItem(2, 1, newItem)

        newItem = QTableWidgetItem('170')
        self.tableWidget.setItem(2, 2, newItem)


        self.button = QPushButton('排序')
        self.button.clicked.connect(self.order)
        layout.addWidget(self.button)

        self.orderType = Qt.DescendingOrder     # 排序类型      默认的是降序
        self.setLayout(layout)


    def order(self):
        if self.orderType == Qt.DescendingOrder:        # 如果当前是降序排列,则调整为升序排列
            self.orderType = Qt.AscendingOrder
        else:
            self.orderType = Qt.DescendingOrder         # 如果当前为升序排列,则调整为降序排列
        self.tableWidget.sortItems(2,self.orderType)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = ColumnSort()
    example.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

47_设置单元格文本的对齐方式(CellTextAlignment)


# 设置单元格的文本对齐方式
# setTextAlignment
# Qt.AlignRight   Qt.AlignBottom

import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem)
from PyQt5.QtCore import Qt
class CellTextAlignment(QWidget):
    def __init__(self):
        super(CellTextAlignment,self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("设置单元格的文本对齐方式")
        self.resize(430, 230);
        layout = QHBoxLayout()
        tableWidget = QTableWidget()        # 创建单元格对象
        tableWidget.setRowCount(4)
        tableWidget.setColumnCount(3)
        layout.addWidget(tableWidget)

        tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])

        newItem = QTableWidgetItem('雷神')
        newItem.setTextAlignment(Qt.AlignRight | Qt.AlignBottom)
        tableWidget.setItem(0,0,newItem)

        newItem = QTableWidgetItem('男')
        # newItem.setTextAlignment(Qt.AlignCenter | Qt.AlignBottom)
        newItem.setTextAlignment(Qt.AlignCenter )
        tableWidget.setItem(0,1,newItem)

        newItem = QTableWidgetItem('190')
        newItem.setTextAlignment(Qt.AlignRight)
        tableWidget.setItem(0,2,newItem)

        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = CellTextAlignment()
    example.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

48_合并单元格(setSpan)


# 合并单元格
# setSpan(row,col,要合并的行数,要合并的列数)

import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem)
class Span(QWidget):
    def __init__(self):
        super(Span,self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("合并单元格")
        self.resize(430, 230);
        layout = QHBoxLayout()
        tableWidget = QTableWidget()
        tableWidget.setRowCount(4)
        tableWidget.setColumnCount(3)
        layout.addWidget(tableWidget)

        tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])

        newItem = QTableWidgetItem('雷神')
        tableWidget.setItem(0,0,newItem)
        tableWidget.setSpan(0, 0, 3, 1)     # 合并单元格

        newItem = QTableWidgetItem('男')
        tableWidget.setItem(0,1,newItem)
        tableWidget.setSpan(0,1,2,1)        # 合并单元格

        newItem = QTableWidgetItem('160')
        tableWidget.setItem(0,2,newItem)
        tableWidget.setSpan(0,2,4,1)            # 合并单元格


        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = Span()
    example.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

49_设置单元格的尺寸(CellSize)


# 设置单元格尺寸
# setRowHeight()     # 设置单元格行的高度
# setColumnWidth()      # 设置单元格列的宽度

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QBrush, QColor, QFont

class CellSize(QWidget):
    def __init__(self):
        super(CellSize,self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("QTableWidget 例子")
        self.resize(530, 300);
        layout = QHBoxLayout()
        tableWidget = QTableWidget()
        tableWidget.resize(250, 250)
        tableWidget.setRowCount(4)
        tableWidget.setColumnCount(3)
        layout.addWidget(tableWidget)

        tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])
        tableWidget.setRowHeight(0, 80)     # 设置单元格的尺寸----0,80)即表示改变第一行的高度为80
        tableWidget.setColumnWidth(2, 120)      # 设置单元格的尺寸------2,120)即表示改变第三列的宽度为120
        tableWidget.setRowHeight(2,100)
        newItem = QTableWidgetItem('雷神')
        newItem.setFont(QFont('Times',10,QFont.Black))
        newItem.setForeground(QBrush(QColor(255,0,0)))
        tableWidget.setItem(0,0,newItem)

        newItem = QTableWidgetItem('女')
        newItem.setForeground(QBrush(QColor(255,255,0)))
        newItem.setBackground(QBrush(QColor(0,0,255)))
        tableWidget.setItem(0,1,newItem)

        newItem = QTableWidgetItem('160')
        newItem.setFont(QFont('Times',10,QFont.Black))
        newItem.setForeground(QBrush(QColor(0,0,255)))
        tableWidget.setItem(0,2,newItem)

        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = CellSize()
    example.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

50_在单元格中实现图文混排的效果


# 在单元格中实现图文混排的效果


import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *



class CellImageText(QWidget):

    def __init__(self):
        super(CellImageText,self).__init__()
        self.initUI()
    def initUI(self):
        self.setWindowTitle("在单元格中实现图文混排的效果")
        self.resize(500, 300);
        layout = QHBoxLayout()
        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(5)
        self.tableWidget.setColumnCount(4)
        layout.addWidget(self.tableWidget)

        self.tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重', '显示图片'])

        newItem = QTableWidgetItem('李宁')
        self.tableWidget.setItem(0,0,newItem)

        newItem = QTableWidgetItem('男')
        self.tableWidget.setItem(0,1,newItem)

        newItem = QTableWidgetItem('160')
        self.tableWidget.setItem(0,2,newItem)

        newItem = QTableWidgetItem(QIcon('./images/bao1.png'),'背包')
        self.tableWidget.setItem(0,3,newItem)



        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = CellImageText()
    example.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

51_改变单元格中图像的尺寸



# 改变单元格中图片的尺寸
#
# setIconSize(QSize(width,height))



import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class CellImageSize(QWidget):
    def __init__(self):
        super(CellImageSize,self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("改变单元格中图片的尺寸")
        self.resize(1000, 900);
        layout = QHBoxLayout()

        tablewidget = QTableWidget()
        tablewidget.setIconSize(QSize(300,200))         # 设置表格内图像的像素值
        tablewidget.setRowCount(5)          # 设置表格的行数
        tablewidget.setColumnCount(3)       # 设置表格的列数

        tablewidget.setHorizontalHeaderLabels(['图片1', '图片2', '图片3'])

        # 让列的宽度和图片的宽度相同
        for i in range(3):
            tablewidget.setColumnWidth(i,300)       # 设置表格的列宽度

        # 让行的高度和图片的高度相同
        for i in range(15):
            tablewidget.setRowHeight(i,200)         # 设置表格的行宽度

        for k in range(15):
            i = k / 3   # 行
            j = k % 3   # 列
            item = QTableWidgetItem()
            item.setIcon(QIcon('./images/bao%d.png' % k))       # 改变单元格中图像的尺寸
            tablewidget.setItem(i,j,item)

        layout.addWidget(tablewidget)

        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = CellImageSize()
    example.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

52_在表格中显示上下文菜单



# 在表格中显示上下文菜单
#
# 1.  如何弹出菜单
# 2.  如果在满足条件的情况下弹出菜单
#
# QMenu.exec_     弹出菜单


import sys
from PyQt5.QtWidgets import (QMenu, QPushButton, QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem,
                             QHeaderView)
from PyQt5.QtCore import QObject, Qt
class TableWidgetContextMenu(QWidget):

    def __init__(self):
        super(TableWidgetContextMenu,self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("在表格中显示上下文菜单")
        self.resize(500, 300);
        layout = QHBoxLayout()
        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(5)
        self.tableWidget.setColumnCount(3)
        layout.addWidget(self.tableWidget)

        self.tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重'])


        newItem = QTableWidgetItem("张三")
        self.tableWidget.setItem(0, 0, newItem)

        newItem = QTableWidgetItem("男")
        self.tableWidget.setItem(0, 1, newItem)

        newItem = QTableWidgetItem("160")
        self.tableWidget.setItem(0, 2, newItem)
        # 表格中第二行记录
        newItem = QTableWidgetItem("李四")
        self.tableWidget.setItem(1, 0, newItem)

        newItem = QTableWidgetItem("女")
        self.tableWidget.setItem(1, 1, newItem)

        newItem = QTableWidgetItem("170")
        self.tableWidget.setItem(1, 2, newItem)

        # 表格中第二行记录
        newItem = QTableWidgetItem("李")
        self.tableWidget.setItem(2, 0, newItem)

        newItem = QTableWidgetItem("女")
        self.tableWidget.setItem(2, 1, newItem)

        newItem = QTableWidgetItem("170")
        self.tableWidget.setItem(2, 2, newItem)

        self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu)         # 允许弹出上下文菜单

        self.tableWidget.customContextMenuRequested.connect(self.generateMenu)      # 将信号请求连接到槽函数

        self.setLayout(layout)

    def generateMenu(self,pos):
        print(pos)      # pos:单击鼠标右键,会返回相对于屏幕的坐标

        # 获取当前所选择的行
        for i in self.tableWidget.selectionModel().selection().indexes():
            rowNum = i.row()
        # 如果选择的行索引小于2,弹出上下文菜单
        if rowNum < 2:
            menu = QMenu()      # 创建上下文菜单
            item1 = menu.addAction("菜单项1")
            item2 = menu.addAction("菜单项2")
            item3 = menu.addAction("菜单项3")
            screenPos = self.tableWidget.mapToGlobal(pos)       # 将屏幕坐标映射到相对于窗口的位置
            print(screenPos)
            # 被阻塞
            action = menu.exec(screenPos)       # 在单击鼠标的位置显示菜单
            if action == item1:
                print('选择了第1个菜单项',self.tableWidget.item(rowNum,0).text(),           # item(rowNum,0)  表示当前点击的行,第一列
                                        self.tableWidget.item(rowNum,1).text(),
                                        self.tableWidget.item(rowNum, 2).text())
            elif action == item2:
                print('选择了第2个菜单项',self.tableWidget.item(rowNum,0).text(),
                                        self.tableWidget.item(rowNum,1).text(),
                                        self.tableWidget.item(rowNum, 2).text())
            elif action == item3:
                print('选择了第3个菜单项',self.tableWidget.item(rowNum,0).text(),
                                        self.tableWidget.item(rowNum,1).text(),
                                        self.tableWidget.item(rowNum, 2).text())
            else:
                return




if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = TableWidgetContextMenu()
    example.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

53_树节点控件(QTreeWidget)


# 树控件(QTreeWidget)的基本用法

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon, QBrush, QColor
from PyQt5.QtCore import Qt


class BasicTreeWidget(QMainWindow):
    def __init__(self, parent=None):
        super(BasicTreeWidget, self).__init__(parent)
        self.setWindowTitle('树控件(QTreeWidget)的基本用法')

        self.tree = QTreeWidget()       # 创建树控件
        # 为树控件指定列数
        self.tree.setColumnCount(2)     # 为树控件指定列数

        # 指定列标签
        self.tree.setHeaderLabels(['Key','Value'])      # 指定列标签

        root = QTreeWidgetItem(self.tree)           # 将根节点放置到tree上
        root.setText(0,'根节点')
        root.setIcon(0,QIcon('./images/root.png'))

        self.tree.setColumnWidth(0,160)     # 即给第一列设置列宽

        # 添加子节点1
        child1 = QTreeWidgetItem(root)          # 给根节点添加子节点
        child1.setText(0,'子节点1')                # 设置第一列文本
        child1.setText(1,'子节点1的数据')             # 设置第二列文本
        child1.setIcon(0,QIcon('./images/bao3.png'))
        child1.setCheckState(0,Qt.Checked)          # 给节点添加复选框


        # 添加子节点2
        child2 = QTreeWidgetItem(root)          # 表示将第二个子节点添加到根节点
        child2.setText(0,'子节点2')
        child2.setIcon(0,QIcon('./images/bao6.png'))

        # 为child2添加一个子节点
        child3 = QTreeWidgetItem(child2)
        child3.setText(0,'子节点2-1')
        child3.setText(1,'新的值')
        child3.setIcon(0,QIcon('./images/music.png'))


        self.tree.expandAll()       # 设置所有节点默认为打开状态

        self.setCentralWidget(self.tree)        # 使其作为中心控件充满整个屏幕


if __name__ == '__main__':
    app = QApplication(sys.argv)
    tree = BasicTreeWidget()
    tree.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

54_为树控设置响应事件


# 为树节点添加响应事件

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys

class TreeEvent(QMainWindow):
    def __init__(self, parent=None):
        super(TreeEvent, self).__init__(parent)
        self.setWindowTitle('为树节点添加响应事件')

        self.tree = QTreeWidget()       # 创建树控件

        self.tree.setColumnCount(2)     # 为树控件指定列数

        self.tree.setHeaderLabels(['Key','Value'])      # 设置树的头标签

        root  = QTreeWidgetItem(self.tree)          # 创建树的根节点
        root.setText(0,'root')
        root.setText(1, '0')

        child1 = QTreeWidgetItem(root)          # 给根节点创建第一个子节点
        child1.setText(0,'child1')
        child1.setText(1,'1')

        child2 = QTreeWidgetItem(root)          # 给根节点创建第二个子节点
        child2.setText(0,'child2')
        child2.setText(1,'2')

        child3 = QTreeWidgetItem(child2)
        child3.setText(0,'child3')
        child3.setText(1,'3')
        self.tree.clicked.connect(self.onTreeClicked)       # 给树控件绑定点击事件

        self.setCentralWidget(self.tree)        # 把树控件设置为中心控件
    def onTreeClicked(self,index):
        item = self.tree.currentItem()
        print(index.row())
        print('key=%s,value=%s' % (item.text(0),item.text(1)))          # item.text(0):获得节点值;item.text(1):获得value值

if __name__ == '__main__':
    app = QApplication(sys.argv)
    tree = TreeEvent()
    tree.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

55_增加、修改、删除树控件中的节点


# 添加、修改和删除树控件中的节点


import sys
from PyQt5.QtWidgets import *
class ModifyTree(QWidget):
    def __init__(self, parent=None):
        super(ModifyTree, self).__init__(parent)
        self.setWindowTitle('TreeWidget 例子')

        operatorLayout = QHBoxLayout()
        addBtn = QPushButton('添加节点')
        updateBtn = QPushButton('修改节点')
        deleteBtn = QPushButton('删除节点')

        operatorLayout.addWidget(addBtn)
        operatorLayout.addWidget(updateBtn)
        operatorLayout.addWidget(deleteBtn)

        addBtn.clicked.connect(self.addNode)
        updateBtn.clicked.connect(self.updateNode)
        deleteBtn.clicked.connect(self.deleteNode)

        self.tree = QTreeWidget()       # 创建树控件

        self.tree.setColumnCount(2)

        self.tree.setHeaderLabels(['Key','Value'])

        root  = QTreeWidgetItem(self.tree)
        root.setText(0,'root')
        root.setText(1, '0')

        child1 = QTreeWidgetItem(root)
        child1.setText(0,'child1')
        child1.setText(1,'1')

        child2 = QTreeWidgetItem(root)
        child2.setText(0,'child2')
        child2.setText(1,'2')

        child3 = QTreeWidgetItem(child2)
        child3.setText(0,'child3')
        child3.setText(1,'3')


        self.tree.clicked.connect(self.onTreeClicked)

        mainLayout = QVBoxLayout(self)
        mainLayout.addLayout(operatorLayout)
        mainLayout.addWidget(self.tree)
        self.setLayout(mainLayout)

    def onTreeClicked(self,index):
        item = self.tree.currentItem()
        print(index.row())
        print('key=%s,value=%s' % (item.text(0),item.text(1)))

    # 添加节点
    def addNode(self):
        print('添加节点')
        item = self.tree.currentItem()      # 获取当前的点击节点的对象
        print(item)
        node = QTreeWidgetItem(item)        # 添加新的节点
        node.setText(0,'新节点')
        node.setText(1,'新值')

    def updateNode(self):
        print('修改节点')
        item = self.tree.currentItem()
        item.setText(0,'修改节点')
        item.setText(1, '值已经被修改')



    def deleteNode(self):
        print('删除节点')
        item = self.tree.currentItem()
        root = self.tree.invisibleRootItem()        # 也可能是多选,所以使用一下循环
        for item in self.tree.selectedItems():
            (item.parent() or root).removeChild(item)       # 求 利用点击的当前节点的父节点删除该节点





if __name__ == '__main__':
    app = QApplication(sys.argv)
    tree = ModifyTree()
    tree.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

56_QTreeView控件与体统定制模式

#
# QTreeView控件与系统定制模式
#
# QTreeWidget
#
# Model

# QDirModel       # 用来显示当前操作系统的目录结构


import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *


if __name__ == '__main__':
    app = QApplication(sys.argv)
    model = QDirModel()     # 用于显示目录结构的模型
    tree = QTreeView()      # chuangjkia
    tree.setModel(model)

    tree.setWindowTitle("QTreeView")
    tree.resize(600,400)
    tree.show()


    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

57_选项卡控件TabWidget

# 选项卡控件:QTabWidget

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class TabWidgetDemo(QTabWidget):
    def __init__(self, parent=None):
        super(TabWidgetDemo, self).__init__(parent)

        self.setWindowTitle("选项卡控件:QTabWidget")

        # 创建用于显示控件的窗口
        self.tab1 = QWidget()
        self.tab2 = QWidget()
        self.tab3 = QWidget()
        self.resize(300,00)
        # 将三个窗口与三个选项卡绑定
        self.addTab(self.tab1,'选项卡1')       # 第一个参数是窗口对象,第二个参数是选项卡的名称
        self.addTab(self.tab2,'选项卡2')
        self.addTab(self.tab3,'选项卡3')

        self.tab1UI()
        self.tab2UI()
        self.tab3UI()

    def tab1UI(self):
        layout = QFormLayout()      # 创建表单控件
        layout.addRow('姓名',QLineEdit())
        layout.addRow('地址',QLineEdit())
        self.setTabText(0,'联系方式')       # 设置选项卡的标题
        self.tab1.setLayout(layout)     # 将表单控件进行装载

    def tab2UI(self):
        layout = QFormLayout()
        sex = QHBoxLayout()

        sex_QRadio=QRadioButton('男')
        sex_QRadio.setChecked(True)     # 设置复选框默认选中状态
        sex.addWidget(sex_QRadio)
        sex.addWidget(QRadioButton('女'))
        layout.addRow(QLabel('性别'),sex)
        layout.addRow('生日',QLineEdit())
        self.setTabText(1,'个人详细信息')     # 设置选项卡的标题
        self.tab2.setLayout(layout)

    def tab3UI(self):
        layout = QHBoxLayout()
        layout.addWidget(QLabel('科目'))
        layout.addWidget(QCheckBox('物理'))
        layout.addWidget(QCheckBox('高数'))
        self.setTabText(2,'教育程度')
        self.tab3.setLayout(layout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = TabWidgetDemo()
    demo.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

58_堆栈窗口控件QStackedWidget


# 堆栈窗口控件(QStackedWidget)

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class StackedExample(QWidget):
    def __init__(self):
        super(StackedExample, self).__init__()
        self.setGeometry(600, 500, 400, 150)
        self.setWindowTitle('堆栈窗口控件(QStackedWidget)')

        self.list = QListWidget()       # 创建列表控件
        self.list.insertItem(0,'联系方式')
        self.list.insertItem(1,'个人信息')
        self.list.insertItem(2,'教育程度')

        self.stack1 = QWidget()
        self.stack2 = QWidget()
        self.stack3 = QWidget()

        self.tab1UI()
        self.tab2UI()
        self.tab3UI()

        self.stack = QStackedWidget()       # 创建堆栈窗口控件
        self.stack.addWidget(self.stack1)       # 将创建的窗口添加至堆栈窗口控件中
        self.stack.addWidget(self.stack2)
        self.stack.addWidget(self.stack3)

        hbox = QHBoxLayout()        # 创建水平布局,左侧显示列表,右侧显示堆栈的页面
        hbox.addWidget(self.list)       #
        hbox.addWidget(self.stack)
        self.setLayout(hbox)

        self.list.currentRowChanged.connect(self.display)       # 为列表添加一个事件,即当前行变化
    def tab1UI(self):
        layout = QFormLayout()
        layout.addRow('姓名',QLineEdit())
        layout.addRow('地址',QLineEdit())

        self.stack1.setLayout(layout)

    def tab2UI(self):
        layout = QFormLayout()
        sex = QHBoxLayout()
        sex.addWidget(QRadioButton('男'))
        sex.addWidget(QRadioButton('女'))
        layout.addRow(QLabel('性别'),sex)
        layout.addRow('生日',QLineEdit())

        self.stack2.setLayout(layout)

    def tab3UI(self):
        layout = QHBoxLayout()
        layout.addWidget(QLabel('科目'))
        layout.addWidget(QCheckBox('物理'))
        layout.addWidget(QCheckBox('高数'))

        self.stack3.setLayout(layout)

    def display(self,index):
        self.stack.setCurrentIndex(index)       # 即根据索引,切换堆栈窗口中的页面

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = StackedExample()
    demo.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

59_停靠窗口控件DockWidget


# 停靠控件(QDockWidget)

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class DockDemo(QMainWindow):
    def __init__(self, parent=None):
        super(DockDemo, self).__init__(parent)

        self.setWindowTitle("停靠控件(QDockWidget)")

        self.items = QDockWidget('Dockable',self)         # 创建停靠控件
        self.listWidget = QListWidget()                   # 创建列表控件
        self.listWidget.addItem('item1')
        self.listWidget.addItem('item2')
        self.listWidget.addItem('item3')

        self.items.setWidget(self.listWidget)       # 将列表控件添加至停靠控件中

        self.setCentralWidget(QLineEdit())      # 在当前窗口放置一个QLineEdit控件

        # self.items.setFloating(True)        # 设置停靠窗口默认是悬浮的状态
        self.items.setFloating(False)

        self.addDockWidget(Qt.RightDockWidgetArea,self.items)           # 在当前窗口中添加停留控件,并设置默认停靠的区域




if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = DockDemo()
    demo.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

60_创建可以容纳多文档的窗口


# 容纳多文档的窗口
# QMdiArea
# QMdiSubWindow


import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class MultiWindows(QMainWindow):
    count = 0

    def __init__(self, parent=None):
        super(MultiWindows, self).__init__(parent)

        self.setWindowTitle("容纳多文档的窗口")

        self.mdi = QMdiArea()       # 创建可以容纳多个子窗口的窗口(相当于窗口的容器)
        self.setCentralWidget(self.mdi)
        bar = self.menuBar()        # 创建菜单栏对象
        file = bar.addMenu("File")  # 添加菜单
        file.addAction("New")       # 添加子菜单
        file.addAction("cascade")   # 添加子菜单
        file.addAction("Tiled")     # 添加子菜单

        file.triggered.connect(self.windowaction)       # 给菜单添加点击动作
    def windowaction(self,q):
        print(q.text())
        if q.text() == "New":
            MultiWindows.count = MultiWindows.count + 1
            sub = QMdiSubWindow()       # 创建子窗口
            sub.setWidget(QTextEdit())
            sub.setWindowTitle("子窗口" + str(MultiWindows.count))
            self.mdi.addSubWindow(sub)      # 将子窗口添加到窗口容器
            sub.show()
        elif q.text() == "cascade":
            self.mdi.cascadeSubWindows()    # 设置层叠方式
        elif q.text() == "Tiled":
            self.mdi.tileSubWindows()       # 设置层叠方式



if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = MultiWindows()
    demo.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

61_滚动条控件ScrollBar


# 滚动条控件(QScrollBar)
# QScrollBar的作用
# 1. 通过滚动条值的变化控制其他控件状态的变化
# 2. 通过滚动条值的变化控制控件位置的变化

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class ScrollBar(QWidget):
    def __init__(self):
        super(ScrollBar, self).__init__()
        self.initUI()

    def initUI(self):
        hbox = QHBoxLayout()
        self.label = QLabel('拖动滚动条去改变文字颜色')

        hbox.addWidget(self.label)

        self.scrollbar1 = QScrollBar()  # 创建滚动条控件
        self.scrollbar1.setMaximum(255)  # 设置滚动条控件的最大值
        self.scrollbar1.sliderMoved.connect(self.sliderMoved)  # 绑定滚动条滑动事件

        self.scrollbar2 = QScrollBar()
        self.scrollbar2.setMaximum(255)
        self.scrollbar2.sliderMoved.connect(self.sliderMoved)  # 绑定滚动条滑动事件

        self.scrollbar3 = QScrollBar()
        self.scrollbar3.setMaximum(255)
        self.scrollbar3.sliderMoved.connect(self.sliderMoved)  # 绑定滚动条滑动事件

        self.scrollbar4 = QScrollBar()
        self.scrollbar4.setMaximum(255)
        self.scrollbar4.sliderMoved.connect(self.sliderMoved1)  # 绑定滚动条滑动事件

        hbox.addWidget(self.scrollbar1)
        hbox.addWidget(self.scrollbar2)
        hbox.addWidget(self.scrollbar3)
        hbox.addWidget(self.scrollbar4)
        self.setGeometry(300, 300, 300, 200)

        self.setLayout(hbox)  # 将水平布局添加到窗口中

        self.y = self.label.pos().y()  # 获取到QLabel控件的位置坐标

    def sliderMoved(self):
        print(self.scrollbar1.value(), self.scrollbar2.value(), self.scrollbar3.value())
        palette = QPalette()  # 创建调色板对象,用于设置颜色
        c = QColor(self.scrollbar1.value(), self.scrollbar2.value(), self.scrollbar3.value(), 255)
        palette.setColor(QPalette.Foreground, c)
        self.label.setPalette(palette)  # 给QLabel控件设置颜色

    def sliderMoved1(self):
        self.label.move(self.label.x(), self.y + self.scrollbar4.value())  # QLabel控件位置的位移动作


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = ScrollBar()
    demo.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

62_动态显示当前时间ShowTime


# 动态显示当前时间
# QTimer      # 定时器类
# QThread
#
# 多线程:用于同时完成多个任务


from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QListWidget, QGridLayout, QLabel
from PyQt5.QtCore import QTimer, QDateTime
import sys

class ShowTime(QWidget):
    def __init__(self, parent=None):
        super(ShowTime, self).__init__(parent)
        self.setWindowTitle("动态显示当前时间")
        self.resize(300,150)
        self.label = QLabel('显示当前时间')
        self.startBtn = QPushButton('开始')
        self.endBtn = QPushButton('结束')
        layout= QGridLayout()

        self.timer = QTimer()       # 创建定时器QTimer()对象
        self.timer.timeout.connect(self.showTime)       # 绑定时间响应函数

        layout.addWidget(self.label,0,0,1,2)
        layout.addWidget(self.startBtn,1,0)
        layout.addWidget(self.endBtn,1,1)

        self.startBtn.clicked.connect(self.startTimer)
        self.endBtn.clicked.connect(self.endTimer)

        self.setLayout(layout)

    def showTime(self):
        time = QDateTime.currentDateTime()      # 获取当前时间

        timeDisplay = time.toString("yyyy-MM-dd hh:mm:ss dddd")
        self.label.setText(timeDisplay)

    def startTimer(self):
        self.timer.start(1000)      # 开始计时器,并设置时间间隔
        self.startBtn.setEnabled(False)     # 并且开始之后,就把该按钮设置为False
        self.endBtn.setEnabled(True)        #

    def endTimer(self):
        self.timer.stop()           # 停止计时
        self.startBtn.setEnabled(True)
        self.endBtn.setEnabled(False)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = ShowTime()
    form.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

63_让窗口定时关闭


# 让程序定时关闭
# QTimer.singleShot


import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

if __name__ == '__main__':
    app = QApplication(sys.argv)
    label = QLabel('<font color=red size=140><b>Hello World,窗口在5秒后自动关闭!</b></font>')
    label.setWindowFlags(Qt.SplashScreen | Qt.FramelessWindowHint)          # 设置窗口的标题栏隐藏,并且是无框架窗口
    label.show()
    QTimer.singleShot(10000,app.quit)        # 即在一段时间后执行代码一次

    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

64_使用线程类(Counter)


# 使用线程类(QThread)编写计数器
#
# QThread
# def run(self):
#    while True:
#        self.sleep(1)
#        if sec == 5:
#            break;
#
# QLCDNumber:模拟lLED的显示控件
# WorkThread(QThread)
# 用到自定义信号



import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

sec = 0

class WorkThread(QThread):      # 创建工作线程类
    timer = pyqtSignal()   # 每隔1秒发送一次信号
    end = pyqtSignal()     # 计数完成后发送一次信号
    def run(self):
        while True:
            self.sleep(1)  # 休眠1秒           # 睡眠1秒,是为了防止其执行的极快
            if sec == 25:
                self.end.emit()   # 发送end信号     实际上是调用了与这个信号关联的槽方法
                break
            self.timer.emit()   # 发送timer信号     实际上是调用了与这个信号关联的槽方法

class Counter(QWidget):

    def __init__(self, parent=None):
        super(Counter, self).__init__(parent)

        self.setWindowTitle("使用线程类(QThread)编写计数器")
        self.resize(300, 120)

        layout = QVBoxLayout()
        self.lcdNumber = QLCDNumber()      # 模拟lLED的显示控件
        layout.addWidget(self.lcdNumber)

        button = QPushButton('开始计数')
        layout.addWidget(button)

        self.workThread = WorkThread()      # 创建工作线程的实例

        self.workThread.timer.connect(self.countTime)       # 编写槽方法,与工作信号关联
        self.workThread.end.connect(self.end)
        button.clicked.connect(self.work)

        self.setLayout(layout)

    def countTime(self):
        global sec
        sec += 1
        self.lcdNumber.display(sec)     # 模拟lLED的显示控件,显示字符串

    def end(self):
        QMessageBox.information(self,'消息','计数结束',QMessageBox.Ok)

    def work(self):
        self.workThread.start()




if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Counter()
    form.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

65_用web浏览器显示网页(WebEngineView)


# 用Web浏览器控件(QWebEngineView)显示网页
# PyQt5和Web的交互技术
# 同时使用Python和Web开发程序,混合开发
# Python+JavaScript+HTML5+CSS
# QWebEngineView      # 此控件是用来显示web页面的



from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *
import sys

class WebEngineView(QMainWindow):

    def __init__(self ):
        super(WebEngineView, self).__init__()
        self.setWindowTitle('打开外部网页例子')
        self.setGeometry(5, 30, 1355, 730)
        self.browser = QWebEngineView()         # 创建web浏览器控件
        self.browser.load(QUrl('https://www.jd.com'))
        self.setCentralWidget(self.browser)


if __name__ == '__main__':
	app = QApplication(sys.argv)
	win = WebEngineView()
	win.show()
	sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

66_装载本地的web页面

66_装载本地的web页面.py 文件



# 装载本地Web页面



from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *
import sys
import os
class WebEngineView(QMainWindow):

    def __init__(self ):
        super(WebEngineView, self).__init__()
        self.setWindowTitle('装载本地Web页面')
        self.setGeometry(5, 30, 1355, 730)
        url = os.getcwd() + '/66_装载本地的web页面.html'

        self.browser = QWebEngineView()     # 创建web浏览器控件
        self.browser.load(QUrl.fromLocalFile(url))

        self.setCentralWidget(self.browser)


        print(os.getcwd())
if __name__ == '__main__':
	app = QApplication(sys.argv)
	win = WebEngineView()
	win.show()
	sys.exit(app.exec_())

66_装载本地的web页面.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试页面</title>
</head>
<body>
    <h1>Hello PyQt5</h1>
    <h2>Hello PyQt5</h2>
    <h3>Hello PyQt5</h3>
    <h4>Hello PyQt5</h4>
</body>
</html>

显示效果如下所示:
在这里插入图片描述

67_显示嵌入的web页面



# 显示嵌入Web页面



from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *
import sys
import os
class InnerHTML(QMainWindow):

    def __init__(self ):
        super(InnerHTML, self).__init__()
        self.setWindowTitle('显示嵌入Web页面')
        self.setGeometry(5, 30, 1355, 730)

        self.browser = QWebEngineView()     # 创建web浏览器控件
        self.browser.setHtml('''
        
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>测试页面</title>
        </head>
        <body>
            <h1>Hello PyQt5</h1>
            <h2>Hello PyQt5</h2>
            <h3>Hello PyQt5</h3>
            <h4>Hello PyQt5</h4>
        </body>
        </html>
        ''')
        self.setCentralWidget(self.browser)

if __name__ == '__main__':
	app = QApplication(sys.argv)
	win = InnerHTML()
	win.show()
	sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

67_显示嵌入的web页面



# 显示嵌入Web页面



from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *
import sys
import os
class InnerHTML(QMainWindow):

    def __init__(self ):
        super(InnerHTML, self).__init__()
        self.setWindowTitle('显示嵌入Web页面')
        self.setGeometry(5, 30, 1355, 730)

        self.browser = QWebEngineView()     # 创建web浏览器控件
        self.browser.setHtml('''
        
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>测试页面</title>
        </head>
        <body>
            <h1>Hello PyQt5</h1>
            <h2>Hello PyQt5</h2>
            <h3>Hello PyQt5</h3>
            <h4>Hello PyQt5</h4>
        </body>
        </html>
        ''')
        self.setCentralWidget(self.browser)

if __name__ == '__main__':
	app = QApplication(sys.argv)
	win = InnerHTML()
	win.show()
	sys.exit(app.exec_())


显示效果如下所示:
在这里插入图片描述

68_pyqt5调用javaScript代码

68_pyqt5调用javaScript代码.py 文件


# PyQt5调用JavaScript代码
# PyQt5和JavaScript交互
#
# 什么叫交互
#
# PyQt5 <-> JavaScript


from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *
import sys
import os


class PyQtCallJS(QWidget):

    def __init__(self):
        super(PyQtCallJS, self).__init__()
        self.setWindowTitle('PyQt5调用JavaScript')
        self.setGeometry(5, 30, 1355, 730)
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)
        self.browser = QWebEngineView()     # 创建web浏览器控件

        url = os.getcwd() + '/68_pyqt5调用javaScript代码.html'
        self.browser.load(QUrl.fromLocalFile(url))          # 装载本地的html页面

        self.layout.addWidget(self.browser)

        button = QPushButton('设置全名')
        button.clicked.connect(self.fullname)
        self.layout.addWidget(button)

    def js_callback(self,result):
        print(result)
    def fullname(self):
        self.value = 'hello world'
        self.browser.page().runJavaScript('fullname_function_name("' + self.value + '");',self.js_callback)           # self.js_callback为一个回调函数,即javaScript返回的值
if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = PyQtCallJS()
    win.show()
    sys.exit(app.exec_())

68_pyqt5调用javaScript代码.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试页面</title>
    <script>
        function fullname_function_name(value) {
            alert("<" + value +">")
            var firstname = document.getElementById('firstname').value;
            var lastname = document.getElementById('lastname').value;

            var fullname = firstname + ' ' + lastname;

            document.getElementById('fullname').value = fullname;
            document.getElementById('submit-btn').style.display = 'block';
            return fullname;
        }

    </script>
</head>
<body>
    <form>
        <label>First Name:</label>
        <input type="text" name="firstname" id="firstname" placeholder="name"></input>
        <br/>
        <label>Last Name:</label>
        <input type="text" name="lastname" id="lastname"></input>
        <br/>
        <label>Full Name:</label>
        <input type="text" name="fullname" id="fullname"></input>
        <br/>
        <input  style="display:none;" type="submit" id="submit-btn" />
    </form>
</body>
</html>

显示效果如下所示:
在这里插入图片描述

69_javaScript调用pythonAPI计算阶乘

在这里插入图片描述

PyFactorial.py 文件

from PyQt5.QtWidgets  import *
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import *
from MySharedObject  import MySharedObject
from PyQt5.QtWebChannel import  QWebChannel
import sys
import os



# JavaScript调用Python函数计算阶乘
#
# 将Python的一个对象映射到JavaScript中
#
# 将槽函数映射到JavaScript中



from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *
import sys
import os
from factorial import *

channel = QWebChannel()     # pyqt5中的
factorial = Factorial()
class PyFactorial(QWidget):

    def __init__(self):
        super(PyFactorial, self).__init__()
        self.setWindowTitle('Python计算阶乘')
        self.resize(600,300)
        layout=QVBoxLayout()

        self.browser = QWebEngineView()     # 创建Web浏览器控件
        url = os.getcwd() + '/f.html'
        self.browser.load(QUrl.fromLocalFile(url))      # 装载html
        channel.registerObject("obj",factorial)         # 注册对象  第一个参数是字符串,第二个参数是实际映射的对象
        self.browser.page().setWebChannel(channel)          # 将channel设置到Web浏览器控件上

        layout.addWidget(self.browser)
        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = PyFactorial()
    win.show()
    sys.exit(app.exec_())

factorial.py 文件

from PyQt5.QtCore import *
class Factorial(QObject):
    @pyqtSlot(int, result=int)      # 定义槽函数,需要传入参数的话,则标明传入参数类型;需要返回结果的话,则通过命名参数指明返回结果
    def factorial(self,n):
        if n == 0 or n == 1:
            return 1
        else:
            return self.factorial(n - 1) * n


if __name__ == '__main__':
    factorial = Factorial()
    print(factorial.factorial(99))

f.html 文件

 <html>
    <head>
      <title>A Demo Page</title>
      <meta charset="UTF-8">
      <script src="./qwebchannel.js"></script>
      <script language="javascript">

        function callback(result) {
            alert('计算结果:' + result)
        }

        document.addEventListener("DOMContentLoaded", function () {

        	new QWebChannel( qt.webChannelTransport, function(channel) {

	            window.obj = channel.objects.obj;
	        });
        });

	      function onFactorial() {

	        if ( window.obj) {

                var n = parseInt(document.getElementById('n').value);
                window.obj.factorial(n,callback)        // 其为异步调用,所以需要指明回调函数
	        }
        }
      </script>
    </head>

    <body>
      <form>
        <label >请输入N:</label>
        <input type="text"  id="n"></input>
        <br />
        <input type="button" value="计算阶乘" onclick="onFactorial()">

      </form>
    </body>
  </html>

显示效果如下所示:
在这里插入图片描述

70_pyqt5绝对布局


# 绝对布局


import sys,math
from PyQt5.QtWidgets import *


class AbsoluteLayout(QWidget) :
    def __init__(self):
        super(AbsoluteLayout,self).__init__()
        self.setWindowTitle("绝对布局")

        self.label1 = QLabel('欢迎',self)
        self.label1.move(15,20)

        self.label2 = QLabel('学习',self)
        self.label2.move(35,40)

        self.label3 = QLabel('PyQt5',self)
        self.label3.move(55,80)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = AbsoluteLayout()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

71_创建水平盒布局(HBoxLayout)


# 水平盒布局(QHBoxLayout)

import sys,math
from PyQt5.QtWidgets import *

class HBoxLayout(QWidget) :
    def __init__(self):
        super(HBoxLayout,self).__init__()
        self.setWindowTitle("水平盒布局")

        hlayout = QHBoxLayout()     # 创建水平盒布局
        hlayout.addWidget(QPushButton('按钮1'))
        hlayout.addWidget(QPushButton('按钮2'))
        hlayout.addWidget(QPushButton('按钮3'))
        hlayout.addWidget(QPushButton('按钮4'))
        hlayout.addWidget(QPushButton('按钮5'))
        hlayout.setSpacing(40)      # 设置控件间的间距
        self.setLayout(hlayout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = HBoxLayout()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

72_设置控件的对齐方式(HBoxLayoutAlign)


# 设置控件的对齐方式


import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt


class HBoxLayoutAlign(QWidget) :
    def __init__(self):
        super(HBoxLayoutAlign,self).__init__()
        self.setWindowTitle("水平盒布局")

        hlayout = QHBoxLayout()     # 水平盒布局
        hlayout.addWidget(QPushButton('按钮1'),2,Qt.AlignLeft | Qt.AlignTop)          # 第一个参数是:传入的控件;第二个参数是:拉伸所占的控件的比例;第三个参数是:对齐方式
        hlayout.addWidget(QPushButton('按钮2'),4,Qt.AlignLeft | Qt.AlignTop)
        hlayout.addWidget(QPushButton('按钮3'),1,Qt.AlignLeft | Qt.AlignTop)
        hlayout.addWidget(QPushButton('按钮4'),1,Qt.AlignLeft | Qt.AlignBottom)
        hlayout.addWidget(QPushButton('按钮5'),1,Qt.AlignLeft | Qt.AlignBottom)
        hlayout.setSpacing(40)
        self.setLayout(hlayout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = HBoxLayoutAlign()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

73_创建垂直盒布局(VBoxLayout)


# 垂直盒布局(QBoxLayout)

import sys,math
from PyQt5.QtWidgets import *

class VBoxLayout(QWidget) :
    def __init__(self):
        super(VBoxLayout,self).__init__()
        self.setWindowTitle("垂直盒布局")

        layout = QVBoxLayout()      # 创建垂直盒布局
        layout.addWidget(QPushButton('按钮1'))
        layout.addWidget(QPushButton('按钮2'))
        layout.addWidget(QPushButton('按钮3'))
        layout.addWidget(QPushButton('按钮4'))
        layout.addWidget(QPushButton('按钮5'))

        self.setLayout(layout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = VBoxLayout()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

74_设置布局的伸缩量(addStretch)


# 设置伸缩量(addStretch)

import sys,math
from PyQt5.QtWidgets import *
class Stretch(QWidget) :
    def __init__(self):
        super(Stretch,self).__init__()
        self.setWindowTitle("设置伸缩量")
        btn1 = QPushButton(self)
        btn2 = QPushButton(self)
        btn3 = QPushButton(self)
        btn1.setText("按钮1")
        btn2.setText("按钮2")
        btn3.setText("按钮3")

        layout = QHBoxLayout()

        layout.addStretch(1)
        layout.addWidget(btn1)

        layout.addStretch(2)
        layout.addWidget(btn2)
        layout.addStretch(3)
        layout.addWidget(btn3)

        self.setLayout(layout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = Stretch()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

75_设置布局的伸缩量_伸缩比例(addStretch)


# 设置伸缩量(addStretch)

import sys,math
from PyQt5.QtWidgets import *

class Stretch(QWidget) :
    def __init__(self):
        super(Stretch,self).__init__()
        self.setWindowTitle("设置伸缩量")
        self.resize(800,100)
        btn1 = QPushButton(self)
        btn2 = QPushButton(self)
        btn3 = QPushButton(self)
        btn4 = QPushButton(self)
        btn5 = QPushButton(self)
        btn1.setText("按钮1")
        btn2.setText("按钮2")
        btn3.setText("按钮3")
        btn4.setText("按钮4")
        btn5.setText("按钮5")

        layout = QHBoxLayout()      # 创建水平盒子布局

        layout.addStretch(0)        # 设置拉伸比例        伸缩量设置为0,表示先把控件给排列了,剩下的不是0的伸缩量再用剩余的空间排列
        layout.addWidget(btn1)
        layout.addWidget(btn2)
        layout.addWidget(btn3)
        layout.addWidget(btn4)
        layout.addWidget(btn5)

        btnOK = QPushButton(self)
        btnOK.setText("确定")
        btnCancel = QPushButton(self)
        btnCancel.setText("取消")
        layout.addStretch(1)        # 表示的是距离的倍数         重设拉伸比例

        layout.addWidget(btnOK)
        layout.addWidget(btnCancel)
        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = Stretch()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

76_让按钮始终在窗口的右下角布局(addStretch)



# 让按钮永远在窗口右下角

import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt

class RightBottomButton(QWidget) :
    def __init__(self):
        super(RightBottomButton,self).__init__()
        self.setWindowTitle("让按钮永远在右下角")
        self.resize(400,300)

        okButton = QPushButton("确定")
        cancelButton = QPushButton("取消")

        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)

        vbox = QVBoxLayout()
        btn1 = QPushButton("按钮1")
        btn2 = QPushButton("按钮2")
        btn3 = QPushButton("按钮3")

        vbox.addStretch(0)
        vbox.addWidget(btn1)
        vbox.addWidget(btn2)
        vbox.addWidget(btn3)
        vbox.addStretch(1)
        vbox.addLayout(hbox)
        self.setLayout(vbox)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = RightBottomButton()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

77_利用栅格布局使用循环方式实现计算器



# 栅格布局:实现计算器UI


import sys,math
from PyQt5.QtWidgets import *
class Calc(QWidget) :
    def __init__(self):
        super(Calc,self).__init__()
        self.setWindowTitle("栅格布局")

        grid = QGridLayout()
        self.setLayout(grid)

        names = ['Cls','Back','','Close',
                 '7','8','9','/',
                 '4','5','6','*',
                 '1','2','3','-',
                 '0','.','=','+']

        positions = [(i,j) for i in range(5) for j in range(4)]
        print(positions)

        for position,name in zip(positions,names):
            if name == '':
                continue
            button = QPushButton(name)
           # print(position)
            grid.addWidget(button,*position)        # *position:将元组打开成单个值
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = Calc()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

78_栅格布局_进行表单UI设计



# 栅格布局:表单设计



import sys,math
from PyQt5.QtWidgets import *


class GridForm(QWidget) :
    def __init__(self):
        super(GridForm,self).__init__()
        self.setWindowTitle("栅格布局:表单设计")

        titleLabel = QLabel('标题')
        authorLabel = QLabel('作者')
        contentLabel = QLabel('内容')

        titleEdit = QLineEdit()
        authorEdit = QLineEdit()
        contentEdit = QTextEdit()

        grid = QGridLayout()
        grid.setSpacing(10)     # 设置控件的间距

        grid.addWidget(titleLabel,0,0)
        grid.addWidget(titleEdit,0,1)

        grid.addWidget(authorLabel,1,0)
        grid.addWidget(authorEdit,1,1)

        grid.addWidget(contentLabel,2,0)
        grid.addWidget(contentEdit,2,1,5,1)

        self.setLayout(grid)
        self.resize(350,300)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = GridForm()
    main.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

79_表单布局


# 表单布局(QFormLayout)


import sys,math
from PyQt5.QtWidgets import *

class FormForm(QWidget) :
    def __init__(self):
        super(FormForm,self).__init__()
        self.setWindowTitle("表单布局")
        self.resize(350,300)

        formLayout = QFormLayout()

        titleLabel = QLabel('标题')
        authorLabel = QLabel('作者')
        contentLabel = QLabel('内容')

        titleEdit = QLineEdit()
        authorEdit = QLineEdit()
        contentEdit = QTextEdit()

        formLayout.addRow(titleLabel,titleEdit)
        formLayout.addRow(authorLabel,authorEdit)
        formLayout.addRow(contentLabel,contentEdit)

        self.setLayout(formLayout)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = FormForm()
    main.show()
    sys.exit(app.exec_())


显示效果如下所示:
在这里插入图片描述

80_拖动控件之间的边界

# 拖动控件之间的边界(QSplitter)

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class Splitter(QWidget):
    def __init__(self):
        super(Splitter, self).__init__()
        self.initUI()

    def initUI(self):
        hbox = QHBoxLayout(self)
        self.setWindowTitle('QSplitter 例子')
        self.setGeometry(300, 300, 300, 200)

        topleft = QFrame()
        topleft.setFrameShape(QFrame.StyledPanel)

        bottom = QFrame()
        bottom.setFrameShape(QFrame.StyledPanel)        # 设置成面板

        splitter1 = QSplitter(Qt.Horizontal)        # 表示水平拖动
        textedit = QTextEdit()
        splitter1.addWidget(topleft)
        splitter1.addWidget(textedit)
        splitter1.setSizes([200,100])           # 表示水平方向两侧的宽度占比

        splitter2 = QSplitter(Qt.Vertical)          # 表示垂直拖动
        splitter2.addWidget(splitter1)
        splitter2.addWidget(bottom)
        splitter2.setSizes([250,50])            # 表示垂直方向两侧的高度占比


        hbox.addWidget(splitter2)
        self.setLayout(hbox)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Splitter()
    demo.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

81_信号与槽的示例


# 信号(Signal)与槽(Slot)


from PyQt5.QtWidgets import *
import sys

class SigalSlotDemo(QWidget):
    def __init__(self):
        super(SigalSlotDemo,self).__init__()
        self.initUI()

    def onClick(self):
        self.btn.setText("信号已经发出")
        self.btn.setStyleSheet("QPushButton(max-width:200px;min-width:200px")

    def initUI(self):
        self.setGeometry(300, 300, 500, 400)
        self.setWindowTitle('信号(Signal)与槽(Slot)')
        self.btn = QPushButton('我的按钮',self)
        self.btn.clicked.connect(self.onClick)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    gui = SigalSlotDemo()
    gui.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

82_如何为类添加内置信号即自定义信号


# 自定义信号
# pyqtSignal()    :自定义对象



from PyQt5.QtCore import *

class MyTypeSignal(QObject):
    # 定义一个信号
    sendmsg=pyqtSignal(object)

    # 定义一个run方法,通过调用run方法来触发事件
    def run(self):
        self.sendmsg.emit("Hello pyqt5")    # 给槽函数传递参数

class Myslot(QObject):
    def get(self,msg):
        print("信息:"+msg)

if __name__ == '__main__':
    send = MyTypeSignal()
    slot = Myslot()
    send.sendmsg.connect(slot.get)      # 绑定槽函数
    send.run()

    send.sendmsg.disconnect(slot.get)       # 解绑槽函数
    send.run()

显示效果如下所示:
在这里插入图片描述

83_可以传递多个参数的信号


# 自定义信号
# pyqtSignal()

from PyQt5.QtCore import *
class MyTypeSignal(QObject):
    # 定义一个信号
    sendmsg = pyqtSignal(object)

    # 发送3个参数的信号
    sendmsg1 = pyqtSignal(str,int,int)

    def run(self):
        self.sendmsg.emit('Hello PyQt5')

    def run1(self):
        self.sendmsg1.emit("hello",3,4)


class MySlot(QObject):
    def get(self,msg):
        print("信息:" + msg)
    def get1(self,msg,a,b):
        print(msg)
        print(a+b)


if __name__ == '__main__':
    send = MyTypeSignal()
    slot = MySlot()

    send.sendmsg.connect(slot.get)
    send.sendmsg1.connect(slot.get1)

    send.run()
    send.run1()

    send.sendmsg.disconnect(slot.get)
    send.run()

显示效果如下所示:
在这里插入图片描述

84_可以传递多个参数的信号

# 自定义信号
# pyqtSignal()
from PyQt5.QtCore import *
class MyTypeSignal(QObject):
    # 定义一个信号
    sendmsg = pyqtSignal(object)

    # 发送3个参数的信号
    sendmsg1 = pyqtSignal(str,int,int)

    def run(self):
        self.sendmsg.emit('Hello PyQt5')

    def run1(self):
        self.sendmsg1.emit("hello",3,4)


class MySlot(QObject):
    def get(self,msg):
        print("信息:" + msg)
    def get1(self,msg,a,b):
        print(msg)
        print(a+b)


if __name__ == '__main__':
    send = MyTypeSignal()
    slot = MySlot()

    send.sendmsg.connect(slot.get)
    send.sendmsg1.connect(slot.get1)

    send.run()
    send.run1()

    send.sendmsg.disconnect(slot.get)
    send.run()

显示效果如下所示:
在这里插入图片描述

85_为类添加多个信号(重载形式的信号)


# 为类添加多个信号



from PyQt5.QtCore import *

class MultiSignal(QObject):

    signal1 = pyqtSignal()      # 定义信号

    signal2 = pyqtSignal(int)       # 定义一个参数的信号

    signal3 = pyqtSignal(int, str)

    signal4 = pyqtSignal(list)      # 表示传递列表

    signal5 = pyqtSignal(dict)      # 表示传递字典

    # 声明一个重载版本的信号,也就是槽函数的参数可以是int和str类型,也可以只有一个str类型的参数,
    signal6 = pyqtSignal([int,str],[str])

    def __init__(self):
        super(MultiSignal,self).__init__()
        self.signal1.connect(self.signalCall1)
        self.signal2.connect(self.signalCall2)
        self.signal3.connect(self.signalCall3)
        self.signal4.connect(self.signalCall4)
        self.signal5.connect(self.signalCall5)
        self.signal6[str].connect(self.signalCall6Overload)
        self.signal6[int,str].connect(self.signalCall6)

        self.signal1.emit()
        self.signal2.emit(10)
        self.signal3.emit(1,"hello world")
        self.signal4.emit([1,2,3,4,5,6])
        self.signal5.emit({"name":"Bill","age":30})
        self.signal6[str].emit("test")
        self.signal6[int,str].emit(100,"mytest")
    def signalCall1(self):
        print("signal1 emit")

    def signalCall2(self,val):
        print("signal2 emit,value:", val)

    def signalCall3(self,val,text):
        print("signal3 emit,value:", val,text)

    def signalCall4(self,val):
        print("signal4 emit,value:", val)

    def signalCall5(self,val):
        print("signal5 emit,value:", val)

    def signalCall6(self,val,text):
        print("signal6 emit,value:", val,text)

    def signalCall6Overload(self,val):
        print("signal6 overload emit,value:", val)

if __name__ == '__main__':
    multiSignal = MultiSignal()

显示效果如下所示:
在这里插入图片描述

86_信号和槽的N对N连接与断开连接


# 信号槽N对N连接与断开连接
# 即:一个信号可以关联到多个槽上
#     多个槽可以关联到同一个信号上
#     信号还可以关联到另外一个信号上

from PyQt5.QtCore import *

class NNSignal(QObject):
    signal1 = pyqtSignal()
    signal2 = pyqtSignal(int)
    signal3 = pyqtSignal()
    def __init__(self):
        super(NNSignal,self).__init__()

        self.signal1.connect(self.call1)        # 绑定信号1
        self.signal1.connect(self.call11)
        self.signal2.connect(self.call2)
        self.signal3.connect(self.call1)


        self.signal1.emit()
        self.signal2.emit(12)
        self.signal3.emit()

        # self.signal2.connect(self.signal1)
        #
        # self.signal2.emit(2)   # 触发了信号1
        #
        # self.signal1.disconnect(self.call1)
        # self.signal1.disconnect(self.call11)
        # self.signal2.disconnect(self.signal1)
        #
        # self.signal1.connect(self.call1)
        # self.signal2.connect(self.call2)
        #
        # self.signal1.emit()
        # self.signal2.emit(100)

    def call1(self):
        print("call1 emit")

    def call11(self):
        print("call11 emit")

    def call2(self,val):
        print("call2 emit:",val)
if __name__ == '__main__':
    nnSignal = NNSignal()

显示效果如下所示:
在这里插入图片描述

87_为窗口添加信号


# 为窗口类添加信号

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys

class WinSignal(QWidget):
    button_clicked_signal = pyqtSignal()

    def __init__(self):
        super().__init__()
        self.setWindowTitle("为窗口类添加信号")
        self.resize(300,100)


        btn = QPushButton('关闭窗口',self)
        self.button_clicked_signal.connect(self.btn_close)
        btn.clicked.connect(self.btn_clicked)



    def btn_clicked(self):
        self.button_clicked_signal.emit()

    def btn_close(self):
        self.close()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = WinSignal()
    example.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

88_多线程更新UI数据(即动态显示时间的案例)



# 多线程更新UI数据(在两个线程中传递数据)
# 在多个线程中,利用信号与槽互相传递数据
# 即:另外一个线程不断的向主线程来发送信号



from PyQt5.QtCore import QThread ,  pyqtSignal,  QDateTime
from PyQt5.QtWidgets import QApplication,  QDialog,  QLineEdit
import time
import sys


class BackendThread(QThread):
    update_date = pyqtSignal(str)

    def run(self):
        while True:
            data = QDateTime.currentDateTime()
            currentTime = data.toString("yyyy-MM-dd hh:mm:ss")
            self.update_date.emit(str(currentTime))     # 传递参数
            time.sleep(1)
class ThreadUpdateUI(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        self.setWindowTitle('多线程更新UI数据')
        self.resize(400,100)
        self.input = QLineEdit(self)
        self.input.resize(400,100)

        self.initUI()
    def initUI(self):
        self.backend = BackendThread()
        self.backend.update_date.connect(self.handleDisplay)

        self.backend.start()        # 启动线程

    def handleDisplay(self,data):
        self.input.setText(data)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = ThreadUpdateUI()
    example.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

89_信号与槽自动连接


# 信号与槽自动连接
#
# on_objectname_signalname
#
# on_okButton_clicked



from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication ,QWidget ,QHBoxLayout , QPushButton
import sys

class AutoSignalSlot(QWidget):
    def __init__(self):
        super(AutoSignalSlot,self).__init__()
        self.okButton = QPushButton("ok",self)
        self.okButton.setObjectName("okButton")     # 给按钮控件设置一名称
        self.okButton1 = QPushButton("cancel",self)
        self.okButton1.setObjectName("cancelButton")


        layout = QHBoxLayout()
        layout.addWidget(self.okButton)
        self.setLayout(layout)
        QtCore.QMetaObject.connectSlotsByName(self)     #1、按照相应的规则使得信号与槽自动连接
        #self.okButton.clicked.connect(self.on_okButton_clicked)

    @QtCore.pyqtSlot()
    def on_okButton_clicked(self):  # 2、将槽函数使用@QtCore.pyqtSlot()注释一下
        print("点击了ok按钮")

    @QtCore.pyqtSlot()
    def on_cancelButton_clicked(self):
        print("点击了cancel按钮")
if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = AutoSignalSlot()
    example.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

90_使用lambda表达式为槽函数传递对象



# 使用Lambda表达式为槽函数传递参数
#
# Lambda表达式:匿名函数,也就是没有名字的函数
#
# fun = lambda :print("hello world")
# fun()
#
#
# fun1 = lambda x,y:print(x,y)
# fun1("a","b")


from PyQt5.QtWidgets import *
import sys

class LambdaSlotArg(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("使用Lambda表达式为槽函数传递参数")

        button1 = QPushButton("按钮1")
        button2 = QPushButton("按钮2")
        ok = 100
        button1.clicked.connect(lambda :self.onButtonClick(10,ok))
        button2.clicked.connect(lambda :self.onButtonClick(ok,-20))
        button1.clicked.connect(lambda :QMessageBox.information(self,"结果","单击了button1"))

        layout = QHBoxLayout()
        layout.addWidget(button1)
        layout.addWidget(button2)
        mainFrame = QWidget()
        mainFrame.setLayout(layout)
        self.setCentralWidget(mainFrame)
    def onButtonClick(self,m,n):
        print("m + n =",m + n )
        QMessageBox.information(self,"结果",str(m+n))
if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = LambdaSlotArg()
    form.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

91_使用partial为槽函数传递参数


# 使用Partial对象为槽函数传递参数

from PyQt5.QtWidgets import *
import sys
from functools import partial

class PartialSlotArg(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("使用Partial表达式为槽函数传递参数")

        button1 = QPushButton("按钮1")
        button2 = QPushButton("按钮2")
        x = 20
        y = -123
        button1.clicked.connect(partial(self.onButtonClick,10,20))
        button2.clicked.connect(partial(self.onButtonClick, x, y))

        layout = QHBoxLayout()
        layout.addWidget(button1)
        layout.addWidget(button2)
        mainFrame = QWidget()
        mainFrame.setLayout(layout)
        self.setCentralWidget(mainFrame)
    def onButtonClick(self,m,n):
        print("m + n =",m + n )
        QMessageBox.information(self,"结果",str(m+n))
if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = PartialSlotArg()
    form.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

92_Override(覆盖)槽函数_接收键盘事件



# Override(覆盖)槽函数

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys

class OverrideSlot(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Override(覆盖)槽函数")
    def keyPressEvent(self, e):
        if e.key() == Qt.Key_Escape:
            self.close()
        elif e.key() == Qt.Key_Alt:
            self.setWindowTitle("按下Alt键")
        elif e.key() == Qt.Key_Q:
            self.setWindowTitle("按下Q键")



if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = OverrideSlot()
    form.show()
    sys.exit(app.exec_())


显示效果如下所示:
在这里插入图片描述

93_多窗口交互(不使用信号与槽)

MultiWindow1.py 文件

# 多窗口交互(1):不使用信号与槽
#
# Win1
#
# Win2



import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from DateDialog import DateDialog

class MultiWindow1(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("多窗口交互(1):不使用信号与槽")

        self.lineEdit = QLineEdit(self)
        self.button1 = QPushButton('弹出对话框1')
        self.button1.clicked.connect(self.onButton1Click)

        self.button2 = QPushButton('弹出对话框2')
        self.button2.clicked.connect(self.onButton2Click)

        gridLayout = QGridLayout()      # 网格布局
        gridLayout.addWidget(self.lineEdit)
        gridLayout.addWidget(self.button1)
        gridLayout.addWidget(self.button2)

        self.setLayout(gridLayout)

    def onButton1Click(self):
        dialog = DateDialog(self)
        dialog.exec()      # 显示
        date = dialog.dateTime()        # 调用类方法,返回当前的日期
        self.lineEdit.setText(date.date().toString())
        dialog.destroy()        # 销毁

    def onButton2Click(self):
        date,time,result = DateDialog.getDateTime()     # 调用类的静态方法
        self.lineEdit.setText(date.toString())
        if result == QDialog.Accepted:
            print('点击确定按钮')
        else:
            print('单击取消按钮')
if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = MultiWindow1()
    form.show()
    sys.exit(app.exec_())

DateDialog.py 文件

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys

class DateDialog(QDialog):
    def __init__(self,parent=None):
        super(DateDialog,self).__init__(parent)
        self.setWindowTitle("DateDialog")

        layout = QVBoxLayout(self)
        self.datetime = QDateTimeEdit(self)     # 设置日期的编辑控件
        self.datetime.setCalendarPopup(True)
        self.datetime.setDateTime(QDateTime.currentDateTime())      # 设置内容为当前的日期

        layout.addWidget(self.datetime)

        buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel,Qt.Horizontal,self)        # 放置两个按钮盒子
        buttons.accepted.connect(self.accept)       # 接受        self.accept:为系统提供的槽
        buttons.rejected.connect(self.reject)       # 拒绝        self.reject:为系统提供的槽

        layout.addWidget(buttons)

    def dateTime(self):
        return self.datetime.dateTime()     # 返回当前的日期

    @staticmethod
    def getDateTime(parent = None):
        dialog = DateDialog(parent)
        result = dialog.exec()  # 显示对话框     返回所点击的值
        date = dialog.dateTime()        # 调用对象的方法
        return (date.date(),date.time(),result == QDialog.Accepted)




if __name__ == '__main__':
    app = QApplication(sys.argv)
    dialog = DateDialog()
    dialog.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

94_多窗口交互(使用信号与槽)

MultiWindow2.py 文件



# 多窗口交互(2):使用信号与槽
#
# 如果一个窗口A与另一个窗口B交互,那么A尽量不要直接访问B窗口中的控件,
# 应该访问B窗口中的信号,并指定与信号绑定的槽函数
#
# 例:如果A直接访问B窗口的控件,一旦B窗口控件发生改变,那么A和B的代码都需要变化
#
# 如果A访问的是B中的信号,那么B中的控件发生了改变,只需要修改B中的代码即可


import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from NewDateDialog import NewDateDialog

class MultiWindow2(QWidget):
    def __init__(self, parent=None):
        super(MultiWindow2, self).__init__(parent)
        self.resize(400, 90)
        self.setWindowTitle('多窗口交互(2):使用信号与槽')

        self.open_btn = QPushButton('获取时间')
        self.lineEdit_inner = QLineEdit(self)
        self.lineEdit_emit = QLineEdit(self)
        self.open_btn.clicked.connect(self.openDialog)

        self.lineEdit_inner.setText('接收子窗口内置信号的时间')
        self.lineEdit_emit.setText('接收子窗口自定义信号的时间')

        grid = QGridLayout()
        grid.addWidget(self.lineEdit_inner)
        grid.addWidget(self.lineEdit_emit)

        grid.addWidget(self.open_btn)
        self.setLayout(grid)

    def openDialog(self):
        dialog = NewDateDialog(self)
        # 连接子窗口的内置信号与主窗口的槽函数
        dialog.datetime_inner.dateTimeChanged.connect(self.deal_inner_slot)     # 给子窗口日期控件绑定事件emit_signal
        # 连接子窗口的自定义信号与主窗口的槽函数
        dialog.Signal_OneParameter.connect(self.deal_emit_slot)         # 对子窗口内的信号绑定槽函数
        dialog.show()

    def deal_inner_slot(self, date):        # 此data就是由子窗口传递过来的数据
        self.lineEdit_inner.setText(date.toString())


    def deal_emit_slot(self, dateStr):
        self.lineEdit_emit.setText(dateStr)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = MultiWindow2()
    form.show()
    sys.exit(app.exec_())

NewDateDialog.py 文件

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class NewDateDialog(QDialog):
    Signal_OneParameter = pyqtSignal(str)

    def __init__(self, parent=None):
        super(NewDateDialog, self).__init__(parent)
        self.setWindowTitle('子窗口:用来发射信号')

        # 在布局中添加部件
        layout = QVBoxLayout(self)

        self.label = QLabel(self)
        self.label.setText('前者发射内置信号\n后者发射自定义信号')

        self.datetime_inner = QDateTimeEdit(self)
        self.datetime_inner.setCalendarPopup(True)
        self.datetime_inner.setDateTime(QDateTime.currentDateTime())

        self.datetime_emit = QDateTimeEdit(self)
        self.datetime_emit.setCalendarPopup(True)
        self.datetime_emit.setDateTime(QDateTime.currentDateTime())

        layout.addWidget(self.label)
        layout.addWidget(self.datetime_inner)
        layout.addWidget(self.datetime_emit)

        # 使用两个button(ok和cancel)分别连接accept()reject()槽函数
        buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel,
            Qt.Horizontal, self)
        buttons.accepted.connect(self.accept)
        buttons.rejected.connect(self.reject)
        layout.addWidget(buttons)

        self.datetime_emit.dateTimeChanged.connect(self.emit_signal)

    def emit_signal(self):
        date_str = self.datetime_emit.dateTime().toString()
        self.Signal_OneParameter.emit(date_str)     # 信号触发槽函数

显示效果如下所示:
在这里插入图片描述

95_设置窗口中控件的风格



# 窗口、绘图与特效:设置窗口风格
#
# 设置窗口中控件的风格
#
# QApplication.setStyle(...)



import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5 import QtCore
from PyQt5.QtGui  import *

class WindowStyle(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('设置窗口风格')
        horizontalLayout = QHBoxLayout()
        self.styleLabel = QLabel('设置窗口风格:')
        self.styleComboBox = QComboBox()            # 下拉列表
        self.styleComboBox.addItems(QStyleFactory.keys())       # QStyleFactory.keys() : 返回的是一个列表
        print("输出窗口的风格:",QStyleFactory.keys())

        # 获取当前窗口的风格
        print(QApplication.style().objectName())
        index = self.styleComboBox.findText(QApplication.style().objectName(),QtCore.Qt.MatchFixedString)           # 获得当前项的索引          # QtCore.Qt.MatchFixedString:精确匹配

        self.styleComboBox.setCurrentIndex(index)       # 设置当前的索引

        self.styleComboBox.activated[str].connect(self.handleStyleChanged)          # 固定槽写法
        horizontalLayout.addWidget(self.styleLabel)
        horizontalLayout.addWidget(self.styleComboBox)
        self.setLayout(horizontalLayout)
    def handleStyleChanged(self,style):
        print("sssss",style)
        QApplication.setStyle(style)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = WindowStyle()
    form.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

96_设置窗口的样式

'''

设置窗口样式(主要是窗口边框、标题栏以及窗口本身的样式)

'''

from PyQt5.QtCore import *
import sys
from PyQt5.QtWidgets import *


class WindowPattern(QMainWindow):
    def __init__(self):
        super().__init__()
        self.resize(500, 260)
        self.setWindowTitle('设置窗口的样式')

        self.setWindowFlags(
            Qt.WindowMaximizeButtonHint | Qt.WindowStaysOnTopHint | Qt.WindowCloseButtonHint |Qt.WindowMinimizeButtonHint)  # 设置窗口样式       Qt.WindowStaysOnTopHint:永远让窗口待在最顶端
        self.setObjectName("MainWindow")  # 设置窗口的名字
        self.setStyleSheet("#MainWindow{border-image:url(images/python.jpg);}")  # 设置窗口的背景色


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = WindowPattern()
    form.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

97_利用代码设置窗口的最大化与最小化


# 用代码控制窗口的最大化和最小化


import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *


### 自定义窗口类
class WindowMaxMin(QWidget):


    ###  构造函数
    def __init__(self, parent=None):
        '''构造函数'''
        # 调用父类构造函数
        super(WindowMaxMin, self).__init__(parent)
        self.resize(300,400)
        self.setWindowTitle("用代码控制窗口的最大化和最小化")
        self.setWindowFlags(Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint | Qt.WindowMinimizeButtonHint)       # 设置窗口最大化、关闭、最小化

        layout = QVBoxLayout()      # 垂直盒布局

        maxButton1 = QPushButton()
        maxButton1.setText('窗口最大化1')
        maxButton1.clicked.connect(self.maximized1)


        maxButton2 = QPushButton()
        maxButton2.setText('窗口最大化2')
        maxButton2.clicked.connect(self.showMaximized)

        minButton = QPushButton()
        minButton.setText('窗口最小化')
        minButton.clicked.connect(self.showMinimized)


        layout.addWidget(maxButton1)
        layout.addWidget(maxButton2)
        layout.addWidget(minButton)
        self.setLayout(layout)



    def maximized1(self):
        desktop = QApplication.desktop()        # 获取桌面
        # 获取桌面可用尺寸
        rect = desktop.availableGeometry()
        print(rect)

        self.setGeometry(rect)      # 利用设置窗口尺寸的方式



if __name__ == "__main__":

    app = QApplication(sys.argv)

    window = WindowMaxMin()
    window.show()
    # 应用程序事件循环
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

98_实现绘图应用


#
# 项目实战:实现绘图应用
#
# 需要解决3个核心内容
# 1. 如何绘图
#
# 在paintEvent方法中绘图,通过调用update方法触发painEvent的调用
#
#
# 2. 在哪里绘图
#
# 在白色背景的QPixmap对象中绘图
#
# 3. 如何通过移动鼠标进行绘图
#
# 鼠标拥有3个事件:
# (1)鼠标按下:mousePressEvent
# (2)鼠标移动:mouseMoveEvent
# (3)鼠标抬起:mouseReleaseEvent



import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QPixmap
from PyQt5.QtCore import Qt, QPoint


class Drawing(QWidget):
    def __init__(self, parent=None):
        super(Drawing, self).__init__(parent)
        self.setWindowTitle("绘图应用")
        self.pix = QPixmap()        # 创建画布
        self.lastPoint = QPoint()
        self.endPoint = QPoint()
        self.initUi()

    def initUi(self):

        self.resize(600, 600)
        # 画布大小为400*400,背景为白色
        self.pix = QPixmap(600, 600)        # 创建画布图像
        self.pix.fill(Qt.white)     # 使得图像颜色为白色

    # 在画布上创建画笔,然后在将画布绘制到窗口上
    def paintEvent(self, event):
        pp = QPainter(self.pix)     # 在画布上创建画笔
        # 根据鼠标指针前后两个位置绘制直线
        pp.drawLine(self.lastPoint, self.endPoint)      # 绘制直线
        # 让前一个坐标值等于后一个坐标值,
        # 这样就能实现画出连续的线
        self.lastPoint = self.endPoint      # 绘制完毕后,需要更新
        painter = QPainter(self)        # 其表示创建画笔,并将画布绘制在当前窗口上
        painter.drawPixmap(0, 0, self.pix)

    # 鼠标按下触发事件
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.lastPoint = event.pos()        # 获取当前鼠标按下的点
            print("111",self.lastPoint)

    def mouseMoveEvent(self, event):
        if event.buttons() and Qt.LeftButton:       # 利用判断,即必须要有鼠标左键按下
            self.endPoint = event.pos()         # 获取鼠标当前的坐标
            print("222", self.endPoint)
            self.update()       # 调用该方法,其会触发paintEvent()事件函数

    def mouseReleaseEvent(self, event):
        # 鼠标左键释放
        if event.button() == Qt.LeftButton:
            self.endPoint = event.pos()
            # 进行重新绘制
            self.update()           # 调用该方法,其会触发paintEvent()事件函数


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Drawing()
    form.show()
    sys.exit(app.exec_())

99_QSS基础


# QSS基础
# QSS(Qt Style Sheets)
# Qt样式表
# 用于设置控件的样式
# CSS


from PyQt5.QtWidgets import *
import sys
class BasicQSS(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QSS样式")
        btn1 = QPushButton(self)
        btn1.setText("按钮1")
        btn2 = QPushButton(self)
        btn2.setText("按钮2")

        btn3 = QPushButton(self)
        btn3.setText("按钮3")

        vbox = QVBoxLayout()
        vbox.addWidget(btn1)
        vbox.addWidget(btn2)
        vbox.addWidget(btn3)

        self.setLayout(vbox)
if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = BasicQSS()
    # 选择器
    qssStyle = '''
        QPushButton {
            background-color:red
        }
    '''
    form.setStyleSheet(qssStyle)
    form.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

100_QSS基础_选择器设置控件



# 使用QSS选择器设置控件样式



from PyQt5.QtWidgets import *
import sys
# import qdarkstyle
class QSSSelector(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QSS样式")
        btn1 = QPushButton(self)
        btn1.setText("按钮1")
        btn2 = QPushButton(self)
        btn2.setProperty('name','btn2')     # 设置属性,用于选择器过滤标签
        btn2.setText("按钮2")

        btn3 = QPushButton(self)
        btn3.setProperty('name','btn3')
        btn3.setText("按钮3")

        vbox = QVBoxLayout()
        vbox.addWidget(btn1)
        vbox.addWidget(btn2)
        vbox.addWidget(btn3)

        self.setLayout(vbox)
if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = QSSSelector()
    # 选择器
    qssStyle = '''
        QPushButton[name="btn2"] {
            background-color:red;
            color:yellow;
            height:120;
            font-size:60px;
        }
        QPushButton[name="btn3"] {
            background-color:blue;
            color:yellow;
            height:60;
            font-size:30px;
        }
    '''
    form.setStyleSheet(qssStyle)
    # form.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
    form.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

101_QSS基础_子控件选择器


# QSS子控件选择器
# QComboBox

from PyQt5.QtWidgets import *
import sys

class QSSSubControl(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QSS子控件选择器")
        combo = QComboBox(self)     # 下拉列表控件
        combo.setObjectName("myComboBox")       # 为了过滤控件,对该控件设置名称
        combo.addItem("Window")
        combo.addItem("Linux")
        combo.addItem("Mac OS X")

        combo.move(50,50)

        self.setGeometry(250,200,320,150)
if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = QSSSubControl()

    # drop-down:表示的是控件的子控件
    qssStyle = '''
       QComboBox#myComboBox::drop-down {
           image:url(./images/dropdown.png)
       }
    '''
    form.setStyleSheet(qssStyle)
    form.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

102_移动和关闭不规则窗口(异形窗口)


# 实现不规则窗口(异形窗口)
# 通过mask实现异形窗口
# 需要一张透明的png图,透明部分被扣出,形成一个非矩形的区域
# 移动和关闭不规则窗口


import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class AbnormityWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("异形窗口")
        self.pix = QBitmap('./images/mask.png')     # 表示创建一种只有黑白的单色图片
        self.resize(self.pix.size())            # 将窗口尺寸设置成
        self.setMask(self.pix)      # 设置掩膜

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:     # 点击鼠标左键
            self.m_drag = True      # 移动的标志

            self.m_DragPosition = event.globalPos() - self.pos()        # 得到其相对于窗口边界的位置
            self.setCursor(QCursor(Qt.OpenHandCursor))      # 点击后,将鼠标设置为小手的形状
            print(event.globalPos())  # 其表示当前的点击点相对于整个屏幕的坐标
            print(event.pos())      # 其表示点击点相对于窗口的坐标,其不包括边框与标签栏
            print(self.pos())       # 表示窗口的左上角坐标相对于屏幕的位置
        if event.button() == Qt.RightButton:        # 表示单击鼠标右键进行关闭
            self.close()

    def mouseMoveEvent(self, QMouseEvent):
        if Qt.LeftButton and self.m_drag:
            # 当左键移动窗体修改偏移值
            # QPoint
            # 实时计算窗口左上角坐标
            self.move(QMouseEvent.globalPos() - self.m_DragPosition)        # 改变窗口左上角坐标的位置


    def mouseReleaseEvent(self, QMouseEvent):
        self.m_drag = False
        self.setCursor(QCursor(Qt.ArrowCursor))
    def paintEvent(self, event):
        print("1111")
        painter = QPainter(self)
        # 将背景图像与掩膜设置成同一尺寸
        painter.drawPixmap(0,0,self.pix.width(),self.pix.height(),QPixmap('./images/screen1.jpg'))
if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = AbnormityWindow()
    form.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

103_实现异形窗口动画效果


# 不规则窗体的动画实现



import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPixmap, QPainter, QCursor
from PyQt5.QtCore import Qt, QTimer


class AnimationWindows(QWidget):
    def __init__(self, parent=None):
        super(AnimationWindows, self).__init__(parent)
        self.i = 1
        self.mypix()        # 显示第一张图像的
        self.timer = QTimer()
        self.timer.setInterval(500)  # 500毫秒        # 即每间隔500毫秒,切换图像
        self.timer.timeout.connect(self.timeChange)     # 绑定事件
        self.timer.start()

    # 显示不规则 pic
    def mypix(self):

        if self.i == 5:
            self.i = 1
        self.mypic = {1: './images/left.png', 2: "./images/up.png", 3: './images/right.png', 4: './images/down.png'}
        self.pix = QPixmap(self.mypic[self.i])
        self.resize(self.pix.size())
        self.setMask(self.pix.mask())
        self.update()  # 调用paintEvent()画出第一张图像

        # self.dragPosition = None

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.m_drag = True
            self.m_DragPosition = event.globalPos() - self.pos()

            self.setCursor(QCursor(Qt.OpenHandCursor))

    def mouseMoveEvent(self, QMouseEvent):
        if Qt.LeftButton and self.m_drag:
            self.move(QMouseEvent.globalPos() - self.m_DragPosition)


    def mouseReleaseEvent(self, QMouseEvent):
        self.m_drag = False
        self.setCursor(QCursor(Qt.ArrowCursor))

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPixmap(0, 0, self.pix.width(), self.pix.height(), self.pix)

    # 鼠标双击事件
    def mouseDoubleClickEvent(self, event):
        if event.button() == 1:
            self.i += 1
            self.mypix()
        print("鼠标双击了",self.pos())

    # 每500毫秒修改paint
    def timeChange(self):
        self.i += 1
        self.mypix()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = AnimationWindows()
    form.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

104_使用QMovie装载gif动画


# 装载Gif动画
#
# QMovie


import sys
from PyQt5.QtWidgets import QApplication,  QLabel  ,QWidget
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QMovie

class LoadingGif(QWidget):
    def __init__(self):
        super().__init__()
        self.label = QLabel("",self)
        self.setFixedSize(128,128)      # 给窗口设定固定的尺寸
        self.setWindowFlags(Qt.Dialog | Qt.CustomizeWindowHint)     # 设置窗口的样式
        self.movie = QMovie('./images/loading.gif')     # 使用QMovie装载gif
        self.label.setMovie(self.movie)
        self.movie.start()      # 调用start()方法来开启动画

    def mousePressEvent(self, event):
        if event.button() == Qt.RightButton:        # 表示单击鼠标右键进行关闭
            self.close()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = LoadingGif()
    form.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

105_使用QSS为标签和按钮添加背景图


# 使用QSS为标签和按钮添加背景图

from PyQt5.QtWidgets import *
import sys
class LabelButtonBackground(QWidget):
    def __init__(self):
        super().__init__()
        self.setFixedSize(500,350)      # 给窗口设置固定的尺寸
        label1 = QLabel(self)
        label1.setToolTip('这是一个文本标签')
        label1.setStyleSheet('QLabel{border-image:url(./images/python.jpg);}')

        label1.setFixedWidth(476)               # 给label1控件设置固定宽度
        label1.setFixedHeight(259)              # 给label1控件设置固定高度

        btn1 = QPushButton(self)
        btn1.setObjectName('btn1')
        btn1.setMaximumSize(48,48)
        btn1.setMinimumSize(48,48)

        style = '''
        
            #btn1{
                border-radius:4px;
                background-image:url('./images/add.png');
            }
            #btn1:Pressed {
                background-image:url('./images/addhover.png');
            }
        '''
        btn1.setStyleSheet(style)

        vbox = QVBoxLayout()
        vbox.addWidget(label1)
        vbox.addStretch()
        vbox.addWidget(btn1)

        self.setLayout(vbox)
        self.setWindowTitle('使用QSS为标签和按钮添加背景图')


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = LabelButtonBackground()
    form.show()
    sys.exit(app.exec_())


显示效果如下所示:
在这里插入图片描述

106_调整图像的尺寸大小



# 缩放图片
#
# QImage.scaled


from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import Qt
import sys


class ScaleImage(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("图片大小缩放例子")
        filename = './images/Cloudy_72px.png'
        img = QImage(filename)
        label1 = QLabel(self)
        label1.setFixedWidth(200)
        label1.setFixedHeight(200)

        # 重新设置图像的尺寸
        result = img.scaled(label1.width(),label1.height(),Qt.IgnoreAspectRatio,Qt.SmoothTransformation)        # 设置图像新的尺寸
                                                                            # Qt.IgnoreAspectRatio:忽略图像比例
                                                                            # Qt.SmoothTransformation:让图像平滑显示
        label1.setPixmap(QPixmap.fromImage(result))

        vbox = QVBoxLayout()
        vbox.addWidget(label1)

        self.setLayout(vbox)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = ScaleImage()
    win.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

109_创建透明和半透明窗口



# 创建透明窗口



from PyQt5.Qt import *
import sys

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = QMainWindow()
    win.setWindowTitle('窗口的透明度设置')
    # 011表示不透明,0表示完全透明
    win.setWindowOpacity(0.6)       # 设置窗口的透明度  0~1

    button = QPushButton('我的按钮',win)

    win.resize(400,200)
    win.show()
    sys.exit(app.exec())


显示效果如下所示:
在这里插入图片描述

110_装载QSS文件

在这里插入图片描述
LoadQSS.py****文件


# 装载QSS文件


import sys
from PyQt5.QtWidgets import *
from CommonHelper import CommonHelper

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.resize(477, 258)
        self.setWindowTitle("加载QSS文件")
        btn = QPushButton()
        btn.setText('装载QSS文件')
        btn.setToolTip('提示文本')

        vbox = QVBoxLayout()
        vbox.addWidget(btn)
        btn.clicked.connect(self.onClick)

        widget  = QWidget(self)
        self.setCentralWidget(widget)       # 创建中心控件
        widget.setLayout(vbox)      # 将垂直盒布局添加上

    def onClick(self):

        styleFile = './style.qss'
        qssStyle = CommonHelper.readQSS(styleFile)      # 读取.qss文件样式
        print(qssStyle)
        win.setStyleSheet(qssStyle)                     # 设置空间样式


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

    win.show()
    sys.exit(app.exec_())

CommonHelper.py 文件

class CommonHelper:
    @staticmethod
    def readQSS(style):
        with open(style,'r') as f:
            return f.read()

style.qss 文件

QMainWindow{
    border-image:url(../images/python.jpg);
}

QToolTip {
   border:1px solid rgb(45,45,45);
   background:white;
   color:red
}

显示效果如下所示:
在这里插入图片描述

111_用动画效果改变窗口的尺寸


# 用动画效果改变窗口尺寸
# QPropertyAnimation


from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys

class AnimWindow(QWidget):
    def __init__(self):
        super(AnimWindow, self).__init__()
        self.OrigHeight = 50
        self.ChangeHeight = 150
        self.setGeometry(QRect(500, 400, 150, self.OrigHeight))
        self.btn = QPushButton('展开', self)
        self.btn.setGeometry(10, 10, 60, 35)
        self.btn.clicked.connect(self.change)
    def change(self):
        currentHeight = self.height()       # 获取到当前的高度尺寸
        if self.OrigHeight == currentHeight:
            startHeight = self.OrigHeight
            endHeight = self.ChangeHeight
            self.btn.setText('收缩')
        else:
            startHeight = self.ChangeHeight
            endHeight= self.OrigHeight
            self.btn.setText('展开')

        self.animation = QPropertyAnimation(self,b'geometry')       # 打开动画设置            b'geometry':表示按照坐标系的值来改变
        self.animation.setDuration(500)         # 设置动画完成时间
        self.animation.setStartValue(QRect(500,400,150,startHeight))        # 设置开始的值
        self.animation.setEndValue(QRect(500,400,150,endHeight))            # 设置结束的值
        self.animation.start()



if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = AnimWindow()
    window.show()
    sys.exit(app.exec_())

显示效果如下所示:
在这里插入图片描述

  • 12
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值