def createEditor(self, parent: QWidget, option: QStyleOptionViewItem, index: QModelIndex) -> QWidget: """ The set of editors that we have defined here are only good for small-dimensioned registers with a few values. They are not good for unstructured data and large arrays. For that, shall the need arise, we'll need to define dedicated complex widgets. Luckily, it is very easy to do, just not really necessary at the moment. The framework doesn't care what kind of widget we're displaying when editing, it's just a basic pop-up that appears on top of the view. """ register = self._get_register_from_index(index) _logger.info("Constructing editor for %r", register) if self._can_use_bool_switch(register): editor = QComboBox(parent) editor.setEditable(False) editor.addItem(get_icon("cancel"), "False (0)") editor.addItem(get_icon("ok"), "True (1)") elif self._can_use_spinbox(register): minimum, maximum = register.min_value[0], register.max_value[0] try: dtype = Register.get_numpy_type(register.type_id) float_decimals = ( int(abs(math.log10(numpy.finfo(dtype).resolution)) + 0.5) + 1) except ValueError: float_decimals = None if float_decimals is not None: step = (maximum - minimum) / _MIN_PREFERRED_NUMBER_OF_STEPS_IN_FULL_RANGE try: step = 10**round(math.log10(step)) except ValueError: step = 1 # Math domain error corner case step = min( 1.0, step) # Step can't be greater than one for UX reasons _logger.info( "Constructing QDoubleSpinBox with single step set to %r", step) editor = QDoubleSpinBox(parent) editor.setSingleStep(step) editor.setDecimals(float_decimals) else: editor = QSpinBox(parent) editor.setMinimum(minimum) editor.setMaximum(maximum) else: editor = QPlainTextEdit(parent) editor.setFont(get_monospace_font()) editor.setMinimumWidth( QFontMetrics(editor.font()).width("9" * (MAX_LINE_LENGTH + 5))) editor.setFont(Model.get_font()) self._message_display_callback("Press Esc to cancel editing") return editor
def createEditor(self): # setup data model self._model = QSqlTableModel() self._model.setTable(self.table) self._col = self._model.fieldIndex(self.column) # setup filter model for sorting and filtering self._proxy = QSortFilterProxyModel() self._proxy.setFilterCaseSensitivity(Qt.CaseInsensitive) self._proxy.setSourceModel(self._model) self._proxy.setFilterKeyColumn(self._col) # setup completer self._completer = QCompleter() self._completer.setModel(self._proxy) self._completer.setCompletionColumn(self._col) self._completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion) # setup combobox editor = QComboBox() editor.setModel(self._proxy) editor.setModelColumn(self._col) editor.setEditable(True) editor.setFocusPolicy(Qt.StrongFocus) editor.setInsertPolicy(QComboBox.NoInsert) editor.setCompleter(self._completer) # setup connections editor.currentTextChanged[str].connect(self.onActivated) # setup editor appearence style = self.style() editor.setStyleSheet(style) editor.lineEdit().setStyleSheet(style) font = editor.font() self._completer.popup().setFont(font) return editor
def __init__(self): super().__init__() self.setWindowTitle("My app") widget = QComboBox() # font font = widget.font() font.setPointSize(10) widget.setFont(font) # set if the number of tabs are changed. widget.currentIndexChanged.connect(self.index_changed) # set if the text of the tabs are changed. widget.currentTextChanged.connect(self.text_changed) # set editable - bool widget.setEditable(True) widget.setInsertPolicy(QComboBox.InsertAlphabetically) # set widget policy - IF EXISTS self.setCentralWidget(widget)
def __init__(self, parent=None): super(GUI_OSC, self).__init__(parent) self.setWindowTitle("Interactive Music Generation") self.font_size = 14 self.verbose = 1 # 2 = too much, 1 = enough, 0 will be silent self.last = None # Init OSC - output address = "127.0.0.1" port = 8008 self.osc = OSCClient(address, port, encoding='utf8') self.text = "" # Init MIDI controller - input device_id = 1 import platform if 'linux' in platform.system().lower(): # linux / windows device_id = 3 print_device_info() function_to_call_pad_click = self.midi_bound_pad_click function_to_call_xy_pad = self.midi_bound_xy_pad midi_controller = MIDI_Input_Handler(device_id, function_to_call_pad_click, function_to_call_xy_pad) threading.Thread(target=midi_controller.input_loop, args=[]).start() print("Initiated midi controller! device_id=", device_id) # empty saved positions for midi bound clicks self.saved_positions = {} self.load_midi_positions() import settings import cooked_files_handler self.settings = settings.Settings() self.songs_models = cooked_files_handler.CookedFilesHandler( self.settings) self.songs_models.prepare_songs_models_paths() # Init on screen GUI - input layout = QVBoxLayout() style = "QWidget {font-size: " + str(self.font_size) + "pt;}" hbox_model_select = QHBoxLayout() text_model_select = QLabel() text_model_select.setText("Model selection:") text_model_select.setStyleSheet(style) model_select = QComboBox() for model_path in self.songs_models.model_paths: just_model = model_path.split("/")[-1] just_model = just_model[0:min(len(just_model), 30)] model_select.addItem(just_model) self.model_select = model_select model_select.currentIndexChanged.connect( self.onChangeSend) # <<< On change function font = model_select.font() font.setPointSize(self.font_size) model_select.setFont(font) hbox_model_select.addWidget(text_model_select) hbox_model_select.addWidget(model_select) layout.addLayout(hbox_model_select) # Sliders percentage, self.percentage_slider = self.add_slider( "Relative position in audio:", style, value=self.DEFAULT_POSITION, maximum=1000) length, self.length_slider = self.add_slider("Length:", style, value=self.DEFAULT_LENGTH, maximum=124, minimum=4) change_speed, self.change_speed_slider = self.add_slider( "Transition speed:", style, value=self.DEFAULT_CHANGESPEED, maximum=200) volume, self.volume_slider = self.add_slider("Volume:", style, value=self.DEFAULT_VOLUME, maximum=300) weights_multiplier, self.weights_multiplier = self.add_double_slider( "Weights Multiplier:", style, minimum=-1, value=1, maximum=2) layout.addLayout(percentage) layout.addLayout(length) layout.addLayout(change_speed) layout.addLayout(volume) layout.addLayout(weights_multiplier) # Record button hbox_record = QHBoxLayout() recButton = QPushButton("Save!") recButton.setStyleSheet(style) hbox_record.addWidget(recButton) recButton.setCheckable(True) file_textbox = QLineEdit() file_textbox.setText("tmp_recording1") hbox_record.addWidget(file_textbox) self.file_textbox = file_textbox self.recButton = recButton self.recButton_state = False recButton.clicked.connect(self.recording_toggle) layout.addLayout(hbox_record) self.setLayout(layout)
def __init__(self, parent=None): super(GUI_OSC, self).__init__(parent) self.setWindowTitle("Interactive Music Generation") self.font_size = 14 address = "127.0.0.1" port = 8008 self.osc = OSCClient(address, port, encoding='utf8') self.text = "" import settings import cooked_files_handler self.settings = settings.Settings() self.songs_models = cooked_files_handler.CookedFilesHandler( self.settings) self.songs_models.prepare_songs_models_paths() layout = QVBoxLayout() style = "QWidget {font-size: " + str(self.font_size) + "pt;}" hbox_model_select = QHBoxLayout() text_model_select = QLabel() text_model_select.setText("Model selection:") text_model_select.setStyleSheet(style) model_select = QComboBox() for model_path in self.songs_models.model_paths: just_model = model_path.split("/")[-1] just_model = just_model[0:min(len(just_model), 30)] model_select.addItem(just_model) self.model_select = model_select model_select.currentIndexChanged.connect( self.onChangeSend) # <<< On change function font = model_select.font() font.setPointSize(self.font_size) model_select.setFont(font) hbox_model_select.addWidget(text_model_select) hbox_model_select.addWidget(model_select) layout.addLayout(hbox_model_select) # Sliders percentage, self.percentage_slider = self.add_slider( "Relative position in audio:", style, value=200, maximum=1000) length, self.length_slider = self.add_slider("Length:", style, value=64, maximum=124, minimum=4) change_speed, self.change_speed_slider = self.add_slider( "Transition speed:", style, value=80, maximum=200) volume, self.volume_slider = self.add_slider("Volume:", style, value=100, maximum=300) weights_multiplier, self.weights_multiplier = self.add_double_slider( "Weights Multiplier:", style, minimum=-1, value=1, maximum=2) layout.addLayout(percentage) layout.addLayout(length) layout.addLayout(change_speed) layout.addLayout(volume) layout.addLayout(weights_multiplier) # Record button hbox_record = QHBoxLayout() recButton = QPushButton("Save!") recButton.setStyleSheet(style) hbox_record.addWidget(recButton) recButton.setCheckable(True) file_textbox = QLineEdit() file_textbox.setText("tmp_recording1") hbox_record.addWidget(file_textbox) self.file_textbox = file_textbox self.recButton = recButton self.recButton_state = False recButton.clicked.connect(self.recording_toggle) layout.addLayout(hbox_record) self.setLayout(layout)
class MainWidget(QWidget): def __init__(self, url): super().__init__() fontDB = QFontDatabase() fontDB.addApplicationFont(':/mono-font') # fontDB.addApplicationFont(':/Taipei-font') screen = QDesktopWidget().screenGeometry() self.width, self.height = screen.width(), screen.height() self.html = '' self.url = url self.GI = None self.DL = None self.web_view = QWebEngineView(self) self.web_view.load(QUrl(self.url)) self.web_view.page().titleChanged.connect(self.get_html) btnExit = QPushButton('', self) btnExit.setIcon(QIcon(':/exit-icon')) btnExit.setIconSize(QSize(32, 32)) btnExit.setToolTip('Exit') btnExit.clicked.connect(QApplication.quit) self.btnHome = QPushButton('', self) self.btnHome.setIcon(QIcon(':/home-icon')) self.btnHome.setIconSize(QSize(32, 32)) self.btnHome.setToolTip('Home') self.btnHome.clicked.connect(self.goHome) self.btnBack = QPushButton('', self) self.btnBack.setIcon(QIcon(':/go_back-icon')) self.btnBack.setIconSize(QSize(32, 32)) self.btnBack.setToolTip('Backward') self.btnBack.clicked.connect(self.goBack) self.btnBack.setDisabled(True) self.btnNext = QPushButton('', self) self.btnNext.setIcon(QIcon(':/go_forward-icon')) self.btnNext.setIconSize(QSize(32, 32)) self.btnNext.setToolTip('Forward') self.btnNext.clicked.connect(self.goForward) self.btnNext.setDisabled(True) self.cmbDownList = QComboBox(self) self.cmbDownList.setMinimumHeight(40) # font = self.cmbDownList.font() font = QFont('Liberation Mono') font.setPointSize(14) self.cmbDownList.setFont(font) self.cmbDownList.setIconSize(QSize(24, 24)) self.cmbDownList.currentIndexChanged.connect(self.onIndexChanged) self.cmbDownList.setToolTip('Select a stream to download') self.cmbCapsList = QComboBox(self) self.cmbCapsList.setMinimumHeight(40) # font = QFont('Taipei Sans TC Beta') font = self.cmbCapsList.font() font.setPointSize(14) self.cmbCapsList.setFont(font) self.cmbCapsList.setToolTip('Select a caption/subtitle to download') btnSettings = QPushButton('', self) btnSettings.setIcon(QIcon(':/settings-icon')) btnSettings.setIconSize(QSize(32, 32)) btnSettings.setToolTip('Settings') btnSettings.clicked.connect(self.onSettings) self.btnDLoad = QPushButton('', self) self.btnDLoad.setIcon(QIcon(':/download-icon')) self.btnDLoad.setIconSize(QSize(32, 32)) self.btnDLoad.setToolTip('Download') self.btnDLoad.clicked.connect(self.goDownload) self.btnDLoad.setDisabled(True) self.progressBar = QProgressBar(self) self.progressBar.setMinimum(0) self.progressBar.setMaximum(100) hBox1 = QHBoxLayout() hBox1.addWidget(btnExit, 0) hBox1.addWidget(self.btnHome, 0) hBox1.addWidget(self.btnBack, 0) hBox1.addWidget(self.btnNext, 0) hBox1.addWidget(self.cmbDownList, 1) hBox1.addWidget(self.cmbCapsList, 0) hBox1.addWidget(btnSettings, 0) hBox1.addWidget(self.btnDLoad, 0) vBox = QVBoxLayout() vBox.addLayout(hBox1) vBox.addWidget(self.web_view) vBox.addWidget(self.progressBar) self.setLayout(vBox) self.setWindowTitle('Youtube Download Helper') self.setGeometry(QRect(round((self.width - 760) / 2), round((self.height - 550) / 2), 760, 550)) self.setMinimumSize(QSize(760, 550)) def store_html(self, html): # print('store_html()') self.html = html if self.web_view.page().action(QWebEnginePage.Back).isEnabled(): self.btnBack.setEnabled(True) else: self.btnBack.setDisabled(True) if self.web_view.page().action(QWebEnginePage.Forward).isEnabled(): self.btnNext.setEnabled(True) else: self.btnNext.setDisabled(True) if self.web_view.title() != 'YouTube' and self.web_view.title() != 'https://www.youtube.com': # print(self.web_view.title()) self.btnHome.setEnabled(True) else: self.btnHome.setDisabled(True) self.cmbDownList.clear() self.cmbCapsList.clear() url = self.web_view.page().url().url() if 'video-id' in self.html and '?v=' in url: # fp = open(self.web_view.title() + '.html', 'w') # fp.write(self.html) # fp.close() self.GI = GetItem(url) self.GI.addItem.connect(self.onAddItem) self.GI.addCaption.connect(self.onAddCaption) self.GI.finished.connect(self.onAddItemFinished) self.GI.start() else: self.btnDLoad.setDisabled(True) def get_html(self): # print('get_html') self.web_view.page().toHtml(self.store_html) def goHome(self): self.web_view.setUrl(QUrl(self.url)) def goBack(self): self.web_view.back() def goForward(self): self.web_view.forward() def goDownload(self): global download_ongoing download_ongoing = True self.btnDLoad.setDisabled(True) self.progressBar.setValue(0) self.DL = DownLoad(self.web_view.page().url().url(), self.cmbDownList.currentIndex(), self.cmbCapsList.currentIndex()) self.DL.valueChanged.connect(self.onValueChanged) self.DL.dlCompleted.connect(self.onDlCompleted) self.DL.start() def onAddItem(self, icon, item): self.cmbDownList.addItem(QIcon(icon), item) def onAddCaption(self, cap): self.cmbCapsList.addItem(cap) def onAddItemFinished(self): if not download_ongoing: self.btnDLoad.setEnabled(True) def onValueChanged(self, per): self.progressBar.setValue(round(per)) # print('%.2f%% completed' % per) def onDlCompleted(self): global download_ongoing download_ongoing = False self.btnDLoad.setDisabled(True) self.progressBar.setValue(0) def onIndexChanged(self): if not download_ongoing: self.btnDLoad.setEnabled(True) def onSettings(self): sWnd = SettingsDlg(self.width, self.height) sWnd.exec() if sWnd.SettingsChanged: # print('Settings saved!') if self.web_view.title() != 'YouTube' and self.web_view.title() != 'https://www.youtube.com': self.web_view.reload()