class MplWidget(QWidget): def __init__(self, parent): QWidget.__init__(self, parent) self.layout = QVBoxLayout() self.setLayout(self.layout) self.fig = Figure(figsize=(1,1), dpi=10) _ = self.fig.add_subplot(111) self.linea = [] def cargarGrafico(self, x_data, y_data): for i in reversed(range(self.layout.count())): self.layout.itemAt(i).widget().setParent(None) fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(8, 8)) self.linea, = ax.plot(x_data,y_data,'',alpha=0.8) self.canvas = FigureCanvas(fig) self.layout.addWidget(self.canvas) self.canvas.draw() def cargarGraficoDinamico(self, x_data, y_data, epocas_max, linea): self.linea = linea if self.linea == []: for i in reversed(range(self.layout.count())): self.layout.itemAt(i).widget().setParent(None) plt.xlim(0,epocas_max) fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(8, 8)) self.linea, = ax.plot(x_data,y_data,'',alpha=0.8) self.canvas = FigureCanvas(fig) self.layout.addWidget(self.canvas) self.canvas.draw() else: self.linea.set_ydata(y_data) self.linea.set_xdata(x_data) self.canvas.draw() return self.linea
class LogWidget(QWidget): ''' docstring: 统一处理和显示折叠消息盒 ''' def __init__(self, parent=None): super().__init__(parent) self.lay = QVBoxLayout(self) self.scrollarea = QScrollArea() self.lay.addWidget(self.scrollarea) self.content = QWidget() self.scrollarea.setWidget(self.content) self.scrollarea.setWidgetResizable(True) self.contentarea = QVBoxLayout(self.content) self.contentarea.addStretch() # 设置区间范围改变信号 self.scrollarea.verticalScrollBar().rangeChanged.connect( self.modifyBarValue) def modifyBarValue(self, min, max): if self.modifytime: bar = self.scrollarea.verticalScrollBar() bar.setValue(max) self.modifytime -= 1 # print(bar.maximum(), bar.minimum(), bar.value(), self.modifytime) def addLog(self, title, message, flag=False): ''' docstring: 添加日志消息,默认选项卡关闭 ''' index = self.contentarea.count() box = CollapsibleMessageBox(Title=title, defaultLayout=True, Message=message) self.contentarea.insertWidget(index - 1, box) if flag: box.toggle_button.animateClick() self.modifytime = 1
class ToolStation(FixedWidthFrame): def __init__(self, controller, model): self.controller = controller self.model = model self.width = self.model.view_data.width super().__init__(self.width) self._init__UI() def _init__UI(self): self.layout = QVBoxLayout() self.layout.setSpacing(4) self.layout.setContentsMargins(1, 1, 1, 1) self.layout.setAlignment(Qt.AlignTop) self.setLayout(self.layout) self._add_all_widgets() def set_data(self): self._remove_all_widgets() self._add_all_widgets() def _add_all_widgets(self) -> None: widgets = self.model.view_data.tools for widget in widgets: seperator = FixedSizeLabel(self.width - 12, 1) seperator.set_colours(Colour(240, 240, 240), Colour(240, 240, 240)) self.layout.addWidget(widget, alignment=Qt.AlignHCenter) self.layout.addWidget(seperator, alignment=Qt.AlignHCenter) def _remove_all_widgets(self) -> None: for index in reversed(range(self.layout.count())): widget = self.layout.itemAt(index).widget() self.layout.removeWidget(widget)
class ViewWidget(QWidget): background_color = "#424A52" WIDTH = Settings.WIDTH.value HEIGHT = Settings.HEIGHT.value def __init__(self): super(ViewWidget, self).__init__() self.v_layout = QVBoxLayout() def init_gui(self): self.setGeometry(0, 0, Settings.WIDTH.value, Settings.HEIGHT.value) self.setLayout(self.v_layout) self.setContentsMargins(0, 0, 0, 0) self.setStyleSheet("background-color: %s;" "color:#FFFFFF" % self.background_color) def init_main_layout(self): self.v_layout.setAlignment(Qt.AlignTop) self.v_layout.setDirection(QVBoxLayout.TopToBottom) self.v_layout.setSpacing(0) self.v_layout.setContentsMargins(0, 0, 0, 0) def clear_layout(self): for i in reversed(range(self.v_layout.count())): self.v_layout.itemAt(i).widget().setParent(None)
def __init__(self, *args, **kwargs): super(AboutDialog, self).__init__(*args, **kwargs) self.setWindowTitle("About %s" % self.title) quitButton = QDialogButtonBox.Ok self.buttonBox = QDialogButtonBox(quitButton) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) layout = QVBoxLayout() title = QLabel(self.title) font = title.font() font.setPointSize(20) title.setFont(font) layout.addWidget(title) logo = QLabel() logo.setPixmap(QPixmap(os.path.join('icons', 'ma-icon-128.png'))) layout.addWidget(logo) layout.addWidget(QLabel(self.dev_info)) for i in range(0, layout.count()): layout.itemAt(i).setAlignment(Qt.AlignHCenter) layout.addWidget(self.buttonBox) self.setLayout(layout) self.setVisible(True)
class PluginController(QFrame): def __init__(self, plugins, highlighted_plugins=None, parent=None): """ :type plugins: list of Plugin :type highlighted_plugins: list of Plugin """ super().__init__(parent) self.ui = Ui_FramePlugins() self.ui.setupUi(self) self.model = PluginListModel(plugins, highlighted_plugins=highlighted_plugins) self.ui.listViewPlugins.setModel(self.model) self.settings_layout = QVBoxLayout() self.ui.groupBoxSettings.setLayout(self.settings_layout) self.create_connects() def create_connects(self): self.ui.listViewPlugins.selectionModel().selectionChanged.connect( self.handle_list_selection_changed) def save_enabled_states(self): for plugin in self.model.plugins: constants.SETTINGS.setValue(plugin.name, plugin.enabled) @pyqtSlot() def handle_list_selection_changed(self): i = self.ui.listViewPlugins.currentIndex().row() self.ui.txtEditPluginDescription.setText( self.model.plugins[i].description) self.model.plugins[i].load_settings_frame() if self.settings_layout.count() > 0: self.settings_layout.takeAt(0).widget().setParent(None) self.settings_layout.addWidget(self.model.plugins[i].settings_frame)
class VarPositionalParser(QScrollArea): def __init__(self, loadSaved=False): super().__init__() self.arg_list = [] self.mainWidget = QWidget() self.layout = QVBoxLayout(self.mainWidget) self.layout.setSizeConstraint(QLayout.SetFixedSize) self.argName = QLabel('args*') self.button_line = QWidget() self.button_line_layout = QHBoxLayout(self.button_line) self.addButton = QPushButton() self.addButton.setIcon(self.style().standardIcon(QStyle.SP_ArrowDown)) self.removeButton = QPushButton() self.removeButton.setIcon(self.style().standardIcon(QStyle.SP_ArrowUp)) self.button_line_layout.addWidget(self.addButton) self.button_line_layout.addWidget(self.removeButton) self.layout.addWidget(self.argName) self.layout.addWidget(self.button_line) # BAUSTELLE # wird durch edit->methodChanged->updateParams und edit->updateParams aufgerufen() self.addButton.clicked.connect(self.addArgument) self.removeButton.clicked.connect(self.removeArgument) #self.setLayout(self.layout) self.setWidget(self.mainWidget) self.setWidgetResizable(True) def addArgument(self, argName=None, argValue=None): argument = VarArg() if argName: argument.s_arg_name = argName if argValue: argument.s_arg_val = argValue # this is called when loading saved arguments if argName or argValue: argument.setText() self.layout.insertWidget(self.layout.count() - 1, argument) self.arg_list.append(argument) def removeArgument(self): #self.layout.removeWidget(self.lastAddedArgument) if self.arg_list: lastAddedArgument = self.arg_list[-1] lastAddedArgument.deleteLater() lastAddedArgument = None del self.arg_list[-1]
class ImageBook(QWidget): def __init__(self, image_set): super().__init__() self.title = 'Network Results Flipbook' self.results = image_set self.left = 0 self.top = 0 self.width = 600 self.height = 400 self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.layout = QVBoxLayout(self) self.displayWidget = QFrame(self) self.canvasLayout = QVBoxLayout() self.displayWidget.setLayout(self.canvasLayout) self.chooseWidget = QComboBox(self) self.chooseWidget.activated.connect(self.result_choice) self.chooseWidget.addItems(self.results.keys()) self.layout.addWidget(self.displayWidget) self.layout.addWidget(self.chooseWidget) self.show() def result_choice(self, text): for i in reversed(range(self.canvasLayout.count())): self.canvasLayout.itemAt(i).widget().setParent(None) self.canvasLayout.addWidget(self.results[str(text)]) self.show()
class PlanCropRotationView(ViewWidget): year = None def __init__(self): super().__init__() self.v_layout = QVBoxLayout() self.q_line_edit = QLineEdit() self.model = PlanCropRotationModel(self) self.table = QTableView() self.controller = PlanCropRotationController(self, self.model) self.init_gui() self.init_main_layout() self.init_input_form() def init_input_form(self): label = QLabel() label.setText("Введите год") label.setStyleSheet("font-size:20px;" "color:#FFFFFF") self.v_layout.addWidget(label, 0, Qt.AlignCenter) self.q_line_edit.setMaximumWidth(100) self.q_line_edit.setStyleSheet("text-align:center;" "color: #FFFFFF") self.q_line_edit.keyReleaseEvent = self.controller.key_input_form_event self.v_layout.addWidget(self.q_line_edit, 0, Qt.AlignCenter) def show_table(self): self.table.setStyleSheet("selection-background-color: #0f5b8d;" "background-color: #505052;" "color: #f0f4f7;" "font-size:14px;" "gridline-color:#324148;" "text-align:center;") self.table.horizontalHeader().setStyleSheet("background-color:#3b3b3d") self.table.setModel(self.model) self.table.keyReleaseEvent = self.controller.key_input for i in range(4): self.table.setColumnWidth(i, 240) self.table.setModel(self.model) self.table.setEditTriggers(QAbstractItemView.DoubleClicked) self.v_layout.addWidget(self.table) def show_nothing(self): label = QLabel("Ничего не найдено") label.setAlignment(Qt.AlignCenter) label.setStyleSheet("font-size:20px;" "color: #FFFFFF;" "background-color:#505052") self.v_layout.addWidget(label) def update_view(self): self.clear_layout() if self.year is not None: self.model.update(self.year) self.init_input_form() self.show_table() else: self.init_input_form() def clear_layout(self): for i in reversed(range(self.v_layout.count())): self.v_layout.itemAt(i).widget().setParent(None)
class Bip39RecoveryDialog(WindowModalDialog): ROLE_ACCOUNT = Qt.UserRole def __init__(self, parent: QWidget, get_account_xpub, on_account_select): self.get_account_xpub = get_account_xpub self.on_account_select = on_account_select WindowModalDialog.__init__(self, parent, _('BIP39 Recovery')) self.setMinimumWidth(400) vbox = QVBoxLayout(self) self.content = QVBoxLayout() self.content.addWidget( QLabel(_('Scanning common paths for existing accounts...'))) vbox.addLayout(self.content) self.ok_button = OkButton(self) self.ok_button.clicked.connect(self.on_ok_button_click) self.ok_button.setEnabled(False) vbox.addLayout(Buttons(CancelButton(self), self.ok_button)) self.finished.connect(self.on_finished) self.show() self.thread = TaskThread(self) self.thread.finished.connect(self.deleteLater) # see #3956 self.thread.add(self.recovery, self.on_recovery_success, None, self.on_recovery_error) def on_finished(self): self.thread.stop() def on_ok_button_click(self): item = self.list.currentItem() account = item.data(self.ROLE_ACCOUNT) self.on_account_select(account) def recovery(self): network = Network.get_instance() coroutine = account_discovery(network, self.get_account_xpub) return network.run_from_another_thread(coroutine) def on_recovery_success(self, accounts): self.clear_content() if len(accounts) == 0: self.content.addWidget(QLabel(_('No existing accounts found.'))) return self.content.addWidget(QLabel(_('Choose an account to restore.'))) self.list = QListWidget() for account in accounts: item = QListWidgetItem(account['description']) item.setData(self.ROLE_ACCOUNT, account) self.list.addItem(item) self.list.clicked.connect(lambda: self.ok_button.setEnabled(True)) self.content.addWidget(self.list) def on_recovery_error(self, exc_info): self.clear_content() self.content.addWidget(QLabel(_('Error: Account discovery failed.'))) _logger.error(f"recovery error", exc_info=exc_info) def clear_content(self): for i in reversed(range(self.content.count())): self.content.itemAt(i).widget().setParent(None)
def __init__(self, *args, **kwargs): super(AboutDialog, self).__init__(*args, **kwargs) QBtn = QDialogButtonBox.Ok self.buttonBox = QDialogButtonBox(QBtn) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) layout = QVBoxLayout() # Title label title = QLabel("PyBrowse") font = title.font() font.setPointSize(20) title.setFont(font) layout.addWidget(title) # Icon Label/Pixmap logo = QLabel() logo.setPixmap(QPixmap(os.path.join('images', 'ma-icon-128.png'))) layout.addWidget(logo) # More info Labels layout.addWidget(QLabel("Version 2020.1.0p67")) layout.addWidget(QLabel("Copyright 2020 HipyCas")) for i in range(0, layout.count()): layout.itemAt(i).setAlignment(Qt.AlignHCenter) layout.addWidget(self.buttonBox) self.setLayout(layout)
def btnSearch_on_clicked(self, checked): print('1') gbox = self.findChild(QGroupBox, 'gboxStockInfoList') print('2') # find vbox previous defined vbox = self.findChild(QVBoxLayout, 'vboxStockInfoList') if vbox is None: # init vbox vbox = QVBoxLayout() vbox.setObjectName('vboxStockInfoList') else: # delete child widgets for i in reversed(range(vbox.count())): vbox.itemAt(i).widget().deleteLater() fldKeyword = self.findChild(QLineEdit, 'keyword') sKeyword = fldKeyword.text() df_code_list = getDataCodeName(sKeyword) for code in df_code_list['code']: print(code) dict_stock_info = get_stock_realtime_info(code) # df_stock_info = pd.DataFrame([dict_stock_info]) # print(dict_stock_info) hbox = self.drawStockInfo(dict_stock_info) wgt_new_stock_info = QWidget() wgt_new_stock_info.setLayout(hbox) vbox.addWidget(wgt_new_stock_info) gbox.setLayout(vbox)
def __init__(self, *args, **kwargs): super(AboutDialog, self).__init__(*args, **kwargs) QBtn = QDialogButtonBox.Ok # No cancel self.buttonBox = QDialogButtonBox(QBtn) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) layout = QVBoxLayout() title = QLabel("CRIO") font = title.font() font.setPointSize(20) title.setFont(font) layout.addWidget(title) logo = QLabel() logo.setPixmap(QPixmap(os.path.join('images', 'ma-icon-128.png'))) layout.addWidget(logo) layout.addWidget(QLabel("Copyright 2019 CRIO")) for i in range(0, layout.count()): layout.itemAt(i).setAlignment(Qt.AlignHCenter) layout.addWidget(self.buttonBox) self.setLayout(layout)
def __init__(self, *args, **kwargs): super(HelpDialog, self).__init__(*args, **kwargs) QBtn = QDialogButtonBox.Ok self.buttonBox = QDialogButtonBox(QBtn) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) layout = QVBoxLayout() title = QLabel('Lab Control System') font = title.font() font.setPointSize(20) title.setFont(font) layout.addWidget(title) logo = QLabel() logo.setPixmap(QPixmap(os.path.join('images', 'tools.png'))) layout.addWidget(logo) layout.addWidget(QLabel("Version 23.35.211.233232")) layout.addWidget(self.buttonBox) for i in range(0, layout.count()): layout.itemAt(i).setAlignment(Qt.AlignHCenter) self.setLayout(layout)
class DirList(QWidget): """DirList UI control """ def __init__(self, values, onChange=None, rowType=DirectoryLocal): super().__init__() self.rowType = rowType self.scroll = QScrollArea(self) self.scroll.setWidgetResizable(True) self.scroll.setFrameShape(QFrame.NoFrame) layout = QVBoxLayout(self.scroll) self.list = QVBoxLayout() self.button = QPushButton('Add') self.button.clicked.connect(self.on_click) layout.addLayout(self.list) layout.addWidget(self.button) layout.addStretch() widget = QWidget() widget.setLayout(layout) self.scroll.setWidget(widget) self.layout = layout self.onChange = onChange for value in values: self.add(value) def resizeEvent(self, _): self.scroll.setFixedWidth(self.width()) self.scroll.setFixedHeight(self.height()) def on_click(self): self.add(None) def add(self, value): self.list.addWidget(Row(self, value, self.rowType)) def save(self): if self.onChange: self.onChange(self) def removeWidget(self, widget): self.list.removeWidget(widget) widget.setParent(None) self.save() def count(self): return self.list.count() def itemAt(self, i): return self.list.itemAt(i) def getValue(self, i): return self.itemAt(i).widget().getValue()
class InstallPage(QWidget): """Settings page for the installed plugins""" def __init__(self, parent, repo): """QWidget Dictionary -> Void Consumes the parent and the repository dictionary and sets up the install page in the settings area""" QWidget.__init__(self, parent) self._userPlugins = helper.getPlugins() self._repo = repo # Add a scrollArea that if they are more plugins that fit into the # settings page scrollArea = QScrollArea(self) scrollArea.setWidgetResizable(True) scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) baseLayout = QVBoxLayout() baseLayout.setAlignment(Qt.AlignTop) self.setLayout(baseLayout) baseWidget = QWidget() scrollArea.setWidget(baseWidget) baseLayout.addWidget(scrollArea) self._vbox = QVBoxLayout() baseWidget.setLayout(self._vbox) def update(self, userPlugins): """ListOfUserpluginEntry -> Void Consume a list of UserpluginEntry and repopulates the install page""" for i in reversed(range(self._vbox.count())): try: self._vbox.itemAt(i).widget().setParent(None) except AttributeError as e: qWarning("Can't call setParent of None type") labelText = "<h2>Install Plugins</h2>" if (len(self._repo["plugins"]) < 1): labelText += "<p>It seems we could not load the plugin repository.</p>" labelText += "<p style='color:red'>Make shure your internet connection is working and restart Enki.</p><p></p>" self._vbox.addWidget(QLabel(labelText)) for entry in self._repo["plugins"]: isInstalled = helper.isPluginInstalled(entry["name"], userPlugins) if isInstalled: self._vbox.addWidget(pluginspage.PluginTitlecard(isInstalled)) else: self._vbox.addWidget(InstallableTitlecard(entry, self)) def addPluginToUserPlugins(self, installableTitlecard): """InstallableTitlecard -> Void Consumes an InstallableTitlecard and insert an PluginTitleCard instead of itself""" index = self._vbox.indexOf(installableTitlecard) name = installableTitlecard.modulename() pluginEntry = helper.initPlugin(name) if pluginEntry: self._userPlugins.append(pluginEntry) self._vbox.insertWidget(index, pluginspage.PluginTitlecard(pluginEntry))
class LocalButtonsConf(OptionsDialogGroupBox): def __init__(self, name, main): self.main = main OptionsDialogGroupBox.__init__(self, name, main) self.buttonBox = QGroupBox("Pins") self.buttonBoxLayout = QVBoxLayout() self.buttonBox.setLayout(self.buttonBoxLayout) def initUI(self): vbox = QVBoxLayout() self.polBox = QCheckBox("Invert") vbox.addWidget(self.polBox) self.buttongroup = QButtonGroup() self.buttongroup.setExclusive(False) vbox.addWidget(self.buttonBox) self.setLayout(vbox) def initButtons(self, num): #delete buttons self.num = num # Remove buttons for i in range(self.buttonBoxLayout.count()): b = self.buttonBoxLayout.takeAt(0) self.buttonBoxLayout.removeItem(b) b.widget().deleteLater() for b in self.buttongroup.buttons(): self.buttongroup.removeButton(b) self.buttonBox.update() for i in range(self.num): cb = QCheckBox(str(i + 1)) self.buttongroup.addButton(cb, i) self.buttonBoxLayout.addWidget(cb) def localcb(mask): for i in range(self.num): self.buttongroup.button(i).setChecked(mask & (1 << i)) self.main.comms.serialGetAsync("local_btnmask?", localcb, int) def apply(self): mask = 0 for i in range(self.num): if (self.buttongroup.button(i).isChecked()): mask |= 1 << i self.main.comms.serialWrite("local_btnmask=" + str(mask)) self.main.comms.serialWrite("local_btnpol=" + ("1" if self.polBox.isChecked() else "0")) def readValues(self): self.main.comms.serialGetAsync("local_btnpins?", self.initButtons, int) self.main.comms.serialGetAsync("local_btnpol?", self.polBox.setChecked, int)
class AnalogInputConf(OptionsDialogGroupBox): analogbtns = QButtonGroup() axes = 0 def __init__(self, name, main): self.main = main OptionsDialogGroupBox.__init__(self, name, main) self.analogbtns.setExclusive(False) self.buttonBox = QGroupBox("Pins") self.buttonBoxLayout = QVBoxLayout() self.buttonBox.setLayout(self.buttonBoxLayout) def initUI(self): layout = QVBoxLayout() self.autorangeBox = QCheckBox("Autorange") layout.addWidget(self.autorangeBox) layout.addWidget(self.buttonBox) self.setLayout(layout) def readValues(self): self.main.comms.serialGetAsync("local_ain_num?", self.createAinButtons, int) self.main.comms.serialGetAsync("local_ain_acal?", self.autorangeBox.setChecked, int) def createAinButtons(self, axes): self.axes = axes # remove buttons for i in range(self.buttonBoxLayout.count()): b = self.buttonBoxLayout.takeAt(0) self.buttonBoxLayout.removeItem(b) b.widget().deleteLater() for b in self.analogbtns.buttons(): self.analogbtns.removeButton(b) # add buttons for i in range(axes): btn = QCheckBox(str(i + 1), self) self.analogbtns.addButton(btn, i) self.buttonBoxLayout.addWidget(btn) def f(axismask): for i in range(self.axes): self.analogbtns.button(i).setChecked(axismask & (1 << i)) self.main.comms.serialGetAsync("local_ain_mask?", f, int) def apply(self): mask = 0 for i in range(self.axes): if (self.analogbtns.button(i).isChecked()): mask |= 1 << i self.main.comms.serialWrite("local_ain_mask=" + str(mask)) self.main.comms.serialWrite("local_ain_acal=" + ( "1" if self.autorangeBox.isChecked() else "0"))
class NavigationContainer(QWidget): def __init__(self, parent=None): super(NavigationContainer, self).__init__(parent) self._layout = None # QVBoxLayout self._tabBar = None # TabBar self._layout = QVBoxLayout(self) self._layout.setContentsMargins(0, 0, 0, 0) self._layout.setSpacing(0) self.setLayout(self._layout) self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum) def addWidget(self, widget): ''' @param: widget QWidget ''' self._layout.addWidget(widget) def setTabBar(self, tabBar): ''' @param: tabBar TabBar ''' self._tabBar = tabBar self._layout.addWidget(self._tabBar) self.toggleTabsOnTop(gVar.qzSettings.tabsOnTop) def toggleTabsOnTop(self, enable): self.setUpdatesEnabled(False) self._layout.removeWidget(self._tabBar) index = 0 if not enable: index = self._layout.count() self._layout.insertWidget(index, self._tabBar) top = enable and 2 or 0 bottom = enable and 2 or 0 self._layout.setContentsMargins(0, top, 0, bottom) self.setUpdatesEnabled(True) # private: # override def paintEvent(self, event): ''' @param: event QPaintEvent ''' super(NavigationContainer, self).paintEvent(event) # Draw line at the bottom of navigation bar if tabs are on top # To visually distinguish navigation bar from the page if gVar.qzSettings.tabsOnTop: p = QPainter(self) lineRect = QRect(0, self.height() - 1, self.width(), 1) color = self.palette().window().color().darker(125) p.fillRect(lineRect, color)
class SelectData(QWidget): def __init__(self, HDV): QWidget.__init__(self) self.HDV = HDV self.data_items = list() self._initUI() self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowCloseButtonHint) def _initUI(self): self.setGeometry(350, 350, 400, 300) self.setWindowTitle('Select Data') # self.setStyleSheet("background-color: gray;") self._make_widgets() self._make_layout() self._make_connect() def closeEvent(self, event): pass def _make_widgets(self): pass def _make_layout(self): self.layout = QVBoxLayout(self) self.layout.setContentsMargins(0, 0, 0, 0) self.layout.addStretch() def _make_connect(self): pass # self.dataTree.itemChanged.connect(self.onChangeHandler) def addFolder(self, folder): pass def add_data_handle(self, data_handle): self.data_items.append(DataListItem(data_handle, parent=self)) data_handle.set_data_item(self.data_items[-1]) self.layout.insertWidget(self.layout.count() - 1, self.data_items[-1]) def remove_data_handle(self, data_handle): self.layout.removeWidget(data_handle.data_item) self.data_items.remove(data_handle.data_item) data_handle.data_item.deleteLater()
class QTrapWidget(QFrame): """Controls for all traps.""" def __init__(self, *args, **kwargs): super(QTrapWidget, self).__init__(*args, **kwargs) self.properties = dict() self.init_ui() def init_ui(self): self.setFrameShape(QFrame.Box) inner = QWidget() self.layout = QVBoxLayout() self.layout.setSpacing(0) self.layout.setContentsMargins(0, 0, 0, 0) self.layout.setAlignment(Qt.AlignTop) inner.setLayout(self.layout) scroll = QScrollArea() scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) scroll.setWidgetResizable(True) scroll.setWidget(inner) layout = QVBoxLayout(self) layout.addWidget(scroll) self.setLayout(layout) self.layout.addWidget(self.labelLine()) def labelLine(self): widget = QWidget() layout = QHBoxLayout() layout.setAlignment(Qt.AlignLeft) layout.setSpacing(0) layout.setContentsMargins(0, 0, 0, 0) for name in ['x', 'y', 'z', 'alpha', 'phi']: label = QLabel(name) label.setAlignment(Qt.AlignCenter) label.setFixedWidth(getWidth()) layout.addWidget(label) widget.setLayout(layout) return widget @pyqtSlot(QTrap) def registerTrap(self, trap): trapWidget = QTrapPropertyWidget(trap) self.properties[trap] = trapWidget self.layout.addWidget(trapWidget) trap.destroyed.connect(lambda: self.unregisterTrap(trap)) @pyqtSlot(QTrap) def unregisterTrap(self, trap): try: self.properties[trap].deleteLater() except Exception as ex: logger.warning('{}'.format(ex)) def count(self): return self.layout.count()
def create_choiceBox(self): layout = QHBoxLayout() vBox = QVBoxLayout() for region in self.regions: vBox.addLayout(MyHBox(self, region)) if vBox.count() >= 10: layout.addLayout(vBox) layout.addWidget(separator('V')) vBox = QVBoxLayout() layout.addLayout(vBox) return layout
class QScrollableBox(QWidget): def __init__(self, parent): super(QScrollableBox, self).__init__(parent) mainLayout = QVBoxLayout() mainLayout.setContentsMargins(0, 0, 0, 0) self.scrollArea = QScrollArea(self) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) self.scrollArea.setSizePolicy(sizePolicy) self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.scrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.scrollArea.setWidgetResizable(True) mainLayout.addWidget(self.scrollArea) self.setLayout(mainLayout) scrollContents = QWidget() self.m_layout = QVBoxLayout() self.m_layout.setContentsMargins(0, 0, 0, 0) self.m_layout.setSizeConstraint(QLayout.SetNoConstraint) scrollContents.setLayout(self.m_layout) self.scrollArea.setWidget(scrollContents) def addWidget(self, w): if not w: return count = self.m_layout.count() if count > 1: self.m_layout.removeItem(self.m_layout.itemAt(count - 1)) self.m_layout.addWidget(w) w.show() self.m_layout.addStretch() self.scrollArea.update() def removeWidget(self, w): self.m_layout.removeWidget(w) self.scrollArea.update() def insertWidget(self, i, w): self.m_layout.insertWidget(i, w) self.scrollArea.update() def clearWidgets(self): item = self.m_layout.takeAt(0) while item != None: item.widget().deleteLater() self.m_layout.removeItem(item) del item self.scrollArea.update() def indexOf(self, w): return self.m_layout.indexOf(w)
class ContextWidget(QDialog): var_changed_signal = pyqtSignal(str, float) refresh_signal = pyqtSignal() def __init__(self, parent): super().__init__(parent) self.setWindowTitle("Variables") self.global_layout = QVBoxLayout(self) self.main_layout = QVBoxLayout(self) self.refresh_btn = QPushButton('Refresh', self) self.refresh_btn.clicked.connect(lambda: self.refresh_signal.emit()) self.global_layout.addWidget(self.refresh_btn, alignment=Qt.AlignAbsolute) self.global_layout.addLayout(self.main_layout) self.global_layout.addStretch() self.setLayout(self.global_layout) def refresh(self, context): self.clear_layout() for key, value in context.items(): tmp_layout = QHBoxLayout(self) label = QLabel(key, self) text_edit = QLineEdit(str(value), self) text_edit.textChanged.connect(lambda value, variable=key: self.change_value(variable, value)) tmp_layout.addWidget(label, alignment=Qt.AlignAbsolute) tmp_layout.addWidget(text_edit, alignment=Qt.AlignAbsolute) self.main_layout.addLayout(tmp_layout) def change_value(self, variable, value): try: value = float(value) except: value = value[:1] self.var_changed_signal.emit(variable, float(value)) def clear_layout(self): while self.main_layout.count() > 0: l = self.main_layout.itemAt(0).layout() # label i = l.itemAt(0).widget() l.itemAt(0).widget().setParent(None) i.deleteLater() # text edit i = l.itemAt(0).widget() l.itemAt(0).widget().setParent(None) i.deleteLater() self.main_layout.itemAt(0).layout().setParent(None) l.deleteLater()
class MyApp(QMainWindow): def __init__(self): super().__init__() self.add_btn = QPushButton("Add") self.add_btn.clicked.connect(self.click_add_btn) self.remove_btn = QPushButton("Remove") self.remove_btn.clicked.connect(self.click_remove_btn) self.scroll_area = QScrollArea() self.scroll_area.setWidgetResizable(True) self.init_ui() def init_ui(self): self.main_layout = QVBoxLayout() self.main_layout.addWidget(self.add_btn) self.main_layout.addWidget(self.remove_btn) self.main_layout.addWidget(TestUI()) self.centralWidget = QWidget() self.centralWidget.setLayout(self.main_layout) self.setCentralWidget(self.centralWidget) self.show() def click_add_btn(self): self.main_layout.addWidget(TestUI()) self.setFixedSize( self.main_layout.sizeHint() + PyQt5.QtCore.QSize(0, TestUI().frameGeometry().height()) ) def click_remove_btn(self): if self.main_layout.count() > 3: child = self.main_layout.takeAt(self.main_layout.count() - 1) child.widget().deleteLater() print(self.main_layout.count()) print(self.main_layout.sizeHint()) self.setFixedSize(self.main_layout.sizeHint())
class IdgamesSearchView(Base, Form): def __init__(self, root, controller, parent=None): super(self.__class__, self).__init__(parent) self.setupUi(self) add_widget(root, self, 'IDGAMES_SEARCH') self.searchbar = SearchBar(root, controller) self.controller = controller self.search_results_container = self.findChild( QScrollArea, 'idgames_search_results_container') self.search_results_container.setWidgetResizable(True) self.search_results = self.findChild(QWidget, 'idgames_search_results') self.layout = QVBoxLayout() self.layout.setContentsMargins(9, 9, 9, 9) self.layout.setAlignment(Qt.AlignTop) self.search_results.setLayout(self.layout) self.layout.addWidget(QLabel('Search result will show here...')) self.search_results_widgets = {} def updateResults(self, result): for i in reversed(range(self.layout.count())): widgetToRemove = self.layout.itemAt(i).widget() # remove it from the layout list self.layout.removeWidget(widgetToRemove) # remove it from the gui if widgetToRemove != None: widgetToRemove.setParent(None) search_result = result[0].get('file', []) if type(search_result) != list: search_result = [search_result] warning = result[0].get('warning', None) if warning: self.layout.addWidget(QLabel(warning['type'])) self.layout.addWidget(QLabel(warning['message'])) self.search_results_widgets = {} for item in search_result: search_result_widget = SearchResultWidget(self.controller) search_result_widget.set_data(item) self.layout.addWidget(search_result_widget) self.search_results_widgets[item['id']] = search_result_widget self.layout.addStretch()
class PDFViewer(QScrollArea): def __init__(self, parent): super().__init__(parent) self.scrollAreaContents = QWidget() self.scrollAreaLayout = QVBoxLayout() self.setWidget(self.scrollAreaContents) self.setWidgetResizable(True) self.scrollAreaContents.setLayout(self.scrollAreaLayout) self.pixmapList = [] def resizeEvent(self, event): pass # do something about this later def update(self, pdf): self.render(pdf) self.clear() self.show() def render(self, pdf): """ Update the preview shown by rendering a new PDF and drawing it to the scroll area. """ self.pixmapList = [] pdfView = fitz.Document(stream=pdf, filetype='pdf') # render at 4x resolution and scale for page in pdfView: self.pixmapList.append(page.getPixmap(matrix=fitz.Matrix(4, 4), alpha=False)) def clear(self): while self.scrollAreaLayout.count(): item = self.scrollAreaLayout.takeAt(0) w = item.widget() if w: w.deleteLater() def show(self): for p in self.pixmapList: label = QLabel(parent=self.scrollAreaContents) label.setAlignment(Qt.AlignHCenter) qtimg = QImage(p.samples, p.width, p.height, p.stride, QImage.Format_RGB888) # -45 because of various margins... value obtained by trial and error. label.setPixmap(QPixmap.fromImage(qtimg).scaled(self.width()-45, self.height()*2, Qt.KeepAspectRatio, transformMode=Qt.SmoothTransformation)) self.scrollAreaLayout.addWidget(label) # necessary on Mojave with PyInstaller (or previous contents will be shown) self.repaint()
class StartPageFrame(QWidget): WIDTH = 330 HEIGHT = 150 THICKNESS = 4 def __init__(self): super().__init__() self.__layout = QVBoxLayout() self.__layout.setAlignment(Qt.AlignTop | Qt.AlignLeft) self.__layout.setContentsMargins(20, 20, 20, 20) self.setLayout(self.__layout) def paintEvent(self, event): painter = QPainter() painter.begin(self) painter.setRenderHint(QPainter.Antialiasing) painter.setBrush(QBrush(QColor(0, 0, 255, 32))) painter.setPen(QPen(QPen(QColor(0, 36, 62, 96), self.THICKNESS))) viewport = painter.viewport() rect = QRect(int(self.THICKNESS / 2), int(self.THICKNESS / 2), int(viewport.width() - self.THICKNESS), int(viewport.height() - self.THICKNESS)) painter.drawRoundedRect(rect, 15, 15) painter.end() super().paintEvent(event) def sizeHint(self): return QSize(self.WIDTH, self.HEIGHT) def add_frame_action(self): action = StartPageFrameAction() self.__layout.addWidget(action) return action def clear(self): for no in range(self.__layout.count()): widget = self.__layout.itemAt(0).widget() widget.setParent(None) self.__layout.removeWidget(widget)
def __init__(self, plugin_registry, message, context, state, parent=None): super().__init__(parent) self.plugin_registry = plugin_registry vbox = QVBoxLayout() self.combo = QComboBox() vbox.addWidget(self.combo) vbox.addStretch() vbox.itemAt(vbox.count() - 1) self.vbox = vbox self.setLayout(vbox) self.setContent(message, context) self.restoreState(state) self.combo.currentIndexChanged.connect(self.onComboChanged) self.onComboChanged()
class MainWindow(QMainWindow, Ui_MainWindow): signal_list_modules = pyqtSignal() def __init__(self): QMainWindow.__init__(self) self.setupUi(self) self.setAttribute(Qt.WA_TranslucentBackground, True) self.verticalLayout_inner = QVBoxLayout() self.modulesManager_tab.setLayout(self.verticalLayout_inner) self.pushButtonRetry.clicked.connect(self.showEvent) @pyqtSlot(list) def list_modules(self, response): self.clear_listed_modules() for module in response: item = ModuleGroupBox(module) self.verticalLayout_inner.addWidget(item, alignment=Qt.AlignTop) ModuleManager.instance().installation_started.connect( item.disable_btns) ModuleManager.instance().update_started.connect(item.disable_btns) item.signal_install.connect(ModuleManager.instance().download) item.signal_update.connect(ModuleManager.instance().update) item.signal_uninstall.connect(ModuleManager.instance().uninstall) ModuleManager.instance().installation_finished.connect( item.installed_or_updated) ModuleManager.instance().uninstallation_finished.connect( item.uninstalled) self.groupBoxError.hide() @pyqtSlot() def handle_connection_error(self): self.clear_listed_modules() self.groupBoxError.show() self.labelError.setText("No Internet Connection") def showEvent(self, QShowEvent): self.labelError.setText("Loading...") self.signal_list_modules.emit() def clear_listed_modules(self): for i in reversed(range(self.verticalLayout_inner.count())): self.verticalLayout_inner.itemAt(i).widget().deleteLater()
class PluginFrame(QFrame): def __init__(self, plugins, highlighted_plugins=None, parent=None): """ :type plugins: list of Plugin :type highlighted_plugins: list of Plugin """ super().__init__(parent) self.ui = Ui_FramePlugins() self.ui.setupUi(self) self.model = PluginListModel(plugins, highlighted_plugins=highlighted_plugins) self.ui.listViewPlugins.setModel(self.model) self.settings_layout = QVBoxLayout() self.ui.groupBoxSettings.setLayout(self.settings_layout) self.create_connects() try: self.restoreGeometry(constants.SETTINGS.value("{}/geometry".format(self.__class__.__name__))) except TypeError: pass def create_connects(self): self.ui.listViewPlugins.selectionModel().selectionChanged.connect(self.on_list_selection_changed) for plugin in self.model.plugins: if hasattr(plugin, "show_proto_sniff_dialog_clicked"): plugin.show_proto_sniff_dialog_clicked.connect(self.parent().parent().show_proto_sniff_dialog) def save_enabled_states(self): for plugin in self.model.plugins: constants.SETTINGS.setValue(plugin.name, plugin.enabled) @pyqtSlot() def on_list_selection_changed(self): i = self.ui.listViewPlugins.currentIndex().row() self.ui.txtEditPluginDescription.setText(self.model.plugins[i].description) if self.settings_layout.count() > 0: widget = self.settings_layout.takeAt(0).widget() self.settings_layout.removeWidget(widget) widget.setParent(None) self.settings_layout.addWidget(self.model.plugins[i].settings_frame)
class PluginsPage(QWidget): """Settings page for the installed plugins""" def __init__(self, parent): QWidget.__init__(self, parent) # Add a scrollArea that if they are more plugins that fit into the # settings page scrollArea = QScrollArea(self) scrollArea.setWidgetResizable(True) scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) baseLayout = QVBoxLayout() self.setLayout(baseLayout) baseWidget = QWidget() scrollArea.setWidget(baseWidget) baseLayout.addWidget(scrollArea) self._vbox = QVBoxLayout() baseWidget.setLayout(self._vbox) def update(self, userPlugins): """ListOfUserpluginEntry -> Void Consume a list of UserpluginEntry and repopulates the plugins page""" for i in reversed(range(self._vbox.count())): try: self._vbox.itemAt(i).widget().setParent(None) except AttributeError as e: qWarning("Can't call setParent of None type") self._vbox.addWidget(QLabel( """<h2>Installed Plugins: <code>%i</code></h2> <p>Add plugins by putting them into <code>%s</code></p> <p></p>""" % (len(userPlugins), PLUGIN_DIR_PATH))) for entry in userPlugins: self._vbox.addWidget(PluginTitlecard(entry)) self._vbox.addStretch(1)
class Contacts(QWidget): def __init__(self, db): self.dic_wind = {} self.dic_button = {} self.dic_err_win = {} self.layout = None self.mygroupbox = QGroupBox('Contacts list') self.myform = QFormLayout() self.scroll = QScrollArea() self.db = db self.google_api = Google() super().__init__() def init_ui(self): sender = self.sender() error = None if sender is not None: if sender.text() == '&VK': if not self.db.db_exists(): error = self.db.create(download_data(sender.text())) else: error = self.db.update_database( download_data(sender.text())) if sender.text() == '&Facebook': if not self.db.db_exists(): error = self.db.create(download_data(sender.text())) else: error = self.db.update_database( download_data(sender.text())) if error is not None: self.dic_err_win[error] = ErrorWindow(error) self.dic_err_win[error].init_ui() else: for friend in self.db.get_list_users(): button = self.create_button(friend) self.myform.addRow(button) self.mygroupbox.setLayout(self.myform) self.scroll.setWidget(self.mygroupbox) self.scroll.setWidgetResizable(True) self.scroll.setFixedHeight(600) self.layout = QVBoxLayout(self) self.layout.addWidget(self.scroll) def create_button(self, friend): name = friend button = QPushButton(name, self) self.dic_button[name] = button inf_friend = self.db.get_user_inf(friend) if inf_friend['picture'] != '': logo = inf_friend['picture'] self.dic_wind[name] = Window(name, logo, inf_friend, self, self.google_api) button.clicked.connect(lambda: self.dic_wind[name].init_ui()) return button def import_all_contacts(self): list_users = self.db.get_list_users() if len(list_users) != 0: open_new('https://contacts.google.com') for contact in list_users: contact_data = self.db.get_user_inf(contact) self.google_api.create_contact( self.google_api.create_xml(contact_data)) def redrawing(self): self.clear_window() self.init_ui() def clear_layout(self, layout): for i in range(layout.count()): if layout.itemAt(i) is not None: layout.itemAt(i).widget().setParent(None) def clear_window(self): for i in range(self.layout.count()): if self.layout.itemAt(i) is not None: if self.layout.itemAt(i).layout() is not None: self.clear_layout(self.layout.itemAt(i).layout()) self.layout.itemAt(i).layout().setParent(None) if self.layout.itemAt(i).widget() is not None: self.layout.itemAt(i).widget().setParent(None)
class TopicsTab(QWidget): configChanged = pyqtSignal() def __init__(self): super(QWidget, self).__init__() self.config = None self.count = 0 self.topicRows = {} self.nameEdit = QLineEdit() self.dataTypeComboBox = QComboBox() self.fillDataTypes() self.opTypeComboBox = QComboBox() self.opTypeComboBox.addItem('sub', 'Subscribe') self.opTypeComboBox.addItem('pub', 'Publish') self.addButton = QPushButton('Add') self.addButton.clicked.connect(self.addClicked) self.mainLayout = QVBoxLayout() rowLayout = QHBoxLayout() rowLayout.addWidget(self.nameEdit) rowLayout.addWidget(self.dataTypeComboBox) rowLayout.addWidget(self.opTypeComboBox) rowLayout.addWidget(self.addButton) rowContainer = QWidget() rowContainer.setLayout(rowLayout) rowContainer.setObjectName('titleRow') self.mainLayout.addWidget(rowContainer) self.setLayout(self.mainLayout) def fillDataTypes(self): rosTypes = Interfaces.getRosMessageTypes() for type in rosTypes: concatType = type['typeDir'] + '/' + type['type'] self.dataTypeComboBox.addItem(concatType, concatType) def addTopicRow(self, name, type, opType): rowLayout = QHBoxLayout() rowLayout.addWidget(QLabel(name)) rowLayout.addWidget(QLabel(type)) rowLayout.addWidget(QLabel(opType)) removeButton = QPushButton('Remove') removeButton.clicked.connect(self.removeTopicClicked) removeButton.setObjectName(str(self.count)) rowLayout.addWidget(removeButton) rowContainer = QWidget() rowContainer.setLayout(rowLayout) rowContainer.setObjectName('row' + str(self.count)) self.mainLayout.addWidget(rowContainer) self.topicRows[self.count] = rowContainer self.count += 1 def addClicked(self): if self.config is not None: self.config.addTopic(self.count, self.nameEdit.text(), self.dataTypeComboBox.currentData(), self.opTypeComboBox.currentData()) self.addTopicRow(self.nameEdit.text(), self.dataTypeComboBox.currentData(), self.opTypeComboBox.currentData()) self.nameEdit.setText('') self.configChanged.emit() def removeTopicClicked(self): if self.config is not None: itemToRemove = None for i in range(self.mainLayout.count()): if self.mainLayout.itemAt(i).widget().objectName() == 'row' + self.sender().objectName(): itemToRemove = self.mainLayout.itemAt(i) break if itemToRemove is not None: self.mainLayout.removeItem(itemToRemove) itemToRemove.widget().setParent(None) self.mainLayout.update() self.configChanged.emit() self.config.removeTopic(int(self.sender().objectName())) del self.topicRows[int(self.sender().objectName())] def clearAllRows(self): clearList = [] for i in range(self.mainLayout.count()): item = self.mainLayout.itemAt(i) if item.widget().objectName() != 'titleRow': clearList.append(item) for item in clearList: self.mainLayout.removeItem(item) item.widget().setParent(None) self.mainLayout.update() self.count = 0 def setConfig(self, config): self.config = config self.clearAllRows() for topic in self.config.getTopics(): topic['id'] = self.count self.addTopicRow(topic['name'], topic['type'], topic['opType'])
class MenuView(QScrollArea): def __init__(self, parent=None, update_func=None, params=None): super().__init__(parent) self.setMaximumWidth(200) self.params = params self.H1_HEIGHT = 50 self.H2_HEIGHT = 50 self.SIDE_MARGIN = 5 self.H1_FONT_SIZE = 18 self.H2_FONT_SIZE = 18 self.H3_FONT_SIZE = 16 self.TEXT_FONT_SIZE = 14 style = ''' QPushButton:flat{ text-align: left; padding: 1ex; } QPushButton:pressed{ background-color: silver; } QPushButton:hover:!pressed{ font: bold; } ''' self.setStyleSheet(style) self.update_func = update_func self.inner = QWidget(self) self.vbox = QVBoxLayout(self.inner) self.vbox.setSpacing(0) self.vbox.setContentsMargins(0, 0, 0, 0) self.vbox.setAlignment(Qt.AlignTop) topframe = QFrame() topframe.setStyleSheet('background-color: white') topframe.setFixedHeight(self.H1_HEIGHT) lbl_h1 = QLabel('Contents', topframe) fnt = lbl_h1.font() fnt.setPointSize(self.H1_FONT_SIZE) lbl_h1.setFont(fnt) lbl_h1.setFixedHeight(self.H1_HEIGHT) lbl_h1.setMargin(self.SIDE_MARGIN) self.vbox.addWidget(topframe) self.list_button = [] if self.params.lang == 'en': self.edit_button('Introduction') else: self.edit_button('はじめに') self.inner.setLayout(self.vbox) self.setWidget(self.inner) def buttonClicked(self, text): if self.update_func is not None: self.update_func(text) def edit_button(self, text, delete=False): if delete: for i in range(self.vbox.count()): widget = self.vbox.itemAt(i).widget() if type(widget) == QPushButton: if widget.text() == '-' + text: self.vbox.removeWidget(widget) widget.deleteLater() widget = None return if text not in self.list_button: self.list_button.append(text) btn = QPushButton('-' + text, self.inner) btn.setFlat(True) fnt = btn.font() fnt.setPointSize(self.TEXT_FONT_SIZE) btn.setFont(fnt) btn.clicked.connect(lambda: self.buttonClicked(text)) self.vbox.addWidget(btn) self.buttonClicked(text)