Difference between revisions of "Events:CTK-Hackfest-2010/SlicerPythonQt"
From NAMIC Wiki
Line 37: | Line 37: | ||
this->executeFile(app->slicerHome() + "/bin/Python/slicer/slicerqt.py"); | this->executeFile(app->slicerHome() + "/bin/Python/slicer/slicerqt.py"); | ||
} | } | ||
+ | </pre> | ||
+ | |||
+ | <pre> | ||
+ | """ This module loads all the classes from the vtkSlicerBaseLogic library into its | ||
+ | namespace.""" | ||
+ | |||
+ | import os | ||
+ | |||
+ | if os.name == 'posix': | ||
+ | from libSlicerBaseLogicPython import * | ||
+ | else: | ||
+ | from SlicerBaseLogicPython import * | ||
+ | </pre> | ||
+ | |||
+ | * slicerqt.py | ||
+ | <pre> | ||
+ | import slicer | ||
+ | from slicer import vtk | ||
+ | |||
+ | def quit(): | ||
+ | exit() | ||
+ | |||
+ | def exit(): | ||
+ | app().quit() | ||
+ | |||
+ | def app(): | ||
+ | return _qSlicerCoreApplicationInstance | ||
+ | |||
+ | def getModuleNames(): | ||
+ | return app().moduleManager().factoryManager().moduleNames() | ||
+ | |||
+ | def getModule(moduleName): | ||
+ | module = app().moduleManager().module(moduleName); | ||
+ | if not module: | ||
+ | print "Could not find module with name '%s" % moduleName | ||
+ | return None | ||
+ | return module | ||
+ | |||
+ | def getModuleGui(moduleName): | ||
+ | module = getModule(moduleName) | ||
+ | if not module: | ||
+ | return None | ||
+ | widgetRepr = module.widgetRepresentation() | ||
+ | if not widgetRepr: | ||
+ | print "Could not find module widget representation with name '%s" % moduleName | ||
+ | return None | ||
+ | return widgetRepr | ||
</pre> | </pre> |
Revision as of 07:13, 8 March 2010
Home < Events:CTK-Hackfest-2010 < SlicerPythonQtOverview
- All slots/property of QObject are automatically exposed to the python interpreter
- Concept of decorator
- Expose regular cpp method of QObject
- Expose object and method of pure cpp classes
- Complete wrapping of all Qt Classes
- From PythonQt website: In contrast to PyQt , PythonQt is not a complete Python wrapper around the complete Qt functionality. So if you are looking for a way to write complete applications in Python using the Qt GUI, you should use PyQt.
- See http://pythonqt.sourceforge.net/
Implementation
CTK Layer
- qCTKConsoleWidget
- qCTKShellPython
- qCTKAbstractPythonManager:
- registerPythonQtDecorator, registerClassForPythonQt, registerCPPClassForPythonQt, executeString, getVariable, executeFile, ...
- also virtual methods: pythonPaths and preInitialization
Concrete example
- Slicer superbuild download and patch SVN PythonQt head
- Slicer CMake script pre-compile all slicer .py class
- VTK all wrapped in python and exposed
- qSlicerPythonManager
void qSlicerPythonManager::preInitialization() { Superclass::preInitialization(); // Register decorators this->registerPythonQtDecorator(new qSlicerBaseQTBasePythonQtDecorators(this)); qSlicerCoreApplication* app = qSlicerCoreApplication::application(); // Add object to python interpreter context this->addObjectToPythonMain("_qSlicerCoreApplicationInstance", app); // Evaluate application script this->executeFile(app->slicerHome() + "/bin/Python/slicer/slicerqt.py"); }
""" This module loads all the classes from the vtkSlicerBaseLogic library into its namespace.""" import os if os.name == 'posix': from libSlicerBaseLogicPython import * else: from SlicerBaseLogicPython import *
- slicerqt.py
import slicer from slicer import vtk def quit(): exit() def exit(): app().quit() def app(): return _qSlicerCoreApplicationInstance def getModuleNames(): return app().moduleManager().factoryManager().moduleNames() def getModule(moduleName): module = app().moduleManager().module(moduleName); if not module: print "Could not find module with name '%s" % moduleName return None return module def getModuleGui(moduleName): module = getModule(moduleName) if not module: return None widgetRepr = module.widgetRepresentation() if not widgetRepr: print "Could not find module widget representation with name '%s" % moduleName return None return widgetRepr