def _createGroupWidget(self, title, header, widget_group, wid_type='groupbox'): scr_area_wid = QWidget(self) scr_area_wid.setObjectName('scr_ar_wid') scr_area_wid.setStyleSheet( '#scr_ar_wid {background-color: transparent;}') w_lay = QVBoxLayout(scr_area_wid) w_lay.setSpacing(0) w_lay.setContentsMargins(0, 0, 0, 0) for widget in widget_group: w_lay.addWidget(widget, alignment=Qt.AlignLeft) w_lay.addStretch() scr_area = QScrollArea(self) scr_area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) scr_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) scr_area.setWidgetResizable(True) scr_area.setFrameShape(QFrame.NoFrame) scr_area.setWidget(scr_area_wid) wid = QGroupBox(title, self) if wid_type == 'groupbox' \ else QWidget(self) gb_lay = QVBoxLayout(wid) gb_lay.addWidget(header, alignment=Qt.AlignLeft) gb_lay.addWidget(scr_area) return wid
def _create_deltadelay(self): gb = QGroupBox('Delta Delay') lay = QVBoxLayout(gb) sc_area = QScrollArea() sc_area.setWidgetResizable(True) sc_area.setFrameShape(QFrame.NoFrame) lay.addWidget(sc_area) wid = QWidget(sc_area) wid.setObjectName('wid') wid.setStyleSheet('#wid {background-color: transparent;}') sc_area.setWidget(wid) lay = QGridLayout(wid) lay.setAlignment(Qt.AlignTop) lay.addWidget(QLabel('<h4>Low Level</h4>'), 0, 0, Qt.AlignCenter) lay.addWidget(QLabel('<h4>SP [us]</h4>'), 0, 1, Qt.AlignCenter) lay.addWidget(QLabel('<h4>RB [us]</h4>'), 0, 2, Qt.AlignCenter) ll_obj_names = HLTimeSearch.get_ll_trigger_names( self.device.device_name) for idx, obj in enumerate(ll_obj_names, 1): nam = QLabel(obj, wid) spin = _SpinBox(wid, init_channel=self.get_pvname('DeltaDelay-SP'), index=idx - 1) spin.setStyleSheet('min-width:7em;') lbl = _Label(wid, init_channel=self.get_pvname('DeltaDelay-SP'), index=idx - 1) lbl.setStyleSheet('min-width:6em;') lay.addWidget(nam, idx, 0) lay.addWidget(spin, idx, 1) lay.addWidget(lbl, idx, 2) sc_area.setSizeAdjustPolicy(QScrollArea.AdjustToContentsOnFirstShow) sc_area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) return gb
def setupUi(self): self.my_layout = QVBoxLayout(self) self.my_layout.setContentsMargins(6, 10, 6, 0) if self.has_search: hbl = QHBoxLayout() hbl.setSpacing(0) self.my_layout.addLayout(hbl) # Create search bar self.search_lineedit = QLineEdit(parent=self) hbl.addWidget(self.search_lineedit) self.search_lineedit.setPlaceholderText("Search...") self.search_lineedit.textEdited.connect(self.filter_lines) # Create search menu pbt = QPushButton(' ', self) pbt.setToolTip('Choose which columns to show') pbt.setObjectName('but') pbt.setIcon(qta.icon('mdi.view-column')) pbt.setStyleSheet(""" #but{ min-width:35px; max-width:35px; min-height:25px; max-height:25px; icon-size:25px; }""") hbl.addWidget(pbt) self.search_menu = QMenu(pbt) self.search_menu.triggered.connect(self.filter_lines) pbt.setMenu(self.search_menu) for prop in self._ALL_PROPS: act = self.search_menu.addAction(prop) act.setCheckable(True) act.setChecked(prop in self.props) act.toggled.connect(self.filter_columns) # Create header header = QWidget() headerlay = QHBoxLayout(header) headerlay.setContentsMargins(0, 0, 0, 0) self.my_layout.addWidget(header, alignment=Qt.AlignLeft) objs = self.getLine(header=True) for prop, obj in objs: name = obj.objectName() obj.setStyleSheet(""" #{0:s}{{ min-width:{1:.1f}em; max-width: {1:.1f}em; min-height:1.8em; max-height:1.8em; }}""".format(name, self._MIN_WIDs[prop])) headerlay.addWidget(obj) # Create scrollarea sc_area = QScrollArea() sc_area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) sc_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) sc_area.setWidgetResizable(True) sc_area.setFrameShape(QFrame.NoFrame) self.my_layout.addWidget(sc_area) # ScrollArea Widget wid = QWidget() wid.setObjectName('wid') wid.setStyleSheet('#wid {background-color: transparent;}') lay = QVBoxLayout(wid) lay.setSpacing(0) lay.setContentsMargins(0, 0, 0, 0) lay.setAlignment(Qt.AlignTop) sc_area.setWidget(wid) self.lines = dict() self.filtered_lines = set() for obj_name in self.obj_names: pref = _PVName(obj_name).substitute(prefix=self.prefix) objs = self.getLine(pref) self.lines[pref] = objs self.filtered_lines.add(pref) lwid = QWidget() hlay = QHBoxLayout(lwid) hlay.setContentsMargins(0, 0, 0, 0) for prop, obj in objs: name = obj.objectName() obj.setStyleSheet(""" #{0:s}{{ min-width:{1:.1f}em; max-width: {1:.1f}em; }}""".format(name, self._MIN_WIDs[prop])) hlay.addWidget(obj) lay.addWidget(lwid, alignment=Qt.AlignLeft)
class Plugin(QDockWidget): """ Base object for plugin infrastructure. """ location = 'hidden' priority = 1 def __init__(self, parent=None): super(Plugin, self).__init__(parent) # Initialize this plugin's actions list self._actions = [] # Keep a reference to the active sub window self._active_window = None self._current_layer = None DispatchHandle.setup(self) # GUI Setup self.setAllowedAreas(Qt.AllDockWidgetAreas) self.scroll_area = QScrollArea() self.scroll_area.setFrameShape(QFrame.NoFrame) self.scroll_area.setFrameShadow(QFrame.Plain) self.scroll_area.setLineWidth(0) self.scroll_area.setWidgetResizable(True) self.scroll_area.setGeometry(QRect(0, 0, 100, 100)) # self.scroll_area.setSizePolicy( # QSizePolicy.Fixed, QSizePolicy.Fixed) # self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn) # self.scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) # The main widget inside the scroll area self.contents = QWidget() self.scroll_area.setWidget(self.contents) self.setWidget(self.scroll_area) self.setWindowTitle(self.name) self.setup_ui() self.setup_connections() def _set_name(self, value): if isinstance(value, str): self.name = value else: raise TypeError("Inappropriate type for 'name' property.") def _get_name(self): return self.name name = abstractproperty(_set_name, _get_name) @abstractmethod def setup_ui(self): raise NotImplementedError() @abstractmethod def setup_connections(self): raise NotImplementedError() def _dict_to_menu(self, menu_dict, menu_widget=None): if menu_widget is None: menu_widget = QMenu() for k, v in menu_dict.items(): if isinstance(v, dict): new_menu = menu_widget.addMenu(k) self._dict_to_menu(v, menu_widget=new_menu) else: act = QAction(k, menu_widget) if isinstance(v, list): if v[0] == 'checkable': v = v[1] act.setCheckable(True) act.setChecked(True) act.triggered.connect(v) menu_widget.addAction(act) return menu_widget def add_tool_bar_actions(self, icon_path, name="", category=None, description="", priority=0, enabled=True, callback=None, menu=None): icon = QIcon(icon_path) if menu is not None: tool_button = QToolButton() tool_button.setPopupMode(QToolButton.MenuButtonPopup) menu_widget = self._dict_to_menu(menu) tool_button.setMenu(menu_widget) tool_button.setIcon(icon) tool_button.setText(name) tool_button.setStatusTip(description) tool_button.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) item = QWidgetAction(self) item.setDefaultWidget(tool_button) item.setEnabled(enabled) else: item = QAction(self) item.triggered.connect(callback if callback is not None else lambda: None) item.setIcon(icon) item.setStatusTip(description) item.setEnabled(enabled) item.setText(name) self._actions.append(dict(action=item, category=(category, 0) if not isinstance( category, tuple) else category, priority=priority)) return item @property def active_window(self): return self._active_window @property def current_layer(self): return self._current_layer @DispatchHandle.register_listener("on_activated_window") def set_active_window(self, window): self._active_window = window @DispatchHandle.register_listener("on_selected_layer") def set_active_layer(self, layer_item): if layer_item is not None: self._current_layer = layer_item.data(0, Qt.UserRole) else: self._current_layer = None