PyQt模块GUI(一)(大纲版)


首先配置环境,多看看官网文档!!!PyQt比Python自带的那个GUI组件强大很多。

主要是对库的基本使用方法控件(按钮,输入控件,展示控件)做阐述。


目录

常见模块

PyQt程序基本结构

继承关系

样式控制QSS

控件的父子关系操作

信号与槽

QObject

QWidget

按钮控件基类-QAbstractButton

QPushButton

QCommandLinkButton

QToolButton

QRadioButton

QButtonGroup

QCheckBox(复选框)

其他控件

输入控件

展示控件


 

常见模块

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程序基本结构

  1. 导入所需包与模块
  2. 创建一个应用程序对象
  3. 控件的操作(创建、设置、展示)
  4. 应用程序执行,进入消息循环队列
#导入所需
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_())

效果如图

 

继承关系

  1. 导入查看控件
  2. 打印

以获取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:

  1. connect(XX):连接信号与槽函数,比如YY对象销毁时触发XX()槽函数:YY.destroy.connect(XX)。
  2. disconnect():取消连接信号与槽函数,比如:YY.destroy.disconnect()。
  3. blockSignals(boolean):临时阻断控件所有信号与槽的连接。
  4. singnalsBlocked():判断信号是否被阻断。
  5. 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对象:鼠标的基本对象,获取其属性之类的。

 

=======>事件消息

消息是层层分发的,另外如果子控件没有实现事件处理则会分发给其父控件处理,主要种类如下:

  1. 控件显示和关闭事件。
  2. 控件移动事件
  3. 调整大小事件
  4. 鼠标事件
  5. 键盘事件
  6. 焦点事件
  7. 拖拽事件:比如上传图片时拖进控件
  8. 绘制事件
  9. 改变事件:比如中英文切换
  10. 右键菜单事件
  11. 输入法事件

 

=======>事件机制

 

=====>父子关系扩充

在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())。

其主要的子类有:

  1. QPushButton:普通的那种按钮
  2.                      --->QCommandLinkButton:继承至QPushButton
  3. QRadioButton:单选按钮
  4. QCheckButon:复选框
  5. 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:

  1. setMenu(QMenu)
  2. menu()

一般情况下不弹出菜单的,需要设置弹出模式:

 

=======>信号

只重写了一个,其他都是继承的。

其中的setData()这个函数绑定的数据是任意的,用于在获取action后区分不同的action以做出不同的响应。

 

QRadioButton

单选按钮,比如选择性别等等。一个选中另一个会被取消。继承至QAbstractButton。

 

=======>信号

均继承至父类,常用toggled(bool)。

=======>多组互斥

  • 为了解决这个问题一般讲每组放在不同控件
  • 也可以放在不同组里面(QButtonGroup),常用!!!!!。

QButtonGroup

  • 提供 一个抽象的按钮容器, 可以将多个按钮划分为一组
  • 不具备可视化的效果
  • 继承至QObject
  • 就一个构造方法:QButtonGroup(parent)

========>添加按钮

 

=======>查看按钮

获取指定条件的按钮

 

=======>移除按钮

从逻辑关系上移除指定的按钮(不是从界面上移除)。

removeButton(QAbstractButton)

 

=======>绑定和获取ID

设置ID, 方便识别用户选项

 

=======>独占设置

统一设置按钮组中的按钮是否是独占(选择互斥)

 

=======>信号

 

QCheckBox(复选框)

看文档吧,和单选框大同小异。

 

其他控件

前面通过对button类控件的学习和两个主要的基类QObject和QWidget的学习,基本上已经了解了PyQt的控件使用风格,其他控件也大同小异,这里不一一赘述了,实际开发中用到再深入。

 

输入控件

========>纯键盘文本输入

  1. QLineEdit:是一个单行文本编辑器,比如用来输入账号信息等。
  2. QTextEdit:是一个高级的WYSIWYG查看器/编辑器,支持使用HTML样式标签的富文本格式,可以加载纯文本和富文本文件。
  3. QPlainTextEdit:与QTextEdit大致功能实现差不多,但更适用于纯文本。
  4. QKeySequenceEdit:允许输入QKeySequence, 它通常用作快捷方式。采集用户在键盘按下的快捷键,外形和单行文本相似

 

========>步长调节(QAbstractSpinBox) (键盘+鼠标)

  1. QSpinBox:主要处理整数和离散值集,允许用户通过单击向上/向下按钮或按键盘上的上/下来选择一个值来增加/减少当前显示的值。用户还可以手动键入值,比如月份的调节等等。
  2. QDoubleSpinBox:浮点类型步长调节器,既可以通过步长调节器调整数据, 也可以通过文本框直接编辑,比如1.00 % - 99.99 %等等。
  3. QDateTimeEdit:编辑日期和时间的单行文本框,既可以用箭头调节, 也可以用键盘编辑输入,可以单独调节某个部分。有两个子类QDateEdit和QTimeEdit

 

========>组合框(下拉选择输入)

  1. QComboBox:是一个组合控件,可通过下拉选择界面, 选取更多的预置选项,有一个子类QFontComboBox。

 

========>滑块(QAbstractSlider)(鼠标)

比如音量调节,视频进度条,收音机按钮等等。

  1. QSlider:垂直或水平滑块,它允许用户沿水平或垂直凹槽移动滑块手柄,并将手柄的位置转换为合法范围内的整数值。
  2. QScrollBar:使用户能够访问比用于显示它的窗口小部件更大的文档部分,一般是结合QAbstractScrollArea使用,滚动条通常包括四个单独的控件:滑块,滚动箭头和页面控件。
  3. QDial:倒圆的范围控制,比如汽车仪表盘上的速度计

 

========>橡皮筋选中

  1. QRubberBand:提供一个矩形或线来指示选择或边界,一般结合鼠标事件一同协作。你如选择操作时用鼠标划一个矩形选择框。

 

========>对话框(QDialog)

  1. QFontDialog:提供了一种选择字体的对话框控件。比如WPS的字体选择。
  2. QColorDialog:颜色对话框的功能是允许用户选择颜色。
  3. QFileDialog:提供了一个对话框,允许用户选择文件或目录,允许用户遍历文件系统,以选择一个或多个文件或目录。
  4. QInputDialog:提供了一个简单方便的对话框,获得来自用户的单个值,输入值可以是字符串,数字或列表中的项目,设置标签以告知用户应输入的内容。

 

========>日期

  1. QCalendarWidget:提供了一个基于每月日历控件,允许用户选择一个日期。

 

展示控件

  1. QLabel:提供了文本或图像的显示,无交互功能。
  2. QLCDNumber:展示LCD样式的数字,它可以显示几乎任何大小的数字,它可以显示十进制,十六进制,八进制或二进制数。
  3. QProgressBar:提供一个水平或垂直进度条。
  4. 对话框(QDialog):即消息提示框,不需要添加到其他父控件。QMessageBox,QErrorMessage,QProgressDialog。

 

总之所有语言的GUI都差不多,多看文档熟悉API就行!!!!!!!


参考:

  1. 知乎大佬
  2. 环境配置
  3. QSS帮助文档QSS知乎讲解
  4. PyQtBiLiBiLi
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章