学习PyQt5之路

1 晚上一个小项目

今晚上跑了一个Pycharm上的Qt-5的翻译代码,记录如下
test.py由designer生成自己再改动一下

from PyQt5 import QtCore, QtGui, QtWidgets
from fanyi import Fanyi

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1027, 816)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser.setGeometry(QtCore.QRect(350, 120, 171, 71))
        self.textBrowser.setStyleSheet("background-color: rgb(107, 255, 193);")
        self.textBrowser.setObjectName("textBrowser")
        self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget.setGeometry(QtCore.QRect(340, 550, 331, 31))
        self.layoutWidget.setObjectName("layoutWidget")
        self.gridLayout_4 = QtWidgets.QGridLayout(self.layoutWidget)
        self.gridLayout_4.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_4.setObjectName("gridLayout_4")
        self.pushButton_3 = QtWidgets.QPushButton(self.layoutWidget)
        self.pushButton_3.setObjectName("pushButton_3")
        self.gridLayout_4.addWidget(self.pushButton_3, 0, 0, 1, 1)
        self.pushButton_2 = QtWidgets.QPushButton(self.layoutWidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout_4.addWidget(self.pushButton_2, 0, 1, 1, 1)
        self.layoutWidget1 = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget1.setGeometry(QtCore.QRect(180, 270, 625, 233))
        self.layoutWidget1.setObjectName("layoutWidget1")
        self.gridLayout_3 = QtWidgets.QGridLayout(self.layoutWidget1)
        self.gridLayout_3.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        self.textEdit = QtWidgets.QTextEdit(self.layoutWidget1)
        self.textEdit.setObjectName("textEdit")
        self.gridLayout.addWidget(self.textEdit, 1, 0, 1, 1)
        self.label = QtWidgets.QLabel(self.layoutWidget1)
        self.label.setStyleSheet("background-color: rgb(255, 216, 119);\n"
"font: 18pt \"楷体\";")
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.gridLayout_3.addLayout(self.gridLayout, 0, 0, 1, 1)
        self.pushButton = QtWidgets.QPushButton(self.layoutWidget1)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout_3.addWidget(self.pushButton, 0, 1, 1, 1)
        self.gridLayout_2 = QtWidgets.QGridLayout()
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.textEdit_2 = QtWidgets.QTextEdit(self.layoutWidget1)
        self.textEdit_2.setObjectName("textEdit_2")
        self.gridLayout_2.addWidget(self.textEdit_2, 1, 0, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.layoutWidget1)
        self.label_2.setStyleSheet("background-color: rgb(152, 176, 255);\n"
"font: 18pt \"隶书\";\n"
"background-color: rgb(255, 225, 107);")
        self.label_2.setObjectName("label_2")
        self.gridLayout_2.addWidget(self.label_2, 0, 0, 1, 1)
        self.gridLayout_3.addLayout(self.gridLayout_2, 0, 2, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1027, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.pushButton_2.clicked.connect(self.textEdit_2.close)
        self.pushButton_3.clicked.connect(self.textEdit.clear)
        self.pushButton_3.clicked.connect(self.textEdit_2.clear)
        self.pushButton.clicked.connect(self.translation)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)
    def translation(self):
        if self.textEdit.toPlainText()=='':
            context='None'
        else:
            context= self.textEdit.toPlainText()
        st=Fanyi(context)
        self.textEdit_2.setText(st)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.textBrowser.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'SimSun\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:24pt;\">爬虫翻译</span></p></body></html>"))
        self.pushButton_3.setText(_translate("MainWindow", "清除所有文本"))
        self.pushButton_2.setText(_translate("MainWindow", "关闭窗口"))
        self.label.setText(_translate("MainWindow", "请输入翻译内容"))
        self.pushButton.setText(_translate("MainWindow", "翻译"))
        self.label_2.setText(_translate("MainWindow", "翻译结果"))

fanyi.py 有道翻译代码块,只能翻译一句话

# -*- coding:utf-8 -*-
import requests

# 把代码封装成函数更python
def Fanyi(word):
    url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
    data = {'i': word,
            'from': 'AUTO',
            'to': 'AUTO',
            'smartresult': 'dict',
            'client': 'fanyideskweb',
            'doctype': 'json',
            'version': '2.1',
            'keyfrom': 'fanyi.web',
            'action': 'FY_BY_REALTIME',
            'typoResult': 'false'}
    # 将需要post的内容,以字典的形式记录在data内。
    r = requests.post(url, data=data)
    # post需要输入两个参数,一个url,一个是data,返回的是一个Response对象
    answer = r.json()
    result = answer['translateResult'][0][0]['tgt']
    # print('"'+ word + '"的翻译结果:' + result + '\n')
    return result

# if __name__=="__main__":  #自己设计输入结束的条件,原谅我懒弄了个死循环
#     Fanyi(input('请输入:'))

run_test.py 主程序代码块

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
import test

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

    mainW=QMainWindow()
    ui=test.Ui_MainWindow()
    ui.setupUi(mainW)

    mainW.show()
    sys.exit(app.exec_())

最后界面
在这里插入图片描述

2 刘金玉编程学习过程

2.1 补充pyuic命令解析

在这里插入图片描述
在这里插入图片描述

2.2 PyQt5与Qtdesigner的一些对照分析

函数或语句功能
move(x,y)移动窗体
resize(w,h)调整窗体大小
exec_()表示程序界面监听事件的开始,是一个死循环
类库或类包功能
QtWidgets管理各控件的一个基类
QApplication应用程序类
QtCore包含枚举类的类库
QtGui设置图标、字体等的类包
sysPython系统类库

2.3 PyQt5设置窗体图标

设置窗体标题

  def retranslateUi(self, Form):
      _translate = QtCore.QCoreApplication.translate
      Form.setWindowTitle(_translate("Form", "佳明"))

或者在前面

Form.setWindowTitle("世界")

设置图标

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QIcon  # 注意此处继续导入类库

Form.setWindowIcon(QIcon("img\\fig1.png"))  # 自己选择放置位置

图标较好的下载位置:iconfont,下载尽量使用png或者gif,可使得图片背景透明.
在项目中,我们往往将所有图标放到同一个文件夹中,然后通过同一个相对路径进行调用.
设置两个窗口不同图标所有代码

#  new1.py
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QIcon

class Ui_Form(object):
  def setupUi(self, Form):
      Form.setObjectName("Form")
      Form.resize(622, 511)
      Form.setWindowTitle("世界")
      self.retranslateUi(Form)

      QtCore.QMetaObject.connectSlotsByName(Form)

  def retranslateUi(self, Form):
      _translate = QtCore.QCoreApplication.translate
#  run_new1.py
import sys
from PyQt5.QtWidgets import QApplication,QWidget
import new1
from PyQt5.QtGui import QIcon

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

  mainW=QWidget()
  ui=new1.Ui_Form()
  ui.setupUi(mainW)
  mainW.setWindowIcon(QIcon("img\\fig1.png"))
  mainW2=QWidget()
  ui2=new1.Ui_Form()
  ui2.setupUi(mainW2)
  mainW2.setWindowIcon(QIcon("img\\fig2.png"))

  mainW.show()
  mainW2.show()
  sys.exit(app.exec_())

在这里插入图片描述
通过QWidget的setWindowlcon设置出来的窗体的图标,可以是每个窗体一个图标.
通过Qapplication的setWindowlcon设置出来的窗体的图标,可以是每个窗体用一样的图标
如果把框体没有单独设置窗体图标,那么使用Qapplication的setWindowlcon会统一设置

# mainW2.setWindowIcon(QIcon("img\\fig2.png"))
app.setWindowIcon(QIcon("img\\fig1.png"))

在这里插入图片描述

2.4 PyQt5显示提示框

使用函数setToolTip,基本上所有的控件和窗体都有这个函数.
使用格式: 控件对象.setToolTip(“需要提示的字符串”)
按钮和控件都是作为类的存在
小技巧:系统中文件查找加可以搜索所有包含这个关键词的所有文件*

如何查找所需要的类?
我们可以在Pycharm上,通过Ctrl+PyQt5到其代码,再右键__init__.py,open in File Path找到PyQt5文件安装所在位置.
然后利用模糊查找找到我们所需要的类的位置.
后到程序中去找到对应类.

下面为 显示提示框代码 run_new1.py

# 需要导入QToolTip类库,通过QToolTip的setFont方法设置文字样式
# 需要导入Qfont类库,实例化Qfont类进行文字样式设置,这个显示样式的设置是在全局样式中呈现效果的

import sys, new1
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QToolTip
from PyQt5.QtGui import QIcon, QFont

if __name__=='__main__':
    app=QApplication(sys.argv)
    QToolTip.setFont(QFont('隶书',40))

    W=QWidget()
    ui=new1.Ui_Form()
    ui.setupUi(W)

    W.setWindowIcon(QIcon("img\\fig1.png"))
    W.setToolTip("你忘记吃饭了")
    # 实例化一个按钮(按钮文字,父容器)
    btn=QPushButton("老师",W)   # 此按钮类最终是继承了QWidget这个类型
    btn.move(250,250)  # 对按钮在父容器中的位置进行控制
    btn.setToolTip("我知道你吃了饭")
    btn.setFont(QFont('隶书',33))

    W.show()
    sys.exit(app.exec_())

在这里插入图片描述

2.5 PyQt5类封装

作为优秀的程序员应当擅于类封装.
同时我们要会用纯代码来写PyQt5程序.

一个很粗略的自定义类

class Myclass(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        # self.move(20,20)
        # self.resize(300,300)
        self.setGeometry(20,20,300,300)
        btn=QPushButton("老师",self)
        btn.move(50,50)
        btn.clicked.connect(self.close)
        self.show()

if __name__ == "__main__" :
    app=QApplication(sys.argv)
    mc=Myclass()
    app.exec_()  # 死循环监听窗体上所有信号

窗体上对GUI的行为都是对某个事件的行为,GUI被事件驱动.
其它方式编程做相应改写即可.

信号槽的简单使用:
格式:信号源.信号.connect(槽)
格式解释:信号源(按钮)信号(clicked)connect(某个事件方法)
注意在绑定信号槽的过程中,我们的槽方法不能加括号.

2.6 PyQt5消息盒子QMesageBox

目标效果:点击按钮出现消息选择框,再选择下一个按钮.
不同图标的消息类别:带有图标的消息盒子,图标可以是问号question,信息information,警告warning,当然也可以自定义其它
思路:
前面程序当点击关闭按钮的时候,执行的是窗体的关闭,而窗体的关闭等同于点击窗体右上角的关闭X的自带按钮的效果,这个效果是QWidget基类所实现的.
那么我们可以重写父类的关闭实现方法来实现其它关闭效果.
下面进入到QWidget里面查找close方法并做相应复制后改写.

如何阻止事件关闭.
event.accept() 同意操作
event.ignore() 忽略操作
主要代码

import sys
from PyQt5.QtWidgets import QApplication, QMessageBox,QWidget,QPushButton,QToolTip
from PyQt5.QtGui import QIcon, QFont

class Myclass(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        QToolTip.setFont(QFont('隶书', 40))
        self.setGeometry(500,250,622, 511)
        self.setWindowTitle("世界")
        self.setWindowIcon(QIcon("img\\fig1.png"))
        self.setToolTip("你忘记吃饭了")
        btn = QPushButton("老师", self)  # 此按钮类最终是继承了QWidget这个类型
        btn.move(300,300)
        btn.setToolTip("我知道你吃了饭")
        btn.setFont(QFont('隶书', 33))
        btn.clicked.connect(self.close)
        self.show()

    def closeEvent(self, event):  # 重写后名称可自己定义,这里为event
        print("你的名字:")
        # 重写关闭事件,最后一个为默认,格式:(self,消息标题,消息内容,默认按钮),最后返回一个选中结果
        result=QMessageBox.question(self,"温馨提示您:","您真的要关闭窗体吗?",QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes)
        if result==QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()
            QMessageBox.information(self,"消息","谢谢!")

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

在这里插入图片描述

2.7 PyQt5窗体居中和布局

默认情况下,窗体位置居中.
标签文本控件 导入类库QLabel

lbl=QLabel("你快乐吗?",self)

利用width手动设计居中效果

if __name__=="__main__":
    app=QApplication(sys.argv)
    dk=app.desktop()
    ui=Myclass()
    ui.move(dk.width()/3,50) # 桌面居中
    ui.move(dk.width()/2-ui.width()/2,50)  # 水平居中
    # 同样使用.height()算高度
    app.exec_()

绝对布局:直接通过move到某个像素点的位置,好处是非常灵活.

2.8 PyQt5窗体的绝对布局和相对布局

相对布局是指布局中的控件可以随着窗体的变化而变化,布局中控件之间的距离可以按照比例来调节.
导入类QVBoxLayout,QHBoxLayout,QGridLayout来进行垂直布局、水平布局、网格布局
这里面我们使用了QLineEdit 单行输入文本框
水平布局,后面几种均为相对布局.

 self.setGeometry(app.desktop().width()/2-self.width()/2,50,400,300)
 
 lelcode=QLabel("验证码",self)
 lecode=QLineEdit(self)
 btncode=QPushButton("验证",self)

 hlayout=QHBoxLayout(self)  # 所有控件只能在水平方向排列
 hlayout.addWidget(lelcode)
 hlayout.addWidget(lecode)
 hlayout.addWidget(btncode)

在这里插入图片描述
垂直布局

lelcode=QLabel("验证码",self)
lecode=QLineEdit(self)
btncode=QPushButton("验证",self)

vlayout=QVBoxLayout(self)
vlayout.addWidget(lelcode)
vlayout.addWidget(lecode)
vlayout.addWidget(btncode)
vlayout.addStretch()  # 弹簧,比例为空白部分

在这里插入图片描述
网格布局

lbltitle=QLabel("标题")
blauthor=QLabel("作者")
lblcontent=QLabel("内容")

letitle=QLineEdit()
leauthor=QLineEdit()
lecontent=QTextEdit()

grid=QGridLayout(self)
# grid.setSpacing(20)   # 设置空格,此外还有很多额外设置
grid.addWidget(lbltitle,0,0)
grid.addWidget(letitle,0,1)
grid.addWidget(lblauthor,1,0)
grid.addWidget(leauthor,1,1)
grid.addWidget(lblcontent,2,0)
grid.addWidget(lecontent,2,1)

在这里插入图片描述
多行文本框有很多基本的功能.

2.9 PyQt5按钮控件QPushButton应用案例,程序三原色

制作三原色可调换界面.
思路
(一)制作界面采用PyQt5进行布局
(二)采用盒子布局的方法进行界面布局
(三)按钮的状态功能加入
(四)设置QFrame的背景颜色
(五)设置按钮的点击事件
(六)设置三原色的情况,最终还是要通过改变QFrame的样式来实现颜色变化
完整代码如下,背景颜色可随着按钮点击不同而变化

import sys
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QFrame,QVBoxLayout,QHBoxLayout
from PyQt5.QtGui import QColor

class Myclass(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("我的三原色")
        # 下面设置类中全局变量,此中红、绿、蓝取值范围为0-255
        self.color=QColor(0,0,0)
        dk=app.desktop()
        self.setGeometry(dk.width()/4-self.width()/4,200,400,300)

        btnRed=QPushButton("红")
        # 使用 setCheckable方法可以设置按钮是否可以选中与不选中的状态切换,默认情况下此方法设置的值为False
        btnRed.setCheckable(True)
        # 槽函数的定义要看我们的信号源是否有参数,信号源中有参数的部分的信号参数需要使用中括号
        btnRed.clicked[bool].connect(self.setColor)
        btnGreen = QPushButton("绿")
        btnGreen.setCheckable(True)
        btnGreen.clicked[bool].connect(self.setColor)
        btnBlue = QPushButton("蓝")
        btnBlue.setCheckable(True)
        btnBlue.clicked[bool].connect(self.setColor)

        vlo=QVBoxLayout() # 垂直方向
        vlo.addWidget(btnRed)
        vlo.addWidget(btnGreen)
        vlo.addWidget(btnBlue)

        # 框架容器 QFrame,必须使用类库 QFrame,这里面水平右侧隔开一段空白
        # 初始化为上面语句,父容器可以采用后期添加到盒式布局的方式进行设置,也可以在初始化时设置
        # 父容器的设置会影响子容器的生命周期
        self.myframe=QFrame()

        # 控件设置CSS风格,可以通过setStylesheet方法来设置,此法几乎在所有QWidget的控件上都能实现
        # 设置默认背景颜色(myframe部分),这里{}里面为一个字符串,书写风格 “要控制的控件标签或行为{属性:值}”
        self.myframe.setStyleSheet("QWidget{background-color:%s}"%self.color.name())
        hlo=QHBoxLayout(self)    # 水平方向
        hlo.addLayout(vlo)
        hlo.addWidget(self.myframe)

        self.show()

    def setColor(self,p):  # 实际上这里的p是bool值,表示点了按钮后的按钮状态
        # 通过 sender 函数来实现传递参数控件作用
        b=self.sender()
        # print(b.text())  # 这里b.text()为红、绿、蓝三种属性
        # 根据是否选中按钮来决定颜色的值是否拥有
        if p:
            v=255
        else:
            v=0
        # 根据按钮的文字来决定哪个参数被赋值为255或者0
        if b.text()=="红":
            self.color.setRed(v)
        elif b.text()=="绿":
            self.color.setGreen(v)
        elif b.text()=="蓝":
            self.color.setBlue(v)
        # color.name为16进制存储
        self.myframe.setStyleSheet("QWidget{background-color:%s}" % self.color.name())

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

在这里插入图片描述
在这里插入图片描述

2.10 PyQt5单行文本框QLineEdit文本改变事件

其为单行文本框,对应于文本改变事件textChanged,结合信号槽.
标签使用QLabel,默认宽度为固定的.当标签文本内容超过标签宽度的显示区域时,超出部分的内容就会进行遮挡,此时我们可以考虑让标签的内容进行区域自适应,使用adjustsize.
完整代码如下

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

class Myclass(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("美丽的世界")
        self.setGeometry(400,100,400,300)
        self.lbl=QLabel("显示区",self)
        self.lbl.move(50,50)

        le=QLineEdit(self)
        # 注意信号在传参时要将小括号改为中括号
        le.textChanged[str].connect(self.ljmTxt)
        self.show()

    def ljmTxt(self,s):
        # print(s)  # 信号一旦改变就会整串的输出最新文本
        self.lbl.setText(s)
        self.lbl.adjustSize()

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

在这里插入图片描述

2.11 PyQt5复选框QCheckBox控件状态事件应用

状态复选框应用.
我们案例中的QFrame实际上本质是一个QWidget.
使用stateChanged信号,可以传递整型参数.
通过self对象的sender方法就可以区分不同控件传过来的参数.
完整代码

import sys
from PyQt5.QtWidgets import QApplication,QWidget,QFrame,QCheckBox
from PyQt5.QtCore import Qt

class Myclass(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("美丽的世界")
        self.setGeometry(400,100,400,300)

        myframel=QFrame(self) # 外面是一个frame,里面有两个按钮
        self.ck1=QCheckBox("跳舞",myframel)  # 设置复选框
        self.ck1.stateChanged[int].connect(self.myState)  # 此时当选中时传入2,取消勾选时传入0
        self.ck2=QCheckBox("唱歌",myframel)
        self.ck2.stateChanged[int].connect(self.myState)
        self.ck2.move(0,30)
        myframel.move(50,50)  # 两个同时移动
        self.show()

    def myState(self,a):
        s=self.sender()  # s实为不同的地址
        if a==Qt.Checked:  # 写成 Qt.Checked能更方便阅读代码
            print(s.text())
        else:
            print("取消"+s.text())

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

在这里插入图片描述
注:Qt中有很多枚举类表示,比如该案例中选中复选框使用2对应表示Qt.Checked,写成枚举类型的好处是方便我们阅读代码.

2.12 PyQt5滑块控件QSlider应用

滑块控件Qslider用于左右滑动,往往这类滑动更多用于屏幕可以触碰的设备.

完整代码

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

class Myclass(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("美丽的世界")
        self.setGeometry(400,100,400,300)
        # 注意此处在Qt后面按ctrl并点击Horizontal可看到其值,格式:(方向,父容器)
        # 其实枚举起到作用的是数值,最终对应的还是数值,将对应位置改为1一样效果
        s1=QSlider(Qt.Horizontal,self)  # 水平滑块,垂直为 Qt.Vertical
        s1.move(50,50)
        s1.setMinimum(0) # 滑块控件最小值设置
        s1.setMaximum(255)  # 最大值设置,此处 0-255 对应到颜色的数值
        s1.valueChanged[int].connect(self.myValue)
        self.setStyleSheet("QWidget{background-color:black}")
        self.show()

    def myValue(self,a):  # a 为滑块状态对应值
        mycolor=QColor(0,0,0)
        mycolor.setGreen(a)
        self.setStyleSheet("QWidget{background-color:%s}"% mycolor.name())

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

在这里插入图片描述
在这里插入图片描述

2.13 PyQt5进度条QProgressBar应用

制作案例:
(一)界面由进度条和按钮组成
(二)进度条的值范围为0~100
(三)按钮的状态为“开始”、“停止”、“完成”
(四)按钮需要能够控制进度条的运行
导入时钟类库QBasicTimer,时间控件的作用是决定每隔多少时间执行一次时钟内部的代码,时间单位为毫秒,1 s=1000 ms.

QBasicTimer控件解析

方法用途
isActive方法返回时钟控件是否开启,如果开启返回True,否则返回False
start方法使得时钟控件开启,需传入时间间隔(ms)
stop方法使得时钟控件关闭
timerId方法返回当前时钟控件的ID,这个主要用于多个时钟控件使用的时候,以区分不同时钟控件

其对应的槽方法是Qwidget控件自带的 timerEvent 事件,时钟控件每隔多少时间运行一次的代码就在timerEvent方法中,我们在使用时钟控件中要重写这个方法.

完整代码

import sys
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QProgressBar
from PyQt5.QtCore import QBasicTimer

class Myclass(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("美丽的世界")
        self.setGeometry(400,100,500,300)
        # 载入进度条控件
        self.pgb=QProgressBar(self)
        self.pgb.move(50,50)
        self.pgb.resize(400,20)

        # 配置一个值表示进度条的当前进度
        self.pv=0

        #声明一个时钟控件
        self.timer1=QBasicTimer()

        # 设置进度条的范围
        self.pgb.setMinimum(0)
        self.pgb.setMaximum(100)
        self.pgb.setValue(self.pv) # 设置值并进行展示

        # 载入按钮
        self.btn=QPushButton("开始",self)
        self.btn.setGeometry(50,100,150,30)
        self.btn.clicked.connect(self.myTimerState) # 此处不需要传参
        self.show()

    def myTimerState(self):
        if self.timer1.isActive(): # 判断时钟控件是否开启,如果开启的话,点击就使得其停止
            self.timer1.stop()
            self.btn.setText("开始")
        else:
            self.timer1.start(10,self) # 1s进行10次,也就是100ms进行1次
            self.btn.setText("停止")

    # 重写槽方法
    def timerEvent(self,e):  # 此处为每隔一秒进行一次自定义的操作
        if self.pv==100:  # 设置完成状态
            self.timer1.stop()
            self.btn.setText("已完成,点击关闭")
            self.btn.clicked.connect(self.close)
        else:
            self.pv += 1
            self.pgb.setValue(self.pv)

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

在这里插入图片描述

2.14 PyQt5载入图片QPixmap应用

最终图片的显示载体QLabel,显示文字或图片.
所调用的图片类QPixmap所在类库为QtGUI.
完整代码

import sys
from PyQt5.QtWidgets import QApplication,QWidget,QLabel, QPushButton
from PyQt5.QtGui import QPixmap

class Myclass(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("美丽的世界")
        self.setGeometry(400,100,500,300)
        self.lbl=QLabel("图片",self)
        self.pm=QPixmap("./img/fig3.png") # 想要显示图片,必须要有图片的容器
        self.lbl.setPixmap(self.pm)  # 默认显示大小和图片原大小一样
        self.lbl.resize(300,300)      # 如果仅仅设置label大小而不进行自适应的话只会显示图片部分区域
        self.lbl.setScaledContents(True)  # 设置图片尺寸自适应

        # 移除图片按钮
        btn1=QPushButton("移除图片",self)
        btn1.clicked.connect(self.myRemovePic)
        btn1.move(350,50)
        # 添加图片按钮
        btn2=QPushButton("增加图片",self)
        btn2.clicked.connect(self.myAddPic)
        btn2.move(350,150)
        self.show()

    def myRemovePic(self):
        self.lbl.setPixmap(QPixmap(""))
    def myAddPic(self):
        self.lbl.setPixmap(QPixmap("./img/fig3.png"))

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

在这里插入图片描述

2.15 PyQt5下拉列表控件QComboBox

案例:省市联动选择.
需要载入类QComboBox.
完整代码

import sys
from PyQt5.QtWidgets import QApplication,QWidget,QLabel,QComboBox,QFrame

class Myclass(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("美丽的世界")
        self.setGeometry(400,100,500,300)

        myframe1=QFrame(self)  # 便于进行整体调节
        myframe1.move(50,50)
        #省
        lbl1=QLabel("省",myframe1)
        lbl1.move(0,3)
        combo1=QComboBox(myframe1)
        combo1.move(30,0)  # 注意这里的位置为相对于 myframe 的位置
        combo1.setEditable(True)  # 使之可以输入文字
        combo1.activated[str].connect(self.myActivated)  # 传参和连接,str传所选文本(字符串)
        # combo1.activated[int].connect(self.myActivated)  # 传递整型参数,从0开始依次传索引
        # 装入省份
        combo1.addItem("请选择省份")
        combo1.addItem("四川")
        combo1.addItem("新疆")
        combo1.addItem("广东")
        # 市
        lbl2=QLabel("市",myframe1)
        lbl2.move(140,3)
        self.combo2=QComboBox(myframe1)  # 必须将需要联动的控件做出类对象的属性,即加上self.
        self.combo2.move(165,0)
        self.show()

    def myActivated(self,s):
        self.combo2.clear()  # 每一次选择时都对之前的记录进行一次情况
        if s=="四川":
            self.combo2.addItem("成都")
            self.combo2.addItem("遂宁")
            self.combo2.addItem("绵阳")
        elif s=="广东":
            self.combo2.addItem("东莞")
            self.combo2.addItem("广州")
        else:
            self.combo2.addItem("乌鲁木齐")

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

在这里插入图片描述

2.16 PyQt5日历控件QCalendarWidget应用

案例:日历控件的使用
(一)制作一个垂直布局(盒子模型)
(二)载入一个日历控件 QCalendarWidget 和一个 QLabel 控件
(三)要求在点击日历控件的日期时,能够将获取到的日期显示到我们的label上

注意编程时只有载入类库后才会有代码提示.
案例期间两种方法:
(一)mydate.toString(“yyyy年MM月dd日”)
(二)使用系统定义好的方式:mydate.toString(1) 这是枚举类方法,数字可任选

完整代码

import sys
from PyQt5.QtWidgets import QApplication,QWidget,QLabel,QCalendarWidget,QVBoxLayout
from PyQt5.QtGui import QFont
from PyQt5.QtCore import QDate

class Myclass(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("美丽的世界")
        self.setGeometry(400,100,500,300)
        # 日历控件
        cal=QCalendarWidget()
        cal.clicked[QDate].connect(self.myCalendar)
        self.lbl=QLabel("这里显示日期")
        self.lbl.setFont(QFont("华文行楷",18))   # 可以在双引号中设为空,以直接使用默认格式
        # 盒子模型
        vlo=QVBoxLayout(self)
        vlo.addWidget(cal)
        vlo.addWidget(self.lbl)
        self.show()

    def myCalendar(self,d):   # 默认的d的显示格式为这样的 PyQt5.QtCore.QDate(2021, 10, 6)
        # 使用 toString 方法来格式化日期
        mydate=QDate(d)
        self.lbl.setText(mydate.toString("yyyy年MM月dd日"))  # toString()设置到相应时间格式,每个字母表示一位数
        # self.lbl.setText(mydate.toString(1))    # 使用系统中已定义好的方式  也可写 Qt.ISODate

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

在这里插入图片描述

2.16 PyQt5 菜单menu应用,新建多窗体

案例:菜单
内容:
(一)新建第一个窗体
(二)一级菜单的配置
(三)二级菜单的配置
(四)利用菜单功能实现界面跳转,实现一个多窗体的打开
(五)利用菜单功能实现温馨提示
开发思路:
(一)导入类 QMainWindow(相比QWidget加了一些菜单还有其他功能)
(二)使用Qmenu菜单类,这个菜单我们可以从窗体本身的方法进行获取
(三)利用Qmenu的功能,来实现多级菜单addAtion(导入类QAction),这是一个直接产生点击事件的行为,也可以用addMenu功能来增加子菜单.
(四)每次都要弹出新窗体,这个新窗体,我们要制作成全局的窗体.
(五)使用Qmessagebox来实现一个简单的帮助.

建议一个窗体就写一个类,那么每一次新的窗体出现的时候,就实例化这个窗体类就行了.但如果想要这个窗体被一直死循环监听,必须要把这个窗体作为程序的全局变量,否则会出现闪退现象.

新建一个窗体:
step1:直接写一个自定义的类窗体
step2:将这个窗体先不要show
step3:将这个类窗体在main中进行实例化,作为全局变量
step4:在槽的行为中,将这个窗体show出来

新建多个窗体:
step1:这里要实例化多个窗体,且这些窗体均为全局变量
step2:这里我们要考虑使用列表作为全局变量来承载这些窗体对象
step3:此时,我们需要在自定义的类中书写show的代码
全部代码

import sys
from PyQt5.QtWidgets import QApplication,QWidget,QMainWindow,QAction,QMessageBo

class Myclass(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("美丽的世界")
        self.setGeometry(300,100,700,500)
        # 制作菜单
        # 利用窗体本身有的菜单栏功能进行载入菜单,这里运用QMainWindow本身功能的继承更简便
        mymenu=self.menuBar()  # 总菜单
        # 直接将子菜单写在父级菜单下方,这样更方便理解,子菜单的添加使用 addMenu方法
        fileMenu=mymenu.addMenu("文件") # 父一级菜单
        actNewWin=QAction("新建窗体",self)
        actNewWin.triggered.connect(self.myNewWin)
        fileMenu.addAction(actNewWin)
        recentFile=fileMenu.addMenu(("最新的"))  # 二级菜单
        recentFile.addAction("文件1")  # 实现子菜单的三级联动
        recentFile.addAction("文件2")
        mymenu.addAction("运行")
        mymenu.addAction("调试")
        actHelp=QAction("帮助",self)
        actHelp.triggered.connect(self.wodeHelp)  # 触发按钮
        mymenu.addAction(actHelp)
        self.show()

    def wodeHelp(self):   # 通过消息框进行提示
        msgbox=QMessageBox(QMessageBox.Information,"帮助","欢迎加入我们",QMessageBox.Ok,self)
        msgbox.show()
    def myNewWin(self):
        # mc2.show()
        list1.append(Myclass2())

class Myclass2(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("去奔跑吧")
        self.show()

if __name__=="__main__":
    app=QApplication(sys.argv)
    mc=Myclass()
    # mc2=Myclass2()  # 单窗体
    list1=[]  # 多窗体
    app.exec_()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.17 PyQt5的label控件进阶使用,设置兄弟控件,广告植入

案例:快捷定位
目标:1.兄弟控件的绑定 2.实现浏览器的打开链接
完整代码

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

class Myclass(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("美丽世界")
        self.resize(400,300)
        # 兄弟控件绑定
        lblname=QLabel(self)
        lblname.setText("姓名(&1):")   # 在label控件上写上快捷键的绑定形式,使用&符号后接数字或字母,在实际中代表 alt+实际键位
        lblname.move(50,54)
        lename=QLineEdit(self)
        lename.move(130,50)
        lblname.setBuddy(lename)  # 绑定后按 alt+1/2 能自由切换

        lbldream = QLabel(self)
        lbldream.setText("愿望(&2):")
        lbldream.move(50, 104)
        ledream=QLineEdit(self)
        ledream.move(130,100)
        lbldream.setBuddy(ledream)
        # 插入网页链接
        lblbc=QLabel(self)
        # 链接在html中用a标签来代表,''中为链接目标
        lblbc.setText("<a href='http://bcczcs.com'>编程创造城市</a>")
        lblbc.move(120,150)
        lblbc.setOpenExternalLinks(True)
        self.show()

if __name__=="__main__":
    app=QApplication(sys.argv)
    mc=Myclass()
    sys.exit(app.exec_())

在这里插入图片描述

2.18 PyQt5 使用QTimer实现图片轮播

时钟控件的好处是可以自定义槽方法.
掌握超时信号timeout: 也就是超时后,要执行什么代码,执行什么槽函数.
完整代码

import sys
from PyQt5.QtWidgets import QApplication,QWidget,QLabel
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QPixmap

class Myclass(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("美丽世界")
        self.resize(600,300)
        self.n=2
        self.pm=QPixmap("img/fig"+str(self.n)+".png")
        self.lblpic=QLabel(self)
        self.lblpic.setPixmap(self.pm)
        self.lblpic.setGeometry(self.width()/2-self.lblpic.width()/2,50,200,200)
        self.lblpic.setScaledContents(True)
        self.lbl2=QLabel(self)
        self.lbl2.setText("图片轮播")

        timer1=QTimer(self)
        timer1.timeout.connect(self.timer_TimeOut)
        timer1.start(100)
        self.show()

    def timer_TimeOut(self):
        self.n+=1
        if self.n>3:
            self.n=1
        self.pm = QPixmap("img/fig" + str(self.n) + ".png")
        self.lblpic.setPixmap(self.pm)

if __name__=="__main__":
    app=QApplication(sys.argv)
    mc=Myclass()
    sys.exit(app.exec_())

在这里插入图片描述
在这里插入图片描述
其它的课程就不看了,如果要深入进去是要学非常非常多的东西.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值