建立使用者介面元素

Substance 3D Designer 包含 Qt For Python。 使用者可以使用 UI Manager類別來建立 選單、 對話框、 自訂面板 及其他外掛使用者介面元素。

在這個頁面中,你可以找到在 Designer 裡使用 Qt 來做 Python 的簡單範例。

欲了解更多關於 Python Qt 的資訊,請參閱官方 文件。

建立對話

import sd

from PySide2 import QtWidgets



## Get the application and the UI Manager.

app = sd.getContext().getSDApplication()

uiMgr = app.getQtForPythonUIMgr()



## Create a new dialog. For shortcuts to work correctly

## it is important to parent the new dialog to Designer's main window.

mainWindow = uiMgr.getMainWindow()

dialog = QtWidgets.QDialog(parent=mainWindow)



## Create a layout and some widgets.

layout = QtWidgets.QVBoxLayout()

layout.addWidget(QtWidgets.QPushButton("Press Me"))

dialog.setLayout(layout)



## Show the dialog (non-modal).

dialog.show()

建立選單

import sd

from PySide2 import QtWidgets



## Get the application and the UI Manager.

app = sd.getContext().getSDApplication()

uiMgr = app.getQtForPythonUIMgr()



## Function that will be called when our menu item is selected.

def sayHello():

 print("Hello!")



## Create a new menu.

menu = uiMgr.newMenu(menuTitle="MyMenu", objectName="doc.example.my_menu")

## Create a new action.

act = QtWidgets.QAction("Hello", menu)

act.triggered.connect(sayHello)



## Add the action to the menu.

menu.addAction(act)

製作面板

import sd

from PySide2 import QtWidgets



## Get the application and the UI Manager.

app = sd.getContext().getSDApplication()

uiMgr = app.getQtForPythonUIMgr()



## Create a new dock widget.

## The dock identifier is used when saving and restoring dock positions and sizes.

## For this reason, it's important that the identifier is unique.

dock = uiMgr.newDockWidget(identifier="sample.test.dock", title="New Dock")



## Create a layout and add some widgets.

layout = QtWidgets.QVBoxLayout()

dock.setLayout(layout)



for i in range(0, 5):

 layout.addWidget(QtWidgets.QPushButton("Button %s" % i))

在應用程式視窗中建立工具列

import sd

from PySide2 import QtCore, QtWidgets



## Get the application and the UI Manager.

app = sd.getContext().getSDApplication()

uiMgr = app.getQtForPythonUIMgr()



## Get Designer's main window.

mainWindow = uiMgr.getMainWindow()



## Create our toolbar.

toolbar = QtWidgets.QToolBar()

toolbar.addAction("Tool")

toolbar.addAction("Bar")



## Add our toolbar to Designer's window.

mainWindow.addToolBar(QtCore.Qt.TopToolBarArea, toolbar)

在圖視圖中建立工具列

from functools import partial

import sd



from PySide2 import QtCore, QtGui, QtWidgets



class MyGraphToolBar(QtWidgets.QToolBar):

    def __init__(self, graphViewID, uiMgr):

        super(MyGraphToolBar, self).__init__(parent=uiMgr.getMainWindow())



## Save the graphViewID and uiMgr for later use.

        self.__graphViewID = graphViewID

        self.__uiMgr = uiMgr



## Add actions to our toolbar.

        act = self.addAction("P")

        act.setToolTip("Print the selected nodes to the Python console")

        act.triggered.connect(self.__onPrintNodes)



    def __onPrintNodes(self):

        for node in self.__getSelectedNodes():

            print(node)



    def __getSelectedNodes(self):

## Use our saved graphViewID to retrieve the graph selection.

        return self.__uiMgr.getGraphSelectedNodesFromGraphViewID(

            self.__graphViewID)



def onNewGraphViewCreated(graphViewID, uiMgr):

## Create our toolbar.

    toolbar = MyGraphToolBar(graphViewID, uiMgr)



## Add our toolbar to the graph widget.

    uiMgr.addToolbarToGraphView(

        graphViewID,

        toolbar,

        icon = None,

        tooltip = "My Graph Toolbar")



## Get the application and UI manager object.

ctx = sd.getContext()

app = ctx.getSDApplication()

uiMgr = app.getQtForPythonUIMgr()



## Register a callback to know when GraphViews are created.

uiMgr.registerGraphViewCreatedCallback(

    partial(onNewGraphViewCreated, uiMgr=uiMgr))

在圖景工具列中建立動作

from functools import partial

import sd



from PySide2 import QtWidgets





class MyGraphAction(QtWidgets.QAction):

    def __init__(self, graphViewID, uiMgr):

        super(MyGraphAction, self).__init__(parent=uiMgr.getMainWindow())



## Save the graphViewID and uiMgr for later use.

        self.__graphViewID = graphViewID

        self.__uiMgr = uiMgr



## Set up the action.

        self.setText("P")

        self.setToolTip("Print the selected nodes to the Python console")

        self.triggered.connect(self.__onPrintNodes)



    def __onPrintNodes(self):

        for node in self.__getSelectedNodes():

            print(node)



    def __getSelectedNodes(self):

## Use our saved graphViewID to retrieve the graph selection.

        return self.__uiMgr.getGraphSelectedNodesFromGraphViewID(

            self.__graphViewID

        )





def onNewGraphViewCreated(graphViewID, uiMgr):

## Create our action.

    action = MyGraphAction(

        graphViewID = graphViewID,

        uiMgr = uiMgr

    )



## Add our action to the graph toolbar.

    uiMgr.addActionToGraphViewToolbar(

        graphViewID,

        action

    )





## Get the application and UI manager object.

ctx = sd.getContext()

app = ctx.getSDApplication()

uiMgr = app.getQtForPythonUIMgr()



## Register a callback to know when GraphViews are created.

uiMgr.registerGraphViewCreatedCallback(

    partial(onNewGraphViewCreated, uiMgr=uiMgr))

載入使用 Qt Designer 建立的使用者介面

NOTE
Qt Designer 不包含​**​在 Substance 3D Designer 中。你可以安裝作業系統的官方 Qt 發行版來取得。
from PySide2 import QtCore, QtWidgets, QtUiTools



def loadUiFile(filename, parent=None):

    '''

    Loads a Qt Designer .ui file.

    Returns a widget.

    '''

    loader = QtUiTools.QUiLoader()

    uifile = QtCore.QFile(filename)

    uifile.open(QtCore.QFile.ReadOnly)

    ui = loader.load(uifile, parent)

    uifile.close()

    return ui



## Get the application and the UI Manager.

app = sd.getContext().getSDApplication()

uiMgr = app.getQtForPythonUIMgr()



## Load our Qt Designer ui file.

widget = loadUiFile("MyUI.ui", parent=uiMgr.getMainWindow())



## Show our user interface. In this case we show it as a non-modal dialog,

## but we could also make it modal or create a new dock for it.

widget.show()
recommendation-more-help
substance-3d-designer-help-guide