建立 Qt 視窗

and also within a Maya session.

PySide6 是 Qt6 官方維護的 Python binding: Qt for Python

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from PySide6 import QtWidgets

# 開始運行(instantiate) QApplication
app = QtWidgets.QApplication([])

# 建立一個簡易版的視窗元件, QDialog
window = QtWidgets.QDialog()
window.show()

# 開始 QApplication 的事件迴圈
app.exec()

sys.argv

如果希望執行的時候可以讀取命令列參數,可以把sys.argv傳給QApplication.

1
2
3
4
5
6
7
8
import sys
from PySide6 import QtWidgets
app = QtWidgets.QApplication(sys.argv)

window = QtWidgets.QDialog()
window.show()

app.exec()

QDialog vs QMainWindow

上面例子的視窗元件是 QDialog, 沒太複雜的功能. 用 QMainWindow 取代 QDialog 的話, QMainWindow內建有 menu, status bar, toolbar 等等平常習慣的"視窗"會有的功能.

1
2
3
4
5
6
7
8
import sys
import PySide6.QtWidgets as QtWidgets
app = QtWidgets.QApplication(sys.argv)

window = QtWidgets.QMainWindow()
window.show()

app.exec()

Autodesk Maya

在 Maya 中建立一個 Qt 視窗有一些需要留意的地方.

  • PySide2 上面的例子使用都是 PySide6, 而 Autodesk 在 Maya bundle 的版本是 PySide2.
  • QApplication Maya 開始執行的時候就初始化了必要的 Qt 環境, 不需要再做一次.
1
2
3
4
import PySide2.QtWidgets as QtWidgets

window = QtWidgets.QMainWindow()
window.show()

Parent to Maya Window

把創建出來的視窗 parent 到 Maya 主視窗之下可以讓前者像 Maya 其他的工具視窗一樣不會被主視窗蓋住. Alt Tab 切換視窗的時候它也不會被視為另外一個 Application. 如果不 parent 的話則可以讓 user 使用 Alt Tab 在 Maya 和這個視窗之間切換.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import shiboken2 # 橋接python 和 Qt C++ 物件的模組, shipped with Maya
import maya.OpenMayaUI as OpenMayaUI
import PySide2.QtWidgets as QtWidgets

# 取得指向 Maya主視窗的 QWidget 指標
ptr = OpenMayaUI.MQtUtil.mainWindow()

# 把指標只向的位置wrap成一個 python object(QWidget in this case)
maya_win = shiboken2.wrapInstance(int(ptr), QtWidgets.QWidget)

# Instance QMainWindow 時的第一個 positional argument 會被當作 parent 物件.
window = QtWidgets.QMainWindow(maya_win)
window.show()