def clearLayout(layout: QLayout) -> None: """Used to remove widgets from various layouts""" if layout.count(): while (item := layout.takeAt(0)) is not None: layout.removeItem(item) item.widget().hide() item.widget().deleteLater()
def makeLabelIn(parent: QtWidgets.QLayout, text, alignFlag: QtCore.Qt.AlignmentFlag): label = QtWidgets.QLabel(text) label.setAlignment(alignFlag) parent.addWidget(label) return label
def add_layout_items(layout: QLayout, items: Iterable[Union[QWidget, QLayout]]): for item in items: if isinstance(item, QWidget): layout.addWidget(item) else: layout.addLayout(item)
def metadata_window_cursor_layout(self, layout: QtWidgets.QLayout, cursor: QtGui.QCursor) -> None: try: if layout is None: return r = [] i = layout.count() while i > 0: i -= 1 r.append(i) for i in r: child = layout.itemAt(i) # print(child) if isinstance(child, QtWidgets.QWidgetItem): try: if isinstance(child.widget(), QtWidgets.QPushButton): if child.widget().objectName( ) == 'label_cover_view': continue child.widget().setCursor(cursor) except Exception: traceback.print_exc() elif isinstance(child, QtWidgets.QSpacerItem): '' elif isinstance( child, (QtWidgets.QLayoutItem, QtWidgets.QHBoxLayout, QtWidgets.QVBoxLayout, QtWidgets.QGridLayout)): self.metadata_window_cursor_layout(child, cursor) del child except Exception: traceback.print_exc()
def append_widget( layout: QtWidgets.QLayout, widgets: Tuple[QtWidgets.QWidget] = None) -> Tuple[QtWidgets.QWidget]: for widget in widgets: layout.addWidget(widget) return widgets
def clearLayout(layout: QtWidgets.QLayout) -> None: while layout.count() > 0: item = layout.takeAt(0) if item.layout(): clearLayout(item.layout()) if item.widget(): item.widget().setParent(None)
def custom_colors(self, layout: QtWidgets.QLayout): for setting, name, attr in ( ('BackgroundColor', 'Chart background', 'background'), ('ForegroundColor', 'Chart foreground', 'foreground'), ('TextColor', 'Chart text', 'text'), ): cp = self.color_picker(setting, attr) layout.addRow(name, cp)
def create_collapsible_box_add_to_parent_layout( title: str, parent_layout: QLayout, title_backgroup_color="") -> CollapsibleBox: collapsible_box = CollapsibleBox( title, title_backgroup_color=title_backgroup_color) parent_layout.addWidget(collapsible_box) return collapsible_box
def __init__(self, parent=None, margin=-1, h_spacing=-1, v_spacing=-1): QLayout.__init__(self, parent) self._h_space = h_spacing self._v_space = v_spacing self._item_list = [] self.setContentsMargins(margin, margin, margin, margin)
def clearLayout(layout: QtWidgets.QLayout): if layout is None: return for i in reversed(range(layout.count())): item = layout.takeAt(i) if item.widget() is not None: item.widget().deleteLater() else: clearLayout(item.layout())
def add_widget_to_layout(widget: QWidget, layout: QLayout, name: str) -> None: """Adds a widget that belongs to a spacific layout :param widget: The widget being inserted :param layout: Layout to which widget is inserted :param name: Name of widget :return: None """ widget.setObjectName(name) layout.addWidget(widget)
def get_layout_widgets(layout: QLayout) -> Iterator[QWidget]: for i in range(layout.count()): item = layout.itemAt(i) sub_layout = item.layout() if sub_layout: yield from get_layout_widgets(sub_layout) else: widget = item.widget() if widget: yield widget
def clear_layout(layout: QLayout) -> None: if layout is None: return while layout.count(): item = layout.takeAt(0) widget = item.widget() if widget is not None: widget.deleteLater() else: clear_layout(item.layout())
def trace_colors(self, layout: QtWidgets.QLayout): for setting, name, attr in ( ('SweepColor', 'Sweep color', 'sweep'), ('SecondarySweepColor', 'Second sweep color', 'sweep_secondary'), ('ReferenceColor', 'Reference color', 'reference'), ('SecondaryReferenceColor', 'Second reference color', 'reference_secondary'), ): cp = self.color_picker(setting, attr) layout.addRow(name, cp)
def clear_layout(layout: QLayout) -> None: """Clear the layout off all its components""" if layout is not None: while layout.count(): item = layout.takeAt(0) widget = item.widget() if widget is not None: widget.deleteLater() else: clear_layout(item.layout())
def remove_widget_from_layout(layout: QLayout, widget: QWidget): """ Remove widget from a layout. :param layout: :param widget: :return: """ layout.removeWidget(widget) widget.deleteLater()
def clear_layout(layout: QLayout): item = layout.takeAt(0) while item: w = item.widget() l = item.layout() if w: w.setParent(None) if l: clear_layout(l) l.setParent(None) item = layout.takeAt(0)
def setGeometry(self, r): QLayout.setGeometry(self, r) new_height = self._layoutChildren(r) if new_height != self._min_h: self._updateMinimumSize(new_height) i = 0 wid = self.parentWidget() while wid is not None: wid.updateGeometry() wid = wid.parentWidget() i += 1
def delete_children(layout: QtWidgets.QLayout) -> None: """Delete all child layouts and widgets of a layout. This must be done before removing this layout from its parent. """ while layout.count() > 0: child = layout.takeAt(0) if child.widget() is not None: child.widget().deleteLater() elif child.layout() is not None: delete_children(child.layout())
def __init__(self, pane_selectors_layout: QLayout, panes_layout: QStackedLayout, pane: QWidget, *args, **kwargs): super().__init__(*args, **kwargs) self.setProperty('pane-selector', 'true') self.setFlat(panes_layout.currentWidget() != pane) self.setCursor(Qt.PointingHandCursor) self.released.connect(lambda: [ pane_selectors_layout.itemAt(i).widget().setFlat(True) for i in range(0, pane_selectors_layout.count()) ]) self.released.connect(lambda: self.setFlat(False)) self.released.connect(lambda: panes_layout.setCurrentWidget(pane))
def __init__(self, window=None): QLayout.__init__(self) self._window = window main_view = WebView(window) # keep an ordered list of the widgets self._views = [] self._current_view = main_view # to avoid asking reordering many times self.__view_sort_asked = False self._item_added = None self._root = LayoutEntry() self.add_view(main_view, self._root)
def add_button(parent: QLayout, title: str, on_click, cls: str=None, mtd: str=None, width: int=30, height: int=None) -> QPushButton: tr = QPushButton(title) tr.setFixedHeight(width) if height is not None: tr.setFixedHeight(height) tr.clicked.connect(on_click) parent.addWidget(tr) if cls is not None and mtd is not None: if not Auth.get_access(cls, mtd): tr.setEnabled(False) tr.setStyleSheet("background-color: grey;") return tr
def setJSONKwargs(self, setFunction, layout:QtWidgets.QLayout, allowedtype:type): """ Used to convert each row to a settings.Test row Args: setFunction (method): The function belonging to each type in the layout layout (QtWidgets.QLayout): the layout to parse through allowedtype (type): The type of Widget with the layout """ items = [layout.itemAt(i).widget() for i in range(layout.count()) ] for item in items: if not issubclass(type(item),Row): continue setFunction(**item.getKwargs()) return
def metadata_window_clear_layout(self, layout: QtWidgets.QLayout) -> None: if layout is None: return r = [] i = layout.count() while i > 0: i -= 1 r.append(i) for i in r: child = layout.itemAt(i) # print(child) if isinstance(child, QtWidgets.QWidgetItem): try: child.widget().setVisible(False) layout.removeWidget(child.widget()) # child.widget().deleteLater() except Exception: traceback.print_exc() elif isinstance(child, QtWidgets.QSpacerItem): layout.removeItem(child) elif isinstance(child, (QtWidgets.QLayoutItem, QtWidgets.QHBoxLayout)): self.metadata_window_clear_layout(child) layout.removeItem(child) del child
def create_loss_inputs(self, tab: QTabWidget, innerLayout: QLayout): """ Creates inputs for loss settings in GUI. :param tab: Tab to create inputs for - simulation, live, or backtest. :param innerLayout: Inner layout to place input widgets on. """ self.lossDict[tab, "lossType"] = lossTypeComboBox = QComboBox() self.lossDict[tab, "lossPercentage"] = lossPercentage = QDoubleSpinBox() self.lossDict[ tab, "smartStopLossCounter"] = smartStopLossCounter = QSpinBox() lossTypeComboBox.addItems(("Trailing", "Stop")) lossPercentage.setValue(5) innerLayout.addRow(QLabel("Loss Type"), lossTypeComboBox) innerLayout.addRow(QLabel("Loss Percentage"), lossPercentage) innerLayout.addRow(QLabel("Smart Stop Loss Counter"), smartStopLossCounter) if tab != self.backtestConfigurationTabWidget: self.lossDict[tab, "safetyTimer"] = safetyTimer = QSpinBox() safetyTimer.valueChanged.connect( lambda: self.update_loss_settings(tab)) innerLayout.addRow(QLabel("Safety Timer"), safetyTimer) lossTypeComboBox.currentIndexChanged.connect( lambda: self.update_loss_settings(tab)) lossPercentage.valueChanged.connect( lambda: self.update_loss_settings(tab)) smartStopLossCounter.valueChanged.connect( lambda: self.update_loss_settings(tab))
def add_create_section(self, layout: QtWidgets.QLayout): self._w_create_gb = QtWidgets.QGroupBox("Create", self) create_gb_layout = QtWidgets.QHBoxLayout(self._w_create_gb) self._w_create_gb.setLayout(create_gb_layout) self._cbb_create_user = QtWidgets.QComboBox(self) self._cbb_create_user.setEditable(True) self._cbb_create_user.setMinimumWidth(150) create_gb_layout.addWidget(self._cbb_create_user) self._le_create_chars = QtWidgets.QLineEdit(self) create_gb_layout.addWidget(self._le_create_chars) self._pb_create = QtWidgets.QPushButton("Добавить", self) create_gb_layout.addWidget(self._pb_create) layout.addWidget(self._w_create_gb) self._pb_create.clicked.connect(self.handle_create)
def _init_stats(self, layout: qtw.QLayout) -> None: # histograms self._qw_hist = self._add_widget(layout, BarGraph(*self._init_histogram())) self._qw_hist_cum = self._add_widget( layout, BarGraph(*self._init_histogram(cum=True))) # text stats layout.addLayout(self._init_text_stats()) self._update_text_stats()
def create_take_profit_inputs(self, tab: QTabWidget, innerLayout: QLayout, isOptimizer: bool = False): """ Creates inputs for take profit settings in GUI. :param tab: Tab to create inputs for - simulation, live, or backtest. :param innerLayout: Inner layout to place input widgets on. :param isOptimizer: Boolean for whether optimizer method called this function. """ if isOptimizer: self.takeProfitDict['optimizerTypes'] = [] innerLayout.addRow(QLabel("Take Profit Types")) for takeProfitType in self.takeProfitTypes: checkbox = QCheckBox(f'Enable {takeProfitType} take profit?') innerLayout.addRow(checkbox) self.takeProfitDict['optimizerTypes'].append((takeProfitType, checkbox)) for optimizerType in self.takeProfitOptimizerTypes: self.takeProfitDict[optimizerType, 'start'] = start = get_default_widget(QSpinBox, 1, 0) self.takeProfitDict[optimizerType, 'end'] = end = get_default_widget(QSpinBox, 1, 0) self.takeProfitDict[optimizerType, 'step'] = step = get_default_widget(QSpinBox, 1) add_start_end_step_to_layout(innerLayout, optimizerType, start, end, step) else: self.takeProfitDict[tab, 'takeProfitType'] = takeProfitTypeComboBox = QComboBox() self.takeProfitDict[tab, 'takeProfitPercentage'] = takeProfitPercentage = QDoubleSpinBox() takeProfitTypeComboBox.addItems(self.takeProfitTypes) takeProfitTypeComboBox.currentIndexChanged.connect(lambda: self.update_take_profit_settings(tab)) takeProfitPercentage.setValue(5) takeProfitPercentage.valueChanged.connect(lambda: self.update_take_profit_settings(tab)) innerLayout.addRow(QLabel("Take Profit Type"), takeProfitTypeComboBox) innerLayout.addRow(QLabel('Take Profit Percentage'), takeProfitPercentage)
def create_collapsible_box_with_sub_form_layout_and_add_to_parent_layout( title: str, parent_layout: QLayout, fold: bool = True, title_backgroup_color="") -> Tuple[CollapsibleBox, QFormLayout]: collapsible_box = CollapsibleBox( title, title_backgroup_color=title_backgroup_color) parent_layout.addWidget(collapsible_box) form_layout = QFormLayout() collapsible_box.setContentLayout(form_layout) collapsible_box.set_fold(fold) return collapsible_box, form_layout
def add_remove_section(self, layout: QtWidgets.QLayout): self._w_remove_gb = QtWidgets.QGroupBox("Remove", self) remove_gb_layout = QtWidgets.QHBoxLayout(self._w_remove_gb) self._w_remove_gb.setLayout(remove_gb_layout) self._cbb_remove_user = QtWidgets.QComboBox(self) self._cbb_remove_user.setMinimumWidth(150) self._cbb_remove_user.setEditable(False) remove_gb_layout.addWidget(self._cbb_remove_user) self._le_remove_chars = QtWidgets.QLineEdit(self) remove_gb_layout.addWidget(self._le_remove_chars) self._pb_remove = QtWidgets.QPushButton("Удалить", self) remove_gb_layout.addWidget(self._pb_remove) layout.addWidget(self._w_remove_gb) self._w_remove_gb.setEnabled(False) self._pb_remove.clicked.connect(self.handle_remove)
def remove_trailing_spacer_from_layout(layout: QLayout): """ If the last item in the layout is spacer, removes it. :param layout: target layout :return: bool success indicator """ ni = layout.count() if ni < 1: return False ni -= 1 layout_item = layout.itemAt(ni) if layout_item is None: return False spacer_item = layout_item.spacerItem() if spacer_item is not None: layout.removeItem(spacer_item) return True return False
def add_buttons_to_layout(self, layout: QLayout) -> None: for button in self.buttons: layout.addWidget(button)
def __init__(self, parent=None): QLayout.__init__(self, parent) self._items = [] self._updateMinimumSize()
def fix_layout(layout: QLayout) -> None: layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0)