首先配置环境,多看看官网和文档!!!PyQt比Python自带的那个GUI组件强大很多。
主要是对库的基本使用方法和控件(按钮,输入控件,展示控件)做阐述。
目录
常见模块
1、QtCore模块涵盖了包的核心的非GUI功能,此模块被用于处理程序中涉及到的 time、文件、目录、数据类型、文本流、链接、mime、线程或进程等对象。
2、QtGui模块涵盖多种基本图形功能的类; 包括但不限于:窗口集、事件处理、2D图形、基本的图像和界面 和字体文本。
3、QtWidgets模块包含了一整套UI元素组件,用于建立符合系统风格的classic界面,非常方便,可以在安装时选择是否使用此功能。
4、QtMultimedia模块包含了一套类库,该类库被用于处理多媒体事件,通过调用API接口访问摄像头、语音设备、收发消息(radio functionality)等。
5、QtBluetooth模块包含了处理蓝牙活动的类库,它的功能包括:扫描设备、连接、交互等行为。
6、QtNetwork模块包含用于网络编程的类库,这组类程序通过提供便捷的TCP/IP 及 UDP 的 c/s 程式码集合,使得基于Qt的网络编程更容易。
7、QtPositioning模块用于获取位置信息,此模块允许使用多种方式达成定位,包括但不限于:卫星、无线网、文字信息。此应用一般用于网络地图定位系统。
8、Enginio模块用于构建客户端的应用程式库,用于在运行时访问 Qt Cloud 服务器托管的应用程序。
9、QtWebSockets模块包含了一组类程序,用以实现websocket协议。
10、QtWebKit包含了用于实现基于webkit2的网络浏览器的类库。
11、QtWebKitWidgets模块包含用于基于WebKit1的Web浏览器实现的类,用于基于QtWidgets的应用程序
12、QtXml模块包含了用于处理XML的类库,此模块为SAX和DOM API 的实现提供了方法。
13、QtSvg模块通过一组类,为显示矢量图形文件的内容提供了方法。
14、QtSql模块提供了数据库对象的接口以供使用
15、QtTest模块包含了可以通过单元测试,以调试PyQt5应用程式的功能。
PyQt程序基本结构
- 导入所需包与模块
- 创建一个应用程序对象
- 控件的操作(创建、设置、展示)
- 应用程序执行,进入消息循环队列
#导入所需
from PyQt5.QtWidgets import QLabel, QFrame, QApplication, QWidget
import sys
# 创建一个应用程序
app = QApplication(sys.argv)
#控件的操作
window = QWidget() #创建一个空白控件,当做顶层父控件使用
lable = QLabel(window)#
lable.setText("hello xiaobin") #设置
window.setWindowTitle("第一个PyQt应用程序")
window.show() #展示
#应用程序展示
sys.exit(app.exec_())
####也可以将其设置为活动模板
或者
import sys
from PyQt5.QtWidgets import QWidget, QApplication, QLabel
"""面向对象版本"""
class Window(QWidget):
def __init__(self):
super().__init__()
self.resize(500,500)
self.setWindowTitle("XB")
lable = QLabel(self)
lable.setText("hello xiaoxbin")
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
效果如图
继承关系
- 导入查看控件
- 打印
以获取QWidget的子类为例:
from PyQt5.QtWidgets import QWidget
print(QWidget.__subclasses__())
以下是GUI中所有的基类:
样式控制QSS
和CSS类似的功能,但是不完全通用,详见帮助文档。
初步使用:
这里要涉及Object对象的设置对象名称和属性的API,在上面例子的基础上:
lable = QLabel(self)
lable.setText("hello xiaoxbin")
lable.setStyleSheet("font-size:20px;color:red;")
效果如图:
注: lable.setStyleSheet("font-size:20px;color:red;")设置了样式
但是在实际开发中一般单独写成xxx.qss文件分离开来,先编写xxx.qss文件:
QLabel
{
font-size:20px;color:red;
}
在python文件中:
with open("testqss.qss","r") as f:
qApp.setStyleSheet(f.read())
lable = QLabel(self)
lable.setText("hello xiaoxbin")
注:与上面的例子中的lable.setStyleSheet("font-size:20px;color:red;")是一样的。
但是这样会把所有的Label控件的格式都设置成这样,为了进行区分就要使用id选择器,格式为:标签名+#+id:
QLabel#xx1
{
font-size:20px;color:red;
}
然后用setObjectName()设置对应的id即可
with open("testqss.qss","r") as f:
qApp.setStyleSheet(f.read())
lable1 = QLabel(self)
lable1.setText("hello xiaoxbin")
lable2 = QLabel(self)
lable2.setText("hello ranxia")
lable2.setObjectName("xx1")
lable2.move(100,100)
效果如下,没有设置id的label1则没有应用该样式。
同一样式下还要进行区分的话就要用到属性了,qss文件如下:
QLabel#xx1
{
font-size:20px;
}
QLabel#xx1[xx1_level="blue"]
{
font-size:20px;color:blue;
}
QLabel#xx1[xx1_level="red"]
{
font-size:20px;color:red;
}
在python文件中用setProperty()进行设置:
with open("testqss.qss","r") as f:
qApp.setStyleSheet(f.read())
lable1 = QLabel(self)
lable1.setText("hello xiaoxbin")
lable1.setObjectName("xx1")
lable1.setProperty("xx1_level","blue")
lable2 = QLabel(self)
lable2.setText("hello ranxia")
lable2.move(100,100)
lable2.setObjectName("xx1")
lable2.setProperty("xx1_level", "red")
效果如下:
控件的父子关系操作
这里的父子关系不是继承关系,而是自己绑定的,以达到某些功能。
1、API
- setParent()
- parent()
- child()
- findChild()
- findChildren()
2、应用
一个控件如果没有父控件,其就会被当成顶层控件,各自独立,如果需要包含在某个控件之内,就需要设置父子关系,以此达到显示和生命周期约束的功能。
- 内存管理,父控件被释放子控件也会被释放(比如大控件被关闭,其上的子控件内存也会被释放)。
- 显示层级,子控件会显示在父控件上,不会超出其范围。
比如:
app = QApplication(sys.argv)
window1 = QWidget()
window1.show()
window2 = QWidget()
window2.show()
sys.exit(app.exec_())
因为没有父子关系,所以此时会出现两个窗体:
当通过setParent()设置父子关系后,加以颜色区分,如下:
信号与槽
同于对象之间的通讯。
信号与槽需要连接。也都有内置和自定义两种。一个信号可与多个槽函数连接,反之亦然,也可以和另一个信号连接。
信号:控件状态发生改变时发出,比如按钮被点击了会发出click信号。
槽:即槽函数,接收信号后会触发的事件,即处理信号的函数。
相关API:
- connect(XX):连接信号与槽函数,比如YY对象销毁时触发XX()槽函数:YY.destroy.connect(XX)。
- disconnect():取消连接信号与槽函数,比如:YY.destroy.disconnect()。
- blockSignals(boolean):临时阻断控件所有信号与槽的连接。
- singnalsBlocked():判断信号是否被阻断。
- receivers():返回连接信号的槽个数。
比如按钮的点击事件:
lable1 = QLabel(self)
lable1.setText("我还没被点击!")
button = QPushButton(self)
button.move(0,100)
button.setText("点击我")
#定义槽函数
def cao():
lable1.setText("我被点击了!")
button.clicked.connect(cao)#将按钮的点击与槽函数连接
效果如下:
QObject
也就是些API的使用,以后遇到再系统学习吧。因为它是所有控件的父类,所以至关重要,也是学所有控件用法的第一步!
QWidget
- 直接继承至QObject
- 所有可视控件的基类
- 是一个空白控件
- 通常用来作为窗口和父控件
注:子控件要在父控件展示之前设置好。
=======> API
1、获取位置
2、设置位置
3、限制尺寸‘
’4、内容边距
5、鼠标操作(形状、大小.....)
设置鼠标setCursor(),QCursor对象可用于但不局限于自定义鼠标图案。
6、鼠标重置:unSetCursor(),用来还远鼠标。
7、鼠标跟踪
8、Cursor对象:鼠标的基本对象,获取其属性之类的。
=======>事件消息
消息是层层分发的,另外如果子控件没有实现事件处理则会分发给其父控件处理,主要种类如下:
- 控件显示和关闭事件。
- 控件移动事件
- 调整大小事件
- 鼠标事件
- 键盘事件
- 焦点事件
- 拖拽事件:比如上传图片时拖进控件
- 绘制事件
- 改变事件:比如中英文切换
- 右键菜单事件
- 输入法事件
=======>事件机制
=====>父子关系扩充
在QObject的父子关系上扩充的API
=====>控件层级控制
在同一父对象的子控件中出现在控件相互遮挡,默认情况下后添加的控件会在前面,会遮挡先前出现的控件,所以需要层级控制。
=====>顶层窗口操作
注:窗口状态,标志,最大化最小化一般用在自定义窗口标题栏。
以改变程序图标为例:
icon = QIcon("icon_fish.png")
window.setWindowIcon(icon)
=======> 交互状态
注:活跃窗口就是在多个窗口下只有一个与用户交互
=======> 信息提示
比如鼠标悬停在某个控件上时状态栏会给出提示信息,一般只有组合控件才有状态栏。例:
app = QApplication(sys.argv)
window = QMainWindow()
window.resize(200,100)
window.statusBar()
window.setStatusTip("这是状态栏")
window.show()
sys.exit(app.exec_())
效果如图:
=======> 焦点控制
比如文本框的那个光标...只有获取了焦点的控件才能与用户交互。
单个控件角度
父控件角度
=======>信号
按钮控件基类-QAbstractButton
是一个抽象类,无法直接使用,只能使用其子类(可自定义),所有按钮控件的基类!!!
可用信号:
注:自动重复就是比如按下按钮不松开一直重复执行某槽函数 ;点击就是模拟点击事件调用对应的槽函数(如:click())。
其主要的子类有:
- QPushButton:普通的那种按钮
- --->QCommandLinkButton:继承至QPushButton
- QRadioButton:单选按钮
- QCheckButon:复选框
- QToolButton:下拉菜单
QPushButton
普通的按钮,比如登录、注册那个按钮,下拉菜单等。继承至QAbstractButton()。
========>构造函数
========>作为菜单
一个小案例:
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QMenu, QAction
app = QApplication(sys.argv)
window = QMainWindow()
window.resize(500,300)
#设置按钮
btn = QPushButton(QIcon("icon_fish.png"),"这是个按钮",window)
btn.resize(150,30)
#设置菜单
menu = QMenu()
redaction = QAction(QIcon("icon_fish.png"),"红色",menu)#行为就是子菜单点击后直接执行的那一项,无其子菜单
redaction.triggered.connect(lambda :window.setStyleSheet("background-color:red"))#点击后改变背景色
menu.addAction(redaction)
blueaction = QAction(QIcon("icon_fish.png"),"蓝色",menu)#行为就是子菜单点击后直接执行的那一项,无其子菜单
blueaction.triggered.connect(lambda :window.setStyleSheet("background-color:blue"))#点击后改变背景色
menu.addAction(blueaction)
menu.addSeparator()#添加分割线
#设置子菜单,就是一个QMenu加上另一个QMenu
othermenu = QMenu(menu)
othermenu.setTitle("其他")
otheraction = QAction("绿色",othermenu)
otheraction.triggered.connect(lambda :window.setStyleSheet("background-color:green"))
othermenu.addAction(otheraction)
menu.addMenu(othermenu)#添加子菜单
btn.setMenu(menu)
window.show()
sys.exit(app.exec_())
效果如下:
=======>边框是否扁平
就是取消按钮的凸起感,此时背景颜色也不再绘制。
=======>默认处理
一般应用在多个按钮情况下聚焦在某一个默认的按钮,按下enter时默认触发的按钮。
=======>右键菜单
就是点击右键会弹出一个菜单。其信号都是继承至QWidget和QAbstractButton,只有两个较为特殊:
QCommandLinkButton
- 继承至QPushButton
- 类似于单选按钮,用在一组互斥选项之间选择。
- 不应单独使用,而应作为向导和对话框中的单选按钮。
- 外观像扁平化的按钮,除了普通文本以外,还允许描述性文本。
=======>构造函数
QCommandLinkButton(parent: QWidget = None) QCommandLinkButton(str, parent: QWidget = None) QCommandLinkButton(str, str, parent: QWidget = None)
=======>信号
完全是它父类的信号,无新加。
一个小栗子:
but = QCommandLinkButton("标题","这是一个QCommandLinkButton的描述",window)
效果:
QToolButton
一般用在应用的图标导航栏那。官方文档里就一个构造函数QToolButton(parent: QWidget = None)。
but.setIcon(QIcon("icon_fish.png"))
but.setIconSize(QSize(60,60))
but.setToolTip("这是一条鱼")
效果:
========>样式风格
======>设置箭头
就是把图片那一步用自己的API设置成箭头而已。
=======>自动提升
就是设置其扁平化
=======>菜单
主要两个API:
- setMenu(QMenu)
- menu()
一般情况下不弹出菜单的,需要设置弹出模式:
=======>信号
只重写了一个,其他都是继承的。
其中的setData()这个函数绑定的数据是任意的,用于在获取action后区分不同的action以做出不同的响应。
QRadioButton
单选按钮,比如选择性别等等。一个选中另一个会被取消。继承至QAbstractButton。
=======>信号
均继承至父类,常用toggled(bool)。
=======>多组互斥
- 为了解决这个问题一般讲每组放在不同控件
- 也可以放在不同组里面(QButtonGroup),常用!!!!!。
QButtonGroup
- 提供 一个抽象的按钮容器, 可以将多个按钮划分为一组
- 不具备可视化的效果
- 继承至QObject
- 就一个构造方法:QButtonGroup(parent)
========>添加按钮
=======>查看按钮
获取指定条件的按钮
=======>移除按钮
从逻辑关系上移除指定的按钮(不是从界面上移除)。
removeButton(QAbstractButton)
=======>绑定和获取ID
设置ID, 方便识别用户选项
=======>独占设置
统一设置按钮组中的按钮是否是独占(选择互斥)
=======>信号
QCheckBox(复选框)
看文档吧,和单选框大同小异。
其他控件
前面通过对button类控件的学习和两个主要的基类QObject和QWidget的学习,基本上已经了解了PyQt的控件使用风格,其他控件也大同小异,这里不一一赘述了,实际开发中用到再深入。
输入控件
========>纯键盘文本输入
- QLineEdit:是一个单行文本编辑器,比如用来输入账号信息等。
- QTextEdit:是一个高级的WYSIWYG查看器/编辑器,支持使用HTML样式标签的富文本格式,可以加载纯文本和富文本文件。
- QPlainTextEdit:与QTextEdit大致功能实现差不多,但更适用于纯文本。
- QKeySequenceEdit:允许输入QKeySequence, 它通常用作快捷方式。采集用户在键盘按下的快捷键,外形和单行文本相似
========>步长调节(QAbstractSpinBox) (键盘+鼠标)
- QSpinBox:主要处理整数和离散值集,允许用户通过单击向上/向下按钮或按键盘上的上/下来选择一个值来增加/减少当前显示的值。用户还可以手动键入值,比如月份的调节等等。
- QDoubleSpinBox:浮点类型步长调节器,既可以通过步长调节器调整数据, 也可以通过文本框直接编辑,比如1.00 % - 99.99 %等等。
- QDateTimeEdit:编辑日期和时间的单行文本框,既可以用箭头调节, 也可以用键盘编辑输入,可以单独调节某个部分。有两个子类QDateEdit和QTimeEdit
========>组合框(下拉选择输入)
- QComboBox:是一个组合控件,可通过下拉选择界面, 选取更多的预置选项,有一个子类QFontComboBox。
========>滑块(QAbstractSlider)(鼠标)
比如音量调节,视频进度条,收音机按钮等等。
- QSlider:垂直或水平滑块,它允许用户沿水平或垂直凹槽移动滑块手柄,并将手柄的位置转换为合法范围内的整数值。
- QScrollBar:使用户能够访问比用于显示它的窗口小部件更大的文档部分,一般是结合QAbstractScrollArea使用,滚动条通常包括四个单独的控件:滑块,滚动箭头和页面控件。
- QDial:倒圆的范围控制,比如汽车仪表盘上的速度计
========>橡皮筋选中
- QRubberBand:提供一个矩形或线来指示选择或边界,一般结合鼠标事件一同协作。你如选择操作时用鼠标划一个矩形选择框。
========>对话框(QDialog)
- QFontDialog:提供了一种选择字体的对话框控件。比如WPS的字体选择。
- QColorDialog:颜色对话框的功能是允许用户选择颜色。
- QFileDialog:提供了一个对话框,允许用户选择文件或目录,允许用户遍历文件系统,以选择一个或多个文件或目录。
- QInputDialog:提供了一个简单方便的对话框,获得来自用户的单个值,输入值可以是字符串,数字或列表中的项目,设置标签以告知用户应输入的内容。
========>日期
- QCalendarWidget:提供了一个基于每月日历控件,允许用户选择一个日期。
展示控件
- QLabel:提供了文本或图像的显示,无交互功能。
- QLCDNumber:展示LCD样式的数字,它可以显示几乎任何大小的数字,它可以显示十进制,十六进制,八进制或二进制数。
- QProgressBar:提供一个水平或垂直进度条。
- 对话框(QDialog):即消息提示框,不需要添加到其他父控件。QMessageBox,QErrorMessage,QProgressDialog。
总之所有语言的GUI都差不多,多看文档熟悉API就行!!!!!!!
参考: