python qt教程_Python - Python Qt 开发教程(1)
前言寫文章之前我都喜歡加個前言,說說自己的感受,這次也不例外。
這篇文章是學習 Python Qt 半年來出的教程,因此教程的質量并不能保證,只是將自己的經驗分享給大家。
Python Qt 圖形界面開發需要有一定的編程基礎,觀看本教程之前要有Python的使用基礎。
因為我本人是 流程TD ,開發環境主要在 Maya 上,因此這套教程主要針對于 Maya 的 開發環境,不過Qt是通用于各個軟件平臺的,有問題可以相互交流。
什么是Qt
Qt具體是什么,可以自行網上百度.
簡單地說就是一個跨平臺的圖形化框架,通過這個框架可以實現跨平臺的軟件界面。
跨平臺主要指可以在多個平臺上運行,最通俗的說法是兼容 Linux、Mac、Windows 這三個最常用的系統。
Qt曾經由諾基亞公司維護,目前由Digia公司維護,在桌面軟件開發上有不可撼動的地位。
為什么使用Qt由于Qt可以減少跨平臺維護的問題。
如今很多軟件都是利用Qt搭建圖形化界面,包括但不限于Houdini、Maya、Nuke等等
作為插件開發者,掌握Qt的圖形化開發可以極大加快開發效率。
Qt開發使用的語言Qt這個框架是使用 C++ 代碼實現的,在現成的軟件中嵌入 C++ 代碼是非常不便的。
而python作為膠水語言、腳本語言,補足了這方面的短板。
python之所以這么好,原因是底層也是基于 c 語言。
python Qt 框架在Qt發展到4.0的時候,PyQt4 框架誕生了,通過python平臺調用Qt庫,實現了python的圖形化界面。
通過python編寫的框架,讓代碼編寫更加明了清晰,調用也更為方便。
PyQt由于是不完全開源的,Qt的運營商 諾基亞 交涉無果之后,自行開發了完全免費開源的python庫PySide。
由于兩個 python 庫都是基于 C++ 的 Qt 框架下實現的,因此在使用的API上基本保持一致。
當然后面 Qt 發展到 5.0 之后,也誕生了 PyQt5 以及 PsSide2 , 框架的使用上也有別于之前的版本。
由于 PySide 的開源商用免費,如今大多數軟件開發都使用了PySide 最為 Python 平臺的選擇。
Qt.py 多版本Qt兼容由于在 Qt4.0 到 Qt5.0 的API差異,以及 python 平臺下兩個庫的使用,導致 Qt 代碼的兼容非常麻煩。
為了解決兼容問題,github上有開源的 Qt.py 腳本,通過這個腳本就可以用 Qt5.0 使用方式兼容 Qt4.0 的寫法,以及 PyQt 和 PySide 的不同平臺的差異問題。
不過使用這個兼容腳本會導致 代碼編輯器(IDE) 的代碼補全失效 (:з」∠)
Python Qt 在CG行業的運用
插件開發由于Qt跨平臺的特性,以及Python的膠水語言的便利,太多CG軟件支持Qt的開發。
正如上文提到的 Houdini、Maya、Nuke 都支持通過 Python 的 Qt 庫來編寫圖形化界面。
那么Qt編寫界面的優勢在哪里呢?
下面我用maya原生的MEL代碼編寫界面來對比 PyQt 的實現效果
MEL & cmds VS PySide 圖形界面開發下面我來寫出一個 hello world 標題的窗口界面舉例。
1
2
3
4
5
6
7proc printHelloWorld(){
print "hello,World";
}
string $window = `window "使用 MEL 編寫窗口"`;
columnLayout;
button -c "printHelloWorld()" "hello,world";
showWindow $window;
如果你不喜歡MEL語言,也可以將其轉換為 maya cmds 命令庫來實現
1
2
3
4
5
6
7
8from maya import cmds
def printHelloWorld(e):
print "hello,World"
window = cmds.window("使用 maya cmds 編寫窗口")
cmds.columnLayout()
cmds.button("hello,world",c=printHelloWorld)
cmds.showWindow(window)
下面是使用 Qt 的方式來實現
1
2
3
4
5
6
7
8
9
10
11
12
13
14from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2.QtCore import *
def printHelloWorld(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()
除了上述的實現方案之外,也可以使用類來封裝,這種寫法更加優雅一些
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2.QtCore import *
class Window(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()
def printHelloWorld(self):
print "hello,world"
a = Window()
看完上面的代碼實現之后,會有種感覺,使用PySide的實現要寫更多的代碼,豈不是更加麻煩嗎?
其實 MEL 實現的圖形化界面也是調用了 Qt 框架,只是在調用上進行封裝,因此用更少的代碼就可以實現而已。
那在開發的過程中到底孰優孰劣呢?
在CG行業中應該選擇哪一個進行圖形界面開發呢?
其實 MEL 或者 maya cmds 命令實現要比 PySide 簡單很多,如果只是寫一個簡單的圖形化界面的話,用原生實現就已經足夠了。
最直觀的典型就是 advance skeleton 這款綁定插件了,如此復雜的界面其實全部都是用 MEL 實現的。
有興趣的可以研究它的 MEL 源碼,3萬多行代碼是真的牛逼。
那 Python Qt 的框架優勢在哪里呢?
QtDesigner 組件拖拽式開發
組件封裝擴展
多重事件響應觸發
qss 自定義樣式支持
自定義響應信號
如果不需要上述這些特性的話,那么完全可以依靠原生來編寫界面
那么上述五個特性到底是個啥,就留到后面的教程娓娓道來吧。
總結
以上是生活随笔為你收集整理的python qt教程_Python - Python Qt 开发教程(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot初始化加载数据_Sp
- 下一篇: websocket python爬虫_p