PyQt5

https://www.cnblogs.com/archisama/tag/PyQt5/
https://github.com/maicss/PyQt5-Chinese-tutorial/


用Qt Designer做完将生成的.ui文件转为.py后,需要添加以下代码才能显示窗口。

import sys
from PyQt5.QtWidgets import QApplication,QMainWindow

if __name__=='__main__':
    app=QApplication(sys.argv)
    MainWindow=QMainWindow()
    ui=Ui_MainWindow()
    ui.setupUi(MainWindow) #调用setupUi方法动态创建控件
    MainWindow.show()
    sys.exit(app.exec_())

0.PyQt帮助文档

官方手册

Qt 官方文档:https://doc.qt.io/
Qt 类的导航:https://doc.qt.io/qt-5/classes.html

本地动态生成

在CMD命令行窗口中输入:python -m pydoc -p 1234
接着输入b启动浏览,操作如下:
在这里插入图片描述

1.窗口的基本功能

#本例创建一个空白的窗口
import sys
#导入QApplication类和QWidget类
from PyQt5.QtWidgets import QApplication,QWidget
if __name__=='__main__':
    app=QApplication(sys.argv) #创建QWidget类实例,并传入命令行参数
    w=QWidget() #创建QWidget类实例,相当于创建一个窗口
    w.resize(1000,600) #将窗口的宽设为1000,高设为600
    w.move(400,200) #移动窗口
    w.setWindowTitle('PyQt5应用') #设置窗口标题
    w.show() #显示窗口
    sys.exit(app.exec_()) #进入程序的主循环,并通过exit函数确保主循环安全结束
设置窗口图标

需使用setWindowIcon方法,QApplication类和QWidget类均有该方法,Windows
系统使用哪一个都一样,而Mac OS X下需使用QApplication类的setWindowIcon方法才可。
setWindowIcon方法需传入一个图像文件路径,文件格式可为png、jpg等(建议png格式,因为其支持透明背景)

显示提示框

当鼠标放在一个按钮上时,就会出现一个显示该按钮作用或使用方法等内容的提示框。
提示框需使用QWidget类的setToolTip方法创建。

关闭窗口

关闭窗口可以直接使用系统内置的quit方法,如果单击按钮关闭窗口,可以直接将按钮的单击事件与quit绑定。

#本例对以上三个内容进行示例
import sys
from PyQt5.QtWidgets import (QApplication,QWidget,QToolTip,QPushButton)
from PyQt5.QtGui import QIcon #导入QIcon类,用于装载图像文件
from PyQt5.QtGui import QFont #导入QFont类,用于设置字体和字号
if __name__=='__main__':
    app=QApplication(sys.argv) #创建QWidget类实例,并传入命令行参数
    w=QWidget() #创建QWidget类实例,相当于创建一个窗口
    w.setGeometry(300,200,1000,600) #窗口位置(x=300,y=200),窗口尺寸(1000宽*600高)
    w.setWindowTitle('PyQt5应用') #设置窗口标题
    app.setWindowIcon(QIcon('E:/photo/165.jpg')) #设置窗口图标

    QToolTip.setFont(QFont('SansSerif',10)) #设置提示框中的文本的字体是SansSerif,字号是10
    w.setToolTip('这是一个窗口') #为窗口设置提示框
    btn=QPushButton('Quit',w) #创建一个按钮,并将按钮显示在窗口上
    btn.setToolTip('关闭窗口') #为按钮设置提示框
    btn.clicked.connect(QApplication.instance().quit) #将按钮的单击事件与quit绑定
    btn.resize(btn.sizeHint()) #设置按钮尺寸
    btn.move(50,50) #设置按钮位置

    w.show() #显示窗口
    sys.exit(app.exec_()) #进入程序的主循环,并通过exit函数确保主循环安全结束

消息盒子

消息盒子(MessageBox)其实就是各种类型的消息对话框。QMessageBox类提供了若干静态方法可以显示各种类型的对话框。例如:(以下这些方法的使用方式类似)
information方法用于显示信息对话框
warning方法用于显示警告对话框
question方法用于显示询问对话框。

#本例实现关闭窗口时弹出询问对话框询问是否真的关闭窗口
import sys
from PyQt5.QtWidgets import QWidget,QMessageBox,QApplication
#封装窗口代码的类
class MessageBox(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI() #初始化窗口
    def initUI(self):
        self.setGeometry(600,170,800,500)
        self.setWindowTitle('PyQt5应用')
        self.show() #显示窗口
    #窗口的关闭事件,closeEvent方法在窗口关闭时会自动调用,无需干预,方法名必须为closeEvent
    def closeEvent(self, QCloseEvent):
        #显示询问对话框,最后一个参数表示默认按钮是No
        reply=QMessageBox.question(self,'消息',"你真的要退出吗",QMessageBox.Yes|QMessageBox.No,QMessageBox.No)
        if reply==QMessageBox.Yes: QCloseEvent.accept()
        else: QCloseEvent.ignore()
if __name__=='__main__':
    app=QApplication(sys.argv)
    ex=MessageBox() #创建MessageBox类的实例,在该类的构造方法中通过initUI方法初始化窗口以及显示窗口
    sys.exit(app.exec_())

在这里插入图片描述

窗口居中

窗口对象(QWidget)并没直接提供让窗口居中的方法,但我们可以根据屏幕的宽高以及窗口的宽高计算出居中时窗口左上角的坐标,然后使用move方法移动。

import sys
from PyQt5.QtWidgets import QWidget,QDesktopWidget,QApplication
class CenterWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.resize(700,500)
        self.center()
        self.setWindowTitle('窗口居中')
        self.show()
    def center(self):
        desktop=app.desktop()
        #计算窗口处于屏幕中心时左上角的坐标,然后将窗口移动到中心位置
        self.move((desktop.width()-self.width())/2,(desktop.height()-self.height())/2,)

if __name__=='__main__':
    app=QApplication(sys.argv)
    ex=CenterWindow()
    sys.exit(app.exec_())

2.布局

在一个GUI程序里,布局的作用是管理应用中的控件在窗口上的摆放位置以及控件自身的尺寸。

PyQt5中支持三种布局:绝对布局,盒布局和网格布局。

绝对布局摆放的控件位置固定,不会随窗口尺寸的变化而变化,而其余两种布局可以。

绝对布局
#本例用绝对布局让3个QLabel控件在窗口的不同位置显示
import sys
from PyQt5.QtWidgets import QWidget,QLabel,QApplication
class AbsoluteLayout(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        lbl1=QLabel('姓名',self)
        lbl1.move(15,10)
        lbl2=QLabel('年龄',self)
        lbl2.move(15,40)
        lbl3=QLabel('所在城市',self)
        lbl3.move(15,70)
        self.setGeometry(300,200,700,500)
        self.setWindowTitle('绝对布局')
        self.show()
if __name__=='__main__':
    app=QApplication(sys.argv)
    ex=AbsoluteLayout()
    sys.exit(app.exec_())

在这里插入图片描述

盒布局

盒布局分为水平盒布局和垂直盒布局。
水平盒布局:将控件沿水平方向摆放,用QHBoxLayout类表示。
垂直盒布局:将控件沿垂直方向摆放,用QVBoxLayout类表示。

如果要对控件使用盒布局,需要通过盒布局对象的addwidget方法将控件添加到盒布局中;
如果要将一个布局添加到盒布局中作为子布局存在,通过盒布局对象的addLayout方法将布局对象添加到盒布局中。

#本例在窗口右下角放置两个按钮,无论窗口尺寸如何变化,两个按钮位置始终在右下角
import sys
from PyQt5.QtWidgets import (QWidget,QPushButton,QHBoxLayout,QVBoxLayout,QApplication)
class BoxLayout(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        okButton=QPushButton("确定") #创建‘确定’‘取消’按钮
        cancelButton=QPushButton("取消")
        hbox=QHBoxLayout() #创建水平盒布局对象
        hbox.addStretch() #让两个按钮始终在窗口右侧
        hbox.addWidget(okButton) #将‘确定’‘取消’按钮添加到水平盒布局
        hbox.addWidget(cancelButton)
        vbox=QVBoxLayout() #创建垂直盒布局对象
        vbox.addStretch() #让控件始终在窗口下方
        vbox.addLayout(hbox) #将水平盒布局对象添加到垂直盒布局中
        self.setLayout(vbox) #将垂直盒布局应用于当前窗口
        self.setGeometry(300,200,400,200)
        self.setWindowTitle('盒布局')
        self.show()
if __name__=='__main__':
    app=QApplication(sys.argv)
    ex=BoxLayout()
    sys.exit(app.exec_())

在这里插入图片描述

网格布局

网格布局相当于一个二维表,将窗口划分为若干行若干个列。一个控件可以摆放在一个单元格中,也可以横跨多行多列。

网格布局用QGridLayout类表示,该类中常用方法是addWidget,用于将一个控件添加到网格布局中,并指定该控件从几行几列开始以及占用几行几列。

还可以使用addSpacing方法指定在水平和垂直方向单元格之间的距离。

#本例使用网格布局创建一个提交数据的表单窗口,包含3个QLabel控件和3个文本编辑框架(QLineEdit和QTextEdit)
import sys
from PyQt5.QtWidgets import (QWidget,QLabel,QLineEdit,QTextEdit,QGridLayout,QApplication)
class FormGridLayout(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        title=QLabel('标题')
        author=QLabel('作者')
        summary=QLabel('摘要')
        titleEdit=QLineEdit()
        authorEdit=QLineEdit()
        summaryEdit=QTextEdit()
        grid=QGridLayout() #创建网格布局对象
        grid.setSpacing(10) #设置单元格之间的距离
        grid.addWidget(title,1,0) #向网络布局添加title控件,位于第2行第1列
        grid.addWidget(titleEdit,1,1)
        grid.addWidget(author,2,0)
        grid.addWidget(authorEdit,2,1)
        grid.addWidget(summary,3,0)
        grid.addWidget(summaryEdit,3,1,5,1) #向网络布局添加summaryEdit控件,位于第4行第2列,并且占用了5行1列
        self.setLayout(grid) #将网络布局应用于当前窗口

        self.setGeometry(300,300,400,300)
        self.setWindowTitle('网格布局')
        self.show()
if __name__=='__main__':
    app=QApplication(sys.argv)
    ex=FormGridLayout()
    sys.exit(app.exec_())

在这里插入图片描述

3.控件

这里介绍以下几个控件,其他控件大同小异。

QPushButton(按钮控件)、QLineEdit控件(单行文本编辑控件)、QCheckBox控件(复选框控件)、QSlider(滑块控件)、QProgressBar(进度条控件)、QPixmap(图像控件)、QComboBox(下拉列表框控件)、QCalendarWidget(日历控件)。

QPushButton控件

QPushButton是一个按钮控件,支持两种状态:一种是Normal状态,表示正常的未按下的状态;另一种是Checked状态,表示按钮被按下的状态(按钮按下后颜色变为蓝色,表示已经被选中)。

#本例用了3个QPushButton控件和1个QFrame控件。3个按钮控件分别表示红黄蓝三种状态
#当单击某一个或某几个按钮时就会分别设置RGB的每个颜色分量,并将设置后的颜色设为QFrame控件的背景色
import sys
from PyQt5.QtWidgets import (QWidget,QPushButton,QFrame,QApplication)
from PyQt5.QtGui import QColor #导入用于设置颜色的QColor类
class PushButton(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.color=QColor(0,0,0) #创建QColor对象,初始颜色为黑色
        redButton=QPushButton('红',self) #创建表示红色的QPushButton对象
        redButton.setCheckable(True) #必须使用setCheckable(True)才能让按钮可以设置两种状态
        redButton.move(10,10)
        redButton.clicked[bool].connect(self.setColor) #将setColor方法与按钮的单击事件关联,bool是一个类,表示setColor参数类
                                                       # 型是一个布尔类型,这个布尔类型的参数值表示按钮按下和抬起两种状态
        greenButton=QPushButton('绿', self) #创建表示绿色的QPushButton对象
        greenButton.setCheckable(True)
        greenButton.move(10, 60)
        greenButton.clicked[bool].connect(self.setColor)
        blueButton=QPushButton('蓝', self) #创建表示蓝色的QPushButton对象
        blueButton.setCheckable(True)
        blueButton.move(10, 110)
        blueButton.clicked[bool].connect(self.setColor)

        self.square=QFrame(self) #创建用于显示当前颜色的QFrame对象
        self.square.setGeometry(150,20,100,100)
        self.square.setStyleSheet("QWidget{background-color:%s}"%self.color.name()) #设置QFrame的背景色

        self.setGeometry(300,300,400,300)
        self.setWindowTitle('按钮控件')
        self.show()

    #按钮的单击事件方法,3个按钮共享着一个方法
    def setColor(self,pressed):
        source=self.sender() #获取单击了哪一个按钮
        if pressed:val=255 #pressed参数就是前面clicked[bool]中指定的布尔类型参数值,参数值为True表示按钮已按下,False则表示按钮已抬起
        else: val=0
        if source.text()=="红": #红色按钮按下,设置颜色的红色分量
            self.color.setRed(val)
        elif source.text()=="绿": #绿色按钮按下,设置颜色的绿色分量
            self.color.setGreen(val)
        else:  #蓝色按钮按下,设置颜色的蓝色分量
            self.color.setBlue(val)
        self.square.setStyleSheet("QFrame{background-color:%s}"%self.color.name()) #用设置后的颜色改变QFrame的背景色

if __name__=='__main__':
    app=QApplication(sys.argv)
    ex=PushButton()
    sys.exit(app.exec_())

红和绿的混合色是黄色,如下:
在这里插入图片描述

QLineEdit控件

QLineEdit是用于输入单行文本的控件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值