PySide Beispiele für Fortgeschrittene
Einleitung
Der Zweck dieser Seite ist es, Beispiele auf fortgeschrittenem Niveau für die PySide-GUI-Verwaltung zu behandeln (es gibt begleitende Seiten PySide Beispiele für Anfänger und PySide-Beispiele für fortgeschrittene Anfänger).
Durch Verwenden des in FreeCAD enthaltenen Moduls PySide haben wir die volle Kontrolle über seine Oberfläche. Wir können zum Beispiel:
- Eigene Fenster, Widgets und Symbolleisten hinzufügen.
- Elemente zu bestehenden Fenstern hinzufügen oder sie ausblenden.
- Verbindungen zwischen all diesen Elementen anpassen, umleiten oder hinzufügen.
Eine Referenz auf das Hauptfenster erstellen
Soll an der FreeCAD-Oberfläche gearbeitet werden, muss als allererstes eine Referenz auf das FreeCAD-Hauptfenster erstellt werden:
import sys
from PySide import QtGui ,QtCore
app = QtGui.qApp
mw = FreeCADGui.getMainWindow()
Durchsuchen der untergeordneten Elemente des Hauptfensters
Dann können beispielsweise alle Widgets der Benutzeroberfläche durchsucht werden:
for child in mw.children():
print('widget name = ', child.objectName(), ', widget type = ', child)
Die Widgets in einer Qt-Schnittstelle sind normalerweise in „Container“-Widgets verschachtelt, sodass die untergeordneten Elemente unseres Hauptfensters selbst andere untergeordnete Elemente enthalten können. Je nach Widget-Art gibt es viele Dinge, die man tun kann. Siehe die API-Dokumentation, um zu entdecken, was möglich ist.
Neues Widget manuell hinzufügen
Das Hinzufügen eines neuen Widgets, beispielsweise eines DockWidgets (das in einer der Seitenleisten von FreeCAD platziert werden kann), ist einfach:
myWidget = QtGui.QDockWidget()
mw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myWidget)
Dann können Dinge direkt zu dem Widget hinzugefügt werden:
myWidget.setObjectName("my Nice New Widget")
myWidget.resize(QtCore.QSize(300,100)) # sets size of the widget
label = QtGui.QLabel("Hello World", myWidget) # creates a label
label.setGeometry(QtCore.QRect(2,50,200,24)) # sets its size
label.setObjectName("myLabel") # sets its name, so it can be found by name
Neues Widget durch Erstellen eines UI-Objekts hinzufügen
Eine bevorzugte Methode ist jedoch, ein Objekt der Benutzeroberfläche (UI-Objekt) zu erstellen, das die gesamte Einrichtung des Widgets auf einmal übernimmt. Der große Vorteil besteht darin, dass ein solches UI-Objekt mit dem Programm Qt Designer grafisch erstellt werden kann. Ein typisches von Qt Designer generiertes Objekt sieht folgendermaßen aus:
class myWidget_Ui(object):
def setupUi(self, myWidget):
myWidget.setObjectName("my Nice New Widget")
myWidget.resize(QtCore.QSize(300,100).expandedTo(myWidget.minimumSizeHint())) # sets size of the widget
self.label = QtGui.QLabel(myWidget) # creates a label
self.label.setGeometry(QtCore.QRect(50,50,200,24)) # sets its size
self.label.setObjectName("label") # sets its name, so it can be found by name
def retranslateUi(self, draftToolbar): # built-in QT function that manages translations of widgets
myWidget.setWindowTitle(QtGui.QApplication.translate("myWidget", "My Widget", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("myWidget", "Welcome to my new widget!", None, QtGui.QApplication.UnicodeUTF8))
Um es zu verwenden, muss es nur wie folgt auf das neu erstellte Widget angewendet werden:
app = QtGui.qApp
FCmw = app.activeWindow()
myNewFreeCADWidget = QtGui.QDockWidget() # create a new dckwidget
myNewFreeCADWidget.ui = myWidget_Ui() # load the Ui script
myNewFreeCADWidget.ui.setupUi(myNewFreeCADWidget) # setup the ui
FCmw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myNewFreeCADWidget) # add the widget to the main window
Laden der Benutzeroberfläche aus einer Qt Designer .ui-Datei
Der Schlüssel zum erfolgreichen Laden einer UI-Datei ist die Verwendung des vollständigen Pfads zur Datei. Der Addon-Manager macht es beispielsweise so:
self.dialog = FreeCADGui.PySideUic.loadUi(os.path.join(os.path.dirname(__file__), "AddonManager.ui"))
- FreeCAD scripting: Python, Introduction to Python, Python scripting tutorial, FreeCAD Scripting Basics
- Modules: Builtin modules, Units, Quantity
- Workbenches: Workbench creation, Gui Commands, Commands, Installing more workbenches
- Meshes and Parts: Mesh Scripting, Topological data scripting, Mesh to Part, PythonOCC
- Parametric objects: Scripted objects, Viewproviders (Custom icon in tree view)
- Scenegraph: Coin (Inventor) scenegraph, Pivy
- Graphical interface: Interface creation, Interface creation completely in Python (1, 2, 3, 4, 5), PySide, PySide examples beginner, intermediate, advanced
- Macros: Macros, How to install macros
- Embedding: Embedding FreeCAD, Embedding FreeCADGui
- Other: Expressions, Code snippets, Line drawing function, FreeCAD vector math library (deprecated)
- Hubs: User hub, Power users hub, Developer hub