def _init_widget(self): self.ui = loadUi(self.uifile, self) header = self.horizontalHeader() if qt_backend.get_qt_backend() == 'PyQt5': header.setSectionResizeMode(QtGui.QHeaderView.ResizeToContents) header.setSectionsMovable(True) else: header.setResizeMode(QtGui.QHeaderView.ResizeToContents) header.setMovable(True) self.verticalHeader().setVisible(False) self.setItemDelegate(SubjectsItemDelegate())
def update_controller_widget(cls, controller_widget, control_name, control_instance): """ Update one element of the list controller widget. At the end the list controller widget user editable parameter with the name 'control_name' will match the controller trait value with the same name. Parameters ---------- controller_widget: ControllerWidget (mandatory) a controller widget that contains the controller we want to update control_name: str(mandatory) the name of the controller widget control we want to synchronize with the controller control_instance: QFrame (mandatory) the instance of the controller widget control we want to synchronize with the controller """ try: if control_name not in controller_widget.controller.user_traits(): return except ReferenceError: return # Get the list widget current connection status try: was_connected = control_instance.connected test = control_instance.control_widget.layout except (ReferenceError, RuntimeError): # widget deleted in the meantime return # Disconnect the list controller and the inner list controller cls.disconnect(controller_widget, control_name, control_instance) control_instance.controller_widget.disconnect() widget = control_instance.control_widget if sip.isdeleted(widget): OffscreenListControlWidget.disconnect(controller_widget, control_name, control_instance) return clayout = widget.control_widget.layout() owned_widgets = set() parent = widget for i in range(widget.columnCount()): w = widget.cellWidget(0, i) if w is not None: parent = w.parentWidget() owned_widgets.add(w) ListControlWidget.update_controller_widget(controller_widget, control_name, widget.control_widget) keys = list(control_instance.controller.user_traits().keys()) #n = len(control_instance.controller.user_traits()) parent_value = getattr(controller_widget.controller, control_name) if parent_value is traits.Undefined: parent_value = [] elif not isinstance(parent_value, (list, tuple)): # in nipype MultiPath, single values are not in a list parent_value = [parent_value] n = len(parent_value) max_items = widget.max_items if max_items > 0: m = min(max_items, n) if n > max_items: widget.setColumnCount(m + 1) else: widget.setColumnCount(n) else: m = n widget.setColumnCount(n) for i in range(m): try: items = widget.control_widget.controller_widget._controls[str( i)] item = items[None][2] if item not in owned_widgets: widget.setCellWidget(0, i, item) if qt_backend.get_qt_backend() == 'PyQt5': widget.horizontalHeader().setSectionResizeMode( i, QtGui.QHeaderView.Stretch) else: widget.horizontalHeader().setResizeMode( i, QtGui.QHeaderView.Stretch) except KeyError: print('KeyError in OffscreenListControlWidget', i) print('controls:', widget.control_widget.controller_widget._controls) if n > m: label = QtGui.QLabel('...') width = label.sizeHint().width() widget.setCellWidget(0, max_items, QtGui.QLabel('...')) if qt_backend.get_qt_backend() == 'PyQt5': widget.horizontalHeader().setSectionResizeMode( max_items, QtGui.QHeaderView.Fixed) else: widget.horizontalHeader().setResizeMode( max_items, QtGui.QHeaderView.Fixed) widget.horizontalHeader().resizeSection(max_items, width) widget.resizeRowToContents(0) height = widget.rowHeight(0) \ + sum(widget.getContentsMargins()[1:4:2]) widget.setFixedHeight(height) # Restore the previous list controller connection status if was_connected: cls.connect(controller_widget, control_name, control_instance) control_instance.controller_widget.connect()
def partial_view_widget(controller_widget, parent_frame, control_value): widget = OneLineQTableWidget() widget.horizontalHeader().hide() widget.verticalHeader().hide() widget.max_items = OffscreenListControlWidget.max_items if control_value is traits.Undefined: control_value = [] elif not isinstance(control_value, (list, tuple)): # in nipype MultiPath, single values are not in a list control_value = [control_value] control_widget, control_label = ListControlWidget.create_widget( controller_widget, parent_frame.trait_name, control_value, parent_frame.trait, parent_frame.label_class, max_items=widget.max_items, user_data=parent_frame.user_data) control_label[0].deleteLater() control_label[1].deleteLater() del control_label n = len(control_value) max_items = widget.max_items if max_items > 0: m = min(max_items, n) if n > max_items: widget.setColumnCount(m + 1) else: widget.setColumnCount(n) else: m = n widget.setColumnCount(n) clayout = control_widget.layout() widget.setRowCount(1) for i in range(m): litem = clayout.itemAtPosition(i + 1, 1) if litem is not None: item = litem.widget() widget.setCellWidget(0, i, item) if qt_backend.get_qt_backend() == 'PyQt5': widget.horizontalHeader().setSectionResizeMode( i, QtGui.QHeaderView.Stretch) else: widget.horizontalHeader().setResizeMode( i, QtGui.QHeaderView.Stretch) if n > m: widget.setCellWidget(0, max_items, QtGui.QLabel('...')) if qt_backend.get_qt_backend() == 'PyQt5': widget.horizontalHeader().setSectionResizeMode( max_items, QtGui.QHeaderView.Fixed) else: widget.horizontalHeader().setResizeMode( max_items, QtGui.QHeaderView.Fixed) widget.resizeRowToContents(0) #scroll_height = widget.findChildren(QtGui.QScrollBar)[-1].height() height = widget.rowHeight(0) \ + sum(widget.getContentsMargins()[1:4:2]) # + scroll_height widget.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) #widget.viewport().setSizePolicy(QtGui.QSizePolicy.MinimumExpanding, #QtGui.QSizePolicy.Fixed) #widget.viewport().setFixedHeight(widget.rowHeight(0)) widget.setFixedHeight(height) widget.control_widget = control_widget control_widget.hide() return widget
'somabase': (os.environ.get('SOMABASE_INTERSPHINX_URL', os.path.join(docpath, 'soma-base-' + somabase_version + '/sphinx')), None), 'somaworkflow': (os.environ.get('SOMAWORKFLOW_INTERSPHINX_URL', os.path.join(docpath, 'soma-workflow-' + somaworkflow_version + '/sphinx')), None), 'python': ('https://docs.python.org/%s' % pyversion, None), 'traits': ('https://docs.enthought.com/traits', None), } # init for Qt try: from soma.qt_gui import qt_backend qt_backend.set_qt_backend(compatible_qt5=True) print('Using Qt backend:', qt_backend.get_qt_backend()) except Exception: print('Warning: Qt could not be loaded. GUI will not be documented.') # Notebooks handling: # # Several problems are handled here: # 1. nbsphinx 0.4 does not read (ignores) notebooks in _static/ # For this reason we moved the NB to tutorial/ # 2. nbsphinx 0.4 does not allow direct links to the .ipynb (for download) # but replaces them with the converted HTML page. # For this reason we duplicate the NB into _static/ where NB are not # processed, and links not changed # 3. notebooks include kernel information which does not necessarily match the # running/installed python and jupyter kernels. # For this reason we conbert them using pupyter nbconvert, forcing the
from __future__ import print_function # select Qt backend matching the one used by anatomist import anatomist.direct.api from soma.qt_gui import qt_backend qt_backend.set_qt_backend(compatible_qt5=True) print("qt backend:", qt_backend.get_qt_backend()) from soma.qt_gui.qt_backend import QtCore, QtGui, QtTest, Qt, QtWebKit from soma.qt_gui.qt_backend import loadUi, loadUiType # import sip # API_VERSION = 2 # qt_api = ["QDate", "QDateTime", "QString", "QTextStream", "QTime", "QUrl", "QVariant"] # for qt_module in qt_api: # sip.setapi(qt_module, API_VERSION) # try: # import PyQt4 # except ImportError: # raise Exception("error: missing PyQt dependency.") # else: # from PyQt4 import QtCore, QtGui, QtTest, Qt, QtWebKit # import PyQt4.QtCore # PyQt4.QtCore.Slot = PyQt4.QtCore.pyqtSlot # PyQt4.QtCore.Signal = PyQt4.QtCore.pyqtSignal # def loadUi(uifile, baseinstance=None):
def update_controller_widget(cls, controller_widget, control_name, control_instance): """ Update one element of the list controller widget. At the end the list controller widget user editable parameter with the name 'control_name' will match the controller trait value with the same name. Parameters ---------- controller_widget: ControllerWidget (mandatory) a controller widget that contains the controller we want to update control_name: str(mandatory) the name of the controller widget control we want to synchronize with the controller control_instance: QFrame (mandatory) the instance of the controller widget control we want to synchronize with the controller """ if control_name in controller_widget.controller.user_traits(): # Get the list widget current connection status was_connected = control_instance.connected # Disconnect the list controller and the inner list controller cls.disconnect(controller_widget, control_name, control_instance) control_instance.controller_widget.disconnect() widget = control_instance.control_widget clayout = widget.control_widget.layout() owned_widgets = set() parent = widget for i in range(widget.columnCount()): w = widget.cellWidget(0, i) if w is not None: parent = w.parentWidget() owned_widgets.add(w) ListControlWidget.update_controller_widget(controller_widget, control_name, widget.control_widget) keys = list(control_instance.controller.user_traits().keys()) #n = len(control_instance.controller.user_traits()) parent_value = getattr(controller_widget.controller, control_name) n = len(parent_value) max_items = widget.max_items if max_items > 0: m = min(max_items, n) if n > max_items: widget.setColumnCount(m + 1) else: widget.setColumnCount(n) else: m = n widget.setColumnCount(n) for i in range(m): items = widget.control_widget.controller_widget._controls[str( i)] item = items[None][2] if item not in owned_widgets: widget.setCellWidget(0, i, item) if qt_backend.get_qt_backend() == 'PyQt5': widget.horizontalHeader().setSectionResizeMode( i, QtGui.QHeaderView.Stretch) else: widget.horizontalHeader().setResizeMode( i, QtGui.QHeaderView.Stretch) if n > m: label = QtGui.QLabel('...') width = label.sizeHint().width() widget.setCellWidget(0, max_items, QtGui.QLabel('...')) if qt_backend.get_qt_backend() == 'PyQt5': widget.horizontalHeader().setSectionResizeMode( max_items, QtGui.QHeaderView.Fixed) else: widget.horizontalHeader().setResizeMode( max_items, QtGui.QHeaderView.Fixed) widget.horizontalHeader().resizeSection(max_items, width) widget.resizeRowToContents(0) height = widget.rowHeight(0) \ + sum(widget.getContentsMargins()[1:4:2]) widget.setFixedHeight(height) # Restore the previous list controller connection status if was_connected: cls.connect(controller_widget, control_name, control_instance)
def test_qtgui(self): from soma.qt_gui import qt_backend qt_backend.set_qt_backend(compatible_qt5=True) self.assertTrue(qt_backend.get_qt_backend() in ('PyQt4', 'PyQt5', 'PySide'))