PyQt5简介

672 阅读6分钟

PyQt5中文教程: maicss.gitbooks.io/pyqt5/conte…

一、PyQt5简介

PyQt5 是Digia的一套Qt5与python绑定的应用框架,同时支持2.x 和3.x,Qt库由Riverbank Computing开发, 是最强大的GUI库之一

PyQt5是由一系列Python模块组成。超过620个类,6000和函数和方法

PyQt5类分为很多模块,主要模块有:

  • QtCore 包含了核心的非GUI的功能。主要和时间、文件与文件 夹、各种数据、流、URLs、mime类文件、进程与线程一起使用

  • QtGui 包含了窗口系统、事件处理、2D图像、基本绘画、字体和 文字类

QtWidgets类包含了一系列创建桌面应用的UI元素

QtMultimedia包含了处理多媒体的内容和调用摄像头API的类

QtBluetooth模块包含了查找和连接蓝牙的类

QtNetwork包含了网络编程的类,这些工具能让TCP/IP和UDP开发变得更加方便和可靠

QtPositioning包含了定位的类,可以使用卫星、WiFi甚至文本

Engine包含了通过客户端进入和管理Qt Cloud的类

QtWebSockets包含了WebSocket协议的类

QtWebKit包含了一个基WebKit2的web浏览器

QtWebKitWidgets包含了基于QtWidgets的WebKit1的类

QtXml包含了处理xml的类,提供了SAX和DOM API的工具

QtSvg提供了显示SVG内容的类,Scalable Vector Graphics (SVG)是一种是一种基于可扩展标记语言(XML),用于描述二维矢量 图形的图形格式(这句话来自于维基百科)

QtSql提供了处理数据库的工具

QtTest提供了测试PyQt5应用的工具

二、PyQt4和PyQt5的区别

PyQt5不兼容PyQt4,PyQt5有一些巨大的改进。但是,迁移并不是很难,两者的区别如下:

  • 重新组合模块,一些模块已经被废弃(QtScript),有些被分为两个子模块(QtGui, QtWebKit)

  • 添加了新的模块,比如QtBluetooth, QtPositioning,和 Enginio

  • 废弃了SINGAL()和SLOT()的调用方式,使用了新的信号和xx处 理方式

  • 不再支持所有被标记为废弃的或不建议使用的QtAPI

三、PyQt5基本的功能

1、简单的窗口

代码实现:

import sys  # 该模块提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的函数
from PyQt5.QtWidgets import QApplication, QWidget  # 导入基本的组件模块

"""
sys.argv:是一组命令行参数的列表
QWidge控件:是一个用户界面的基本控件,它提供了基本的应用构造器
默认情况下,构造器是没有父级的,没有父级的构造器被称为窗口 (window)
resize():方法能改变控件的大小,这里的意思是窗口宽250px,高 150px
move():是修改控件位置的的方法。它把控件放置到屏幕坐标的(300, 300)的位置。注:屏幕坐标系的原点是屏幕的左上角
exit():结束主循环
sys.exit():能确保主循环安全退出
exec_() :之所以有个下划线,是因为 exec 是一个Python的关键字
"""
if __name__ == '__main__':
    app = QApplication(sys.argv)  # 创建一个应用对象,sys.argv是一组命令行参数的列表
    w = QWidget()  # QWidge控件是一个用户界面的基本控件,它提供了基本的应用构造器
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Simple')  # 给这个窗口添加了一个标题,标题在标题栏展示
    w.show()  # 让控件在桌面上显示出来
    sys.exit(app.exec_())
2、带窗口图标

窗口图标通常是显示在窗口的左上角,标题栏的最左边

前一个例子是使用的过程式编程 ,Python还支持面向对象的编程

代码实现:

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon

"""
setGeometry() :有两个作用,把窗口放到屏幕上并且设置窗口大小
参数分别代表屏幕坐标的x、y和窗 口大小的宽、高。
也就是说这个方法是 resize() 和 move() 的合体
"""


# 创建构造器类,并继承构造器
class Example(QWidget):
    # 调用本身的构造器的一个方法
    def __init__(self):
        # 调用继承的构造器
        super().__init__()
        # 调用initUI方法
        self.initUI()

    # 创建一个GUI
    def initUI(self):
        self.setGeometry(300, 300, 300, 220)
        # 添加标题
        self.setWindowTitle('Icon')
        # 添加图标
        self.setWindowIcon(QIcon('default.png'))
        # 展示
        self.show()


if __name__ == '__main__':
    # 创建一个应用对象
    app = QApplication(sys.argv)
    # 创建构造器
    ex = Example()
    # 结束主循环
    sys.exit(app.exec_())

程序预览:

3、提示框

代码实现:

import sys
from PyQt5.QtWidgets import (QWidget, QToolTip, QPushButton, QApplication)
from PyQt5.QtGui import QFont


class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        # 创建一个提示框,10px的SansSerif字体
        QToolTip.setFont(QFont('SansSerif', 10))
        # 设置了提示框的字体
        self.setToolTip('This is a <b>QWidget</b> widget')
        # 调用 setTooltip() 创建提示框可以使用富文本格式的内容
        btn = QPushButton('Button', self)
        btn.setToolTip('This is a <b>QPushButton</b> widget')
        # 创建一个按钮,为按钮添加了一个提示框
        btn.resize(btn.sizeHint())
        btn.move(50, 50)
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Tooltips')
        self.show()


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

程序预览:

4、关闭窗口

关闭一个窗口最直观的方式就是点击标题栏的那个叉,这个例子里,我们展示的是如何用程序关闭一个窗口。这里我们将接触到一点single 和slots的知识,事件传递系统在PyQt5内建的single和slot机制里面

代码实现:

import sys

from PyQt5.QtWidgets import QWidget, QPushButton, QApplication

from PyQt5.QtCore import QCoreApplication  # 导入QtCore对象


class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.intUI()

    def intUI(self):
        # 创建一个按钮
        qbtn = QPushButton('Quit', self)
        # 点击事件,QCoreApplication删除事件,instance() 创建了一个它的实 例
        qbtn.clicked.connect(QCoreApplication.instance().quit)
        qbtn.resize(qbtn.sizeHint())
        qbtn.move(50, 50)
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Quit button')
        self.show()


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

程序预览:

5、消息盒子

默认情况下,我们点击标题栏的×按钮,QWidget就会关闭。但是有时 候,我们修改默认行为。比如,如果我们打开的是一个文本编辑器,并 且做了一些修改,我们就会想在关闭按钮的时候让用户进一步确认操作

如果关闭QWidget,就会产生一个QCloseEvent。改变控件的默认行 为,就是替换掉默认的事件处理

代码实现:

import sys

from PyQt5.QtWidgets import QWidget, QMessageBox, QApplication


"""
question:第一个参数显示在消息框的标题栏,
第二个参数显示在对话框,
第三个参数是消息框的俩按钮,最后一个参数是默认按钮,
这个按钮是默认选中的。返回值在变量 reply 里
"""

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

    def initUI(self):
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Message box')
        self.show()
    # 创建一个关闭事件的方法
    def closeEvent(self, event):
        # 创建一个消息框
        reply = QMessageBox.question(self, 'Message',
                                     "Are you sure to quit?",
                                     QMessageBox.Yes |
                                     QMessageBox.No, QMessageBox.No)

        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()


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

这里判断返回值,如果点击的是Yes按钮,我们就关闭组件和应用,否者就忽略关闭事件

程序预览:

6、窗口居中

窗口在屏幕上居中显示

代码实现:

import sys
from PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplication


"""
QtGui.QDesktopWidget :提供了用户的桌面信息,包括屏幕的大小
"""
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.resize(250, 150)
        # 调用居中的方法
        self.center()

        self.setWindowTitle('Center')

        self.show()

    def center(self):
        # 获取主窗口的大小
        qr = self.frameGeometry()
        # 获取显示器的分辨率,然后得到中间点的位置
        cp = QDesktopWidget().availableGeometry().center()
        # 把自己窗口的中心点放置到qr的中心点
        qr.moveCenter(cp)
        # 把窗口的坐上角的坐标设置为qr的矩形左上角的坐标
        self.move(qr.topLeft())


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