视频链接:https://www.bilibili.com/video/BV1Ut4y1i7zy?p=4
一、 常用模块
可以在pyqt官方文档中的classes检索某一个控件所属模块
二、PyQt基本结构
sys在这里可做命令行解析,当用户通过命令行运行程序时,可以根据不同参数执行不同的业务逻辑。sys.argv是一个列表,第一个参数是程序名,后面参数由用户在命令行提供。
在Qt中,可以通过命令行参数传递给整个应用程序对象,从而在应用程序内部实现不同业务逻辑
sys.exit()可以获取程序的退出值。如果是正常退出则为0,非正常为非零,通常为1。
app.exec_()让整个程序开始执行并进入到无限循环
动态加载代码模块
Abbreviation是代称,Description是该模块的描述,Template text是模块内容,使用$text$ 实现可修改部分。
继承,子类要想调用父类中的方法,应该要有方法的继承或者在子类中直接调用父类中的方法。
基本结构:
通常将所有控件都放在 setup_ui()中,为了使代码整体具有结构性,不同功能的模块从setupui中拆封出去。
观察Qtdesigner导出的py文件为三个重要部分:
1.class Ui_Form(object) 表示Ui_Form继承了基类Objetc
2.def setupUi(self, Form) 包含了所有子控件及其属性。Form是Qtweight()的实例,其作为主窗口,即整个程序中所有子控件的父控件,保证所有控件都能在主窗口中显示出来
该代码块中有两处重要信息:
第一处:
展现了各种布局,groupBox、label等控件在实例化时的参数。 setupUi具有一个参数Form,它实际上是一个Qtweight()实例。
第二处:
将一些样式信息放在retranslateUi中
- def retranslateUi(self, Form)则定义了窗口的一些属性
if __name__=='__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
widget = QtWidgets.QWidget() # 实例化一个控件
ui=Ui_Form() # 实例化一个能够给主窗口配置子空间的对象
ui.setupUi(widget) # widget为主控件(窗口),将各类子控件添加到主窗口中
widget.show() # 展示主窗口
sys.exit(app.exec())
通过上述的理解,我们可以吧Qtdesigner生成的Ui_Form()实例化,并通过该对象的setupUi方法给任一一个QWidget()对象配置控件。这也从侧面说明了为什么Qtdesigner生成的Ui_Form()中两个重要的方法都有一个Form参数。
下述代码进一步说明pyqt中的设计哲学:
window = QMainWindow() # 实例化主窗口控件,作为下面所有子控件的父控件
textEdit = QPlainTextEdit(window) # 在 Qt 系统中,控件(widget)是 层层嵌套 的,除了最顶层的主控件,其他的控件都有父控件。我们想在上面的窗口中放入一个文本编辑框,就需要在实例化文本编辑框时传入它的父控件作为参数
window.show() # 只有当实例化的主窗口执行show方法时,他才能在桌面上显示
app.exec_() # 进入QApplication的事件处理循环,接收用户的输入事件(),并且分配给相应的对象去处理。
只要有类似这样QPlainTextEdit(window)的子控件(主窗口)的代码,都可以给主窗口添加控件,该语句会返回一个对象实例。通过调用该对象实例的方法,将信号和槽联系起来即可实现控件与函数的结合。那么下面这段代码也就很好理解了
在实际开发中,我们当然不会直接在UI文件中实例化整个图像界面,而是把ui文件封装起来,通过在主程序中继承ui文件实现界面开发
class MyMainForm(QWidget, Ui_Form ,method):
# 继承QWidget, Ui_Form ,method三个类,其中method中可以封装很多底层代码逻辑
def __init__(self, parent=None):
super(MyMainForm, self).__init__(parent) # python2中的写法
self.setupUi(self) # MyMainForm为QWidget实例,作为参数传递给setupUi()时即可使主窗口具有设计好的控件
if __name__=='__main__':
# 固定用法,PyQt5程序都需要QApplication对象。sys.argv是命令行参数列表,确保程序可以双击运行
app = QApplication(sys.argv)
# 实例化控件
myWin = MyMainForm()
# 实例化主窗口
myWin.show()
# 程序运行,sys.exit方法确保程序完整退出。
sys.exit(app.exec_())
三、PyQt中常用类的属性和名称
1.基类QObject
该基类所具有的属性和方法是所有控件所共有的,其中setObjectName(),serProperty()是两个比较常用的方法
应用场景
qss样式表实际上是一个字符串,可以修改标签的样式(字体,颜色等…),如下图设置label的样式
然而在实际应用中,有多处地方需要设计样式,为了实现样式表和控件的分离,通常会把qss表放在一个单独的文件中
1.将所有qss样式表保存到单独的文件中,文件以.qss后缀命名。如Object.qss。
2.在qss文件中 以
控件名{
样式表 # 空四格
} # 指定某类控件的样式信息
3.在UI文件中读取样式表信息并将信息赋给整个程序的全局信息。
with open("QObject.qss","r") as f
aQpp.setStylesheet(f.read()) # 读取qss文件,并设置应用程序中的全部对象,之后整个应用程序的控件只要匹配到了样式表的样式信息都会有效
实际开发中,同类控件的样式都一样显然是不合适的,因此可以使用setObjectName方法设置对象的唯一名称。比如我们需要开发两种样式的标签(一种要求是红色字体,一种要求是蓝色字体),只需要在创建标签对象是利用setObjectName指定唯一名称,并在qss文件中添加注释即可:
通过
控件名#ObjectName{
样式表 # 空四格
} # 通过#ObjectName指定特定名称的对象的样式
上述例子中,三个label标签,只有名称叫notice的才会应用样式表。同一名称的对象可能还需要不同样式表区分。在setObjectName(‘唯一名称’)的基础上,还可以通过**setProperty(‘属性名称’,值)**给控件对象设置唯一属性。如下图:
在qss文件中,使用
控件名#ObjectName{
样式表 # 空四格
} # 通过#ObjectName指定特定名称的对象的样式
控件名#ObjectName['property'=value]{
样式表 # 空四格
} # 再通过其属性的值设置更多样式
实际开发中的步骤
1.配置qss文件,设置好指定名称或属性的控件的样式
2.在主程序中继承QtDesigner生成的窗口控件
3.定义专门的配置控件样式的函数,并在构造函数中调用
from PyQt5.QtWidgets import QApplication,QMainWindow,qApp
from QtDesigner_form import Ui_Form
class MyMainForm(QMainWindow, Ui_Form):
def __init__(self, parent=None):
super(MyMainForm, self).__init__(parent) # python2中的写法
self.setupUi(self)
self.widght_stytle(self)
def widght_stytle(self):
with open('style.qss','r') as f:
qApp.setStyleSheet(f.read()) # qApp可以获取应用程序的全局信息,即将style.qss中的样式应用到整个程序所有控件中
# 通过setObjectName()给控件指定唯一名称,通过setProperty()给每个控件对象动态添加属性和值
self.label.setObjectName("notice")
self.cancel_pushButton.setObjectName("notice")
self.cancel_pushButton.setProperty("notice_property",'blue')
因为qss文件只配置了Qlabel的唯一名称和属性及其值,因此只会修改整个程序中QLabel的样式。在qss中增设QPushButton的样式后:
def wight_stytle(self):
with open('style.qss','r') as f:
qApp.setStyleSheet(f.read()) # qApp可以获取应用程序的全局信息,即将style.qss中的样式应用到整个程序所有控件中
# 通过setObjectName()给控件指定唯一名称,通过setProperty()给每个控件对象动态添加属性和值
self.label.setObjectName("notice")
self.cancel_pushButton.setObjectName("notice_pushbutton")