QT框架介绍
写文章之前我都喜欢加个前言,说说自己的感受,这次也不例外。 这篇文章是学习 Python QT 半年来出的教程,因此教程的质量并不能保证,只是将自己的经验分享给大家。 Python QT 图形界面开发需要有一定的编程基础,观看本教程之前最后先过一遍Python的使用基础。 因为我本人是 流程TD ,开发环境主要在 Maya 上,因此这套教程主要针对于 Maya 的 开发环境,不过QT是通用于各个软件平台的,有问题可以相互交流。
QT具体是什么,可以自行网上百度. 简单地说就是一个跨平台的图形化框架,通过这个框架可以实现跨平台的软件界面。 跨平台主要指可以在多个平台上运行,最通俗的说法是兼容 Linux、Mac、Windows 这三个最常用的系统。 QT曾经由诺基亚公司维护,目前由Digia公司维护,在桌面软件开发上有不可撼动的地位。
由于QT可以减少跨平台维护的问题。 如今很多软件都是利用QT搭建图形化界面,包括但不限于Houdini、Maya、Nuke等等 作为插件开发者,掌握QT的图形化开发可以极大加快开发效率。
QT这个框架是使用 C++ 代码实现的,在现成的软件中嵌入 C++ 代码是非常不便的。 但是由于python底层也是基于 c 语言的,因此就出现了使用python实现的 python 框架。 python作为胶水语言、脚本语言,补足了这方面的短板。
在QT发展到4.0的时候,PyQT4 框架诞生了,通过python平台调用QT库,实现了python的图形化界面。 通过python编写的框架,让代码编写更加明了清晰,调用也更为方便。 PyQT由于是不完全开源的,QT的运营商 诺基亚 交涉无果之后,自行开发了完全免费开源的python库PySide。 由于两个 python 库都是基于 C++ 的 QT 框架下实现的,因此在使用的API上基本保持一致。 当然后面 QT 发展到 5.0 之后,也诞生了 PyQT5 以及 PsSide2 , 框架的使用上也有别于之前的版本。 由于 PySide 的开源商用免费,如今大多数软件开发都使用了PySide 最为 Python 平台的选择。
由于在 QT4.0 到 QT5.0 的API差异,以及 python 平台下两个库的使用,导致 QT 代码的兼容非常麻烦。 为了解决兼容问题,github上开源了 QT.py 脚本,通过这个脚本就可以用 QT5.0 使用方式兼容 QT4.0 的写法,以及 PyQT 和 PySide 的使用差异问题。 不过使用这个兼容脚本会导致 代码编辑器(IDE) 的代码补全失效 (:з」∠)
由于QT跨平台的特性,以及Python的胶水语言的便利,太多CG软件支持QT的开发。 正如上文提到的 Houdini、Maya、Nuke 都支持通过 Python 的 QT 库来编写图形化界面。 那么QT编写界面的优势在哪里呢? 下面我用maya原生的MEL代码编写界面来对比 PyQT 的实现效果
下面我来写出一个 hello world 标题的窗口界面举例。
procprintHelloWorld(){ print"hello,World"; } string$window=`window"使用 MEL 编写窗口"`; columnLayout; button-c"printHelloWorld()""hello,world"; showWindow$window;
如果你不喜欢MEL语言,也可以将其转换为 maya cmds 命令库来实现
from maya import cmds defprintHelloWorld(e): print"hello,World"
window = cmds.window("使用 maya cmds 编写窗口") cmds.columnLayout() cmds.button("hello,world",c=printHelloWorld) cmds.showWindow(window)
下面是使用 QT 的方式来实现
from PySide2.QtGui import* from PySide2.QtWidgets import* from PySide2.QtCore import* defprintHelloWorld(self): print"hello,world"
window = QWidget() window.setWindowTitle(u"欢迎使用 PySide2 编写窗口") button = QPushButton("hello,world") button.clicked.connect(printHelloWorld) layout = QHBoxLayout() layout.addWidget(button) window.setLayout(layout) window.show()
除了上述的实现方案之外,也可以使用类来封装,这种写法更加优雅一些
from PySide2.QtGui import* from PySide2.QtWidgets import* from PySide2.QtCore import* classWindow(QWidget): def__init__(self): super(Window,self).__init__() self.setWindowTitle(u"欢迎使用 PySide2类 编写窗口") self.button = QPushButton("hello,world") self.button.clicked.connect(self.printHelloWorld) self.layout = QHBoxLayout() self.layout.addWidget(self.button) self.setLayout(self.layout) self.show() defprintHelloWorld(self): print"hello,world" a = Window()
看完上面的代码实现之后,是不是PySide的实现要写更多的代码,岂不是更加麻烦吗? 其实 MEL 实现的图形化界面也是调用了 QT 框架,只是在调用上进行封装,因此用更少的代码就可以实现而已。 那在开发的过程中到底孰优孰劣呢? 在CG行业中应该选择哪一个进行图形界面开发呢? 其实 MEL 或者 maya cmds 命令实现要比 PySide 简单很多,如果只是写一个简单的图形化界面的话,用原生实现就已经足够了。 最直观的典型就是 advance skeleton 这款绑定插件了,如此复杂的界面其实全部都是用 MEL 实现的。 有兴趣的可以研究它的 MEL 源码,3万多行代码是真的牛逼。 那 Python QT 的框架优势在哪里呢?
QTDesigner 控件拖拽式开发
控件封装扩展
qss 自定义样式支持
多重事件响应触发
自定义响应信号
如果不需要上述这些特性的话,那么完全可以依靠原生来编写界面 那么上述五个特性到底是个啥,就留到后面的教程娓娓道来吧。
---------------------------------------------------------------------------------------------------------------------- 我们尊重原创,也注重分享,文章来源于微信公众号:一灯视效工作室,建议关注公众号查看原文。如若侵权请联系qter@qter.org。 ----------------------------------------------------------------------------------------------------------------------
|