def __init__(self, suggestion='', input_valid_callback = None): self.input_valid_callback = input_valid_callback self.menu = QMenu() self.lb = QWidgetAction(None) self.widget = QWidget(None) self.layout = QHBoxLayout() self.button = QPushButton() self.button.setText("Ok") self.le = QLineEdit() self.layout.addWidget(self.le) self.layout.addWidget(self.button) self.widget.setLayout(self.layout) self.button.pressed.connect(self.done) self.le.textEdited.connect(self.check_input) self.eventFilter = EnterKeyPressFilter() self.eventFilter.callback = self.done self.le.installEventFilter(self.eventFilter) self.lb.setDefaultWidget(self.widget) self.menu.addAction(self.lb) self.le.setText(suggestion) self.le.setFocus() self.le.selectAll() self.result = None
class TabularViewFilterMenu(FilterMenuBase): """Filter menu to use together with FilterWidget in TabularViewMixin.""" filterChanged = Signal(str, set, bool) def __init__(self, parent, identifier, data_to_value, show_empty=True): """ Args: parent (SpineDBEditor) identifier (int): index identifier data_to_value (method): a method to translate item data to a value for display role """ super().__init__(parent) self.identifier = identifier self._filter = DataToValueFilterWidget(self, data_to_value, show_empty=show_empty) self._filter_action = QWidgetAction(parent) self._filter_action.setDefaultWidget(self._filter) self.addAction(self._filter_action) self.anchor = parent self.connect_signals() def emit_filter_changed(self, valid_values): self.filterChanged.emit(self.identifier, valid_values, self._filter.has_filter()) def event(self, event): if event.type() == QEvent.Show and self.anchor is not None: if self.anchor.area == "rows": pos = self.anchor.mapToGlobal(QPoint(0, 0)) + QPoint(0, self.anchor.height()) elif self.anchor.area == "columns": pos = self.anchor.mapToGlobal(QPoint(0, 0)) + QPoint(self.anchor.width(), 0) self.move(pos) return super().event(event)
class TabularViewFilterMenu(FilterMenuBase): """Filter menu to use together with FilterWidget in TabularViewMixin.""" filterChanged = Signal(object, set, bool) def __init__(self, parent, identifier, item_type, show_empty=True): """ Args: parent (TabularViewMixin) identifier (int): index identifier item_type (str): either "object" or "parameter definition" """ super().__init__(parent) self.identifier = identifier self._filter = TabularViewFilterWidget(parent, item_type, show_empty=show_empty) self._filter_action = QWidgetAction(parent) self._filter_action.setDefaultWidget(self._filter) self.addAction(self._filter_action) self.anchor = parent self.connect_signals() def emit_filter_changed(self, valid_values): self.filterChanged.emit(self.identifier, valid_values, self._filter.has_filter()) def event(self, event): if event.type() == QEvent.Show and self.anchor is not None: if self.anchor.area == "rows": pos = self.anchor.mapToGlobal(QPoint(0, 0)) + QPoint(0, self.anchor.height()) elif self.anchor.area == "columns": pos = self.anchor.mapToGlobal(QPoint(0, 0)) + QPoint(self.anchor.width(), 0) self.move(pos) return super().event(event)
def addServerAction(self, text, function, args=[], kwargs={}): action = QWidgetAction(self) aButton = QPushButton(text) aButton.clicked.connect(lambda: function(*args, **kwargs)) action.setDefaultWidget(aButton) self.ServerActions.addAction(action)
class TextInput(): def __init__(self, suggestion='', input_valid_callback = None): self.input_valid_callback = input_valid_callback self.menu = QMenu() self.lb = QWidgetAction(None) self.widget = QWidget(None) self.layout = QHBoxLayout() self.button = QPushButton() self.button.setText("Ok") self.le = QLineEdit() self.layout.addWidget(self.le) self.layout.addWidget(self.button) self.widget.setLayout(self.layout) self.button.pressed.connect(self.done) self.le.textEdited.connect(self.check_input) self.eventFilter = EnterKeyPressFilter() self.eventFilter.callback = self.done self.le.installEventFilter(self.eventFilter) self.lb.setDefaultWidget(self.widget) self.menu.addAction(self.lb) self.le.setText(suggestion) self.le.setFocus() self.le.selectAll() self.result = None def show(self, pos): self.menu.exec_(pos) return self.result def done(self): self.result = self.le.text() self.menu.close() def check_input(self): if self.input_valid_callback is not None: result = self.input_valid_callback(self.le.text()) if result: self.le.setStyleSheet('') else: self.le.setStyleSheet('background: pink') return None
def __init__(self, parent, show_empty=True): """ Args: parent (SpineDBEditor) """ super().__init__(parent) self._filter = SimpleFilterWidget(self, show_empty=show_empty) self._filter_action = QWidgetAction(parent) self._filter_action.setDefaultWidget(self._filter) self.addAction(self._filter_action) self.connect_signals()
def __init__(self, parent, identifier, item_type, show_empty=True): """ Args: parent (TabularViewMixin) identifier (int): index identifier item_type (str): either "object" or "parameter definition" """ super().__init__(parent) self.identifier = identifier self._filter = TabularViewFilterWidget(parent, item_type, show_empty=show_empty) self._filter_action = QWidgetAction(parent) self._filter_action.setDefaultWidget(self._filter) self.addAction(self._filter_action) self.anchor = parent self.connect_signals()
def __init__(self, parent=None): super().__init__(parent) self._remove_filter = QAction('Remove filters', None) self._filter = FilterWidget() self._filter_action = QWidgetAction(parent) self._filter_action.setDefaultWidget(self._filter) self.addAction(self._remove_filter) self.addAction(self._filter_action) # add connections self.aboutToHide.connect(self._cancel_filter) self.aboutToShow.connect(self._check_filter) self._remove_filter.triggered.connect(self._clear_filter) self._filter.okPressed.connect(self._change_filter) self._filter.cancelPressed.connect(self.hide)
def __init__(self, text=""): QWidgetAction.__init__(self, None) self.widget = QWidget(None) self.layout = QHBoxLayout() self.slider = QSlider() self.slider.setOrientation(Qt.Horizontal) self.label = QLabel() self.label.setText(text) self.layout.addWidget(self.label) self.layout.addWidget(self.slider) self.widget.setLayout(self.layout) self.setDefaultWidget(self.widget)
def __init__(self, parent, identifier, data_to_value, show_empty=True): """ Args: parent (SpineDBEditor) identifier (int): index identifier data_to_value (method): a method to translate item data to a value for display role """ super().__init__(parent) self.identifier = identifier self._filter = DataToValueFilterWidget(self, data_to_value, show_empty=show_empty) self._filter_action = QWidgetAction(parent) self._filter_action.setDefaultWidget(self._filter) self.addAction(self._filter_action) self.anchor = parent self.connect_signals()
def onDataViewContextMenu(self, pos): if not self.group_id: return index = self.DataView.indexAt(pos) menu_title = QWidgetAction(self.DataView) title_lbl = QLabel() title_lbl.setText(g_tr('ReferenceDataDialog', "Change type to:")) menu_title.setDefaultWidget(title_lbl) contextMenu = QMenu(self.DataView) contextMenu.addAction(menu_title) contextMenu.addSeparator() combo_model = self.GroupCombo.model() for i in range(self.GroupCombo.count()): type_id = combo_model.data(combo_model.index(i, combo_model.fieldIndex(self.group_fkey_field))) contextMenu.addAction(self.GroupCombo.itemText(i), partial(self.updateItemType, index, type_id)) contextMenu.popup(self.DataView.viewport().mapToGlobal(pos))
class FilterMenu(QMenu): """Filter menu to use together with FilterWidget in TabularViewForm.""" filterChanged = Signal(object, set, bool) def __init__(self, parent=None): super().__init__(parent) self._remove_filter = QAction('Remove filters', None) self._filter = FilterWidget() self._filter_action = QWidgetAction(parent) self._filter_action.setDefaultWidget(self._filter) self.addAction(self._remove_filter) self.addAction(self._filter_action) # add connections self.aboutToHide.connect(self._cancel_filter) self.aboutToShow.connect(self._check_filter) self._remove_filter.triggered.connect(self._clear_filter) self._filter.okPressed.connect(self._change_filter) self._filter.cancelPressed.connect(self.hide) def add_items_to_filter_list(self, items): self._filter._filter_model.add_item(items) self._filter.save_state() def remove_items_from_filter_list(self, items): self._filter._filter_model.remove_items(items) self._filter.save_state() def set_filter_list(self, data): self._filter.set_filter_list(data) def _clear_filter(self): self._filter.clear_filter() self._change_filter() def _check_filter(self): self._remove_filter.setEnabled(self._filter.has_filter()) def _cancel_filter(self): self._filter._cancel_filter() def _change_filter(self): valid_values = set(self._filter._filter_state) if self._filter._filter_empty_state: valid_values.add(None) self.filterChanged.emit(self, valid_values, self._filter.has_filter()) self.hide()
class SimpleFilterMenu(FilterMenuBase): filterChanged = Signal(set) def __init__(self, parent, show_empty=True): """ Args: parent (SpineDBEditor) """ super().__init__(parent) self._filter = SimpleFilterWidget(self, show_empty=show_empty) self._filter_action = QWidgetAction(parent) self._filter_action.setDefaultWidget(self._filter) self.addAction(self._filter_action) self.connect_signals() def emit_filter_changed(self, valid_values): self.filterChanged.emit(valid_values)
def __init__(self, parent, source_model, field, show_empty=True): """ Args: parent (SpineDBEditor) source_model (CompoundParameterModel): a model to lazily get data from field (str): the field name """ super().__init__(parent) self._source_model = source_model self._field = field self._filter = LazyFilterWidget(self, source_model, show_empty=show_empty) self._filter_action = QWidgetAction(parent) self._filter_action.setDefaultWidget(self._filter) self.addAction(self._filter_action) self._menu_data = dict() # Maps value to set of (db map, entity_class id, item id) self._inv_menu_data = dict() # Maps tuple (db map, entity_class id, item id) to value self.connect_signals() self.aboutToShow.connect(self._filter.set_model) self._source_model.refreshed.connect(self._handle_source_model_refreshed)
def context_menu(self): """Add context menu triggered by right click The two purpose is to delete the column and change tile color """ menu = QMenu(self) for color_name in TILE_STYLE: label = QLabel(color_name, self) label.setStyleSheet(MENU_STYLE[color_name]) action = QWidgetAction(self) action.setDefaultWidget(label) action.triggered.connect( partial(self.color_change, color=color_name)) menu.addAction(action) return menu
def create_menu(self): self.menu = QMenu(self) # Enable theme, uncomment: self.menu.setStyleSheet(appStyle) self.menu.setCursor(QtCore.Qt.PointingHandCursor) tt1 = self.menu.addAction('Tooltip 1') tt1.setToolTip('t1') tt2 = self.menu.addAction('Tooltip 2') tt2.setToolTip('t2') tt3 = self.menu.addAction('Tooltip 3') tt3.setWhatsThis('setWhatsThis') tt3.setIconText('q') tt3.iconText() # custom style label text = QLabel("Label with custom text", self) text.setProperty('class', 'singlestyle') styleItem = QWidgetAction(self) styleItem.setDefaultWidget(text) styleItem.setProperty('class', 'singlestyle') tt4 = self.menu.addAction(styleItem) # tt4.setProperty('class', 'singlestyle') # tt4.Priority # tt4.setStyleSheet("QLabel { color: rgb(50, 50, 50); font-size: 11px; background-color: rgba(188, 188, 188, 50); border: 1px solid rgba(188, 188, 188, 250); }") self.menu.setToolTipsVisible(True) # self.menu.setIcon # self.menu.setwha(True) # self.menu.hovered.connect(lambda tt1= tt1, tt1()) # self.menu.keyPressEvent(self.keyPressEvent) # pos = tt3. self.menu.installEventFilter(self) # widgetRect = self.menu.mapToGlobal() p = (0, 0) # print(self.menu.mapToGlobal(0,0)) widgetRect = self.geometry() print(widgetRect) # tt2.hovered.connect(lambda tt2=self.tt2, tt2.tooltip()) tt3.hovered.connect(lambda pos=[self], parent=self.menu, index=2: self. show_toolTip(pos, parent, index))
class ParameterViewFilterMenu(FilterMenuBase): filterChanged = Signal(str, dict) def __init__(self, parent, source_model, field, show_empty=True): """ Args: parent (SpineDBEditor) source_model (CompoundParameterModel): a model to lazily get data from field (str): the field name """ super().__init__(parent) self._source_model = source_model self._field = field self._filter = LazyFilterWidget(self, source_model, show_empty=show_empty) self._filter_action = QWidgetAction(parent) self._filter_action.setDefaultWidget(self._filter) self.addAction(self._filter_action) self._menu_data = dict( ) # Maps value to set of (db map, entity_class id, item id) self._inv_menu_data = dict( ) # Maps tuple (db map, entity_class id, item id) to value self.connect_signals() self.aboutToShow.connect(self._filter.set_model) self._source_model.refreshed.connect( self._handle_source_model_refreshed) @Slot() def _handle_source_model_refreshed(self): """Updates the menu to only present values that are actually shown in the source model.""" accepted_identifiers = {(m.db_map, m.entity_class_id, m.item_id(i)) for m, i in self._source_model._row_map} accepted_values = { value for value, identifiers in self._menu_data.items() if identifiers.intersection(accepted_identifiers) } self.set_filter_accepted_values(accepted_values) def set_filter_accepted_values(self, accepted_values): self._filter._filter_model.set_base_filter( lambda x: x in accepted_values) def set_filter_rejected_values(self, rejected_values): self._filter._filter_model.set_base_filter( lambda x: x not in rejected_values) def _get_value_to_remove(self, action, db_map, db_item): if action not in ("remove", "update"): return None entity_class_id = db_item.get(self._source_model.entity_class_id_key) item_id = db_item["id"] identifier = (db_map, entity_class_id, item_id) old_value = self._inv_menu_data.pop(identifier, None) if old_value is None: return None old_items = self._menu_data[old_value] old_items.remove(identifier) if not old_items: del self._menu_data[old_value] return old_value def _get_value_to_add(self, action, db_map, db_item): if action not in ("add", "update"): return None entity_class_id = db_item.get(self._source_model.entity_class_id_key) item_id = db_item["id"] identifier = (db_map, entity_class_id, item_id) value = db_map.codename if self._field == "database" else db_item[ self._field] self._inv_menu_data[identifier] = value if value not in self._menu_data: self._menu_data[value] = {identifier} return value self._menu_data[value].add(identifier) def modify_menu_data(self, action, db_map, db_items): """Modifies data in the menu. Args: action (str): either 'add', 'remove', or 'update' db_map (DiffDatabaseMapping) db_items (list(dict)) """ values_to_add = list() values_to_remove = list() for db_item in db_items: to_remove = self._get_value_to_remove(action, db_map, db_item) to_add = self._get_value_to_add(action, db_map, db_item) if to_remove is not None: values_to_remove.append(to_remove) if to_add is not None: values_to_add.append(to_add) if values_to_remove: self.remove_items_from_filter_list(values_to_remove) if values_to_add: self.add_items_to_filter_list(values_to_add) def _build_auto_filter(self, valid_values): """ Builds the auto filter given valid values. Args: valid_values (Sequence): Values accepted by the filter. Returns: dict: mapping db_map, to entity_class_id, to set of accepted parameter_value/definition ids """ if not self._filter.has_filter(): return {} # All-pass if not valid_values: return None # You shall not pass auto_filter = {} for value in valid_values: for db_map, entity_class_id, item_id in self._menu_data[value]: auto_filter.setdefault(db_map, {}).setdefault(entity_class_id, set()).add(item_id) return auto_filter def emit_filter_changed(self, valid_values): """ Builds auto filter and emits signal. Args: valid_values (Sequence): Values accepted by the filter. """ auto_filter = self._build_auto_filter(valid_values) self.filterChanged.emit(self._field, auto_filter)
def item_clicked(self, item): context_menu = QMenu(self) browser_item = QWidgetAction(context_menu) browser_item.setText("Open exploit-db") browser_item.setIcon(QIcon("assets/spider.png")) context_menu.addAction(browser_item) remove_item = QWidgetAction(context_menu) remove_item.setText("Remove Line") remove_item.setIcon(QIcon("assets/delete.png")) context_menu.addAction(remove_item) close_item = QWidgetAction(context_menu) close_item.setText("Close") close_item.setIcon(QIcon("assets/close.png")) context_menu.addAction(close_item) action = context_menu.exec_(QCursor.pos()) if action == browser_item: if os.getuid() == 0: os.setuid(1000) if item.column(): webbrowser.open( "https://www.exploit-db.com/search?q=" + item.data(), "--no-sandbox") else: webbrowser.open( "https://www.exploit-db.com/search?q=" + self.table.item(item.row(), 1).text(), "--no-sandbox", ) elif action == remove_item: self.remove_item(item.row())
self.slider.setMinimum(val) def setMax(self, val): self.slider.setMaximum(val) if __name__ == "__main__": app = QApplication() menu = QMenu() demo = MenuSlider("Demo slider") demo.setMin(-1) def cb(value): print(value) # print(demo.value()) # demo.label.setText(str(demo.value())) demo.connectvalueChanged(cb) menu.addAction("test") menu.addAction(demo) # Insert a custom widget into the menu lb = QWidgetAction(None) lbl = QLabel('Static text') lb.setDefaultWidget(lbl) menu.addAction(lb) menu.exec_()
def set_menu(self): # Exit QWidgetAction exit_item = QWidgetAction(self.about_menu) exit_item.setText("Exit") exit_item.setShortcut(QKeySequence.Quit) exit_item.setIcon(QIcon("assets/exit.png")) exit_item.triggered.connect(self.exit_app) self.file_menu.addAction(exit_item) # About QWidgetAction about_item = QWidgetAction(self.about_menu) about_item.setText("About") about_item.setShortcut(QKeySequence.FindNext) about_item.setIcon(QIcon("assets/gitlab.png")) about_item.triggered.connect(self.open_about_box) self.about_menu.addAction(about_item)
class MainWindow(QMainWindow, QWidget): def __init__(self): super().__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) self.sql = None self.filter = [[ "Файлы баз данных (*.db *.sdb *.sqlite *.db3 *.s3db *.sqlite3 *.sl3 *.db2 *.s2db *.sqlite2 " "*.sl2)" ], ["Все файлы (*)"]] self.action_widgets = [] self.filename = None self.action_4 = QAction("Выход") icon_000 = QIcon('ico/exit_closethesession_close_6317.ico') self.action_4.setIcon(icon_000) self.ui.menuFile.addAction(self.action_4) self.action_4.triggered.connect(self.exit) self.ui.action.triggered.connect(self.openFile) self.ui.action_2.triggered.connect(self.newFile) self.ui.action_3.triggered.connect(self.saveFile) self.action_widgets.append(self.ui.action_3) self.ui.menuFile.setTitle('Файл') toolbar = QToolBar() self.addToolBar(Qt.TopToolBarArea, toolbar) toolbar.setMovable(False) self.open_new_file = QWidgetAction(self.ui.menubar) icon01 = QIcon('ico/catalog_open.ico') self.open_new_file.setIcon(icon01) self.open_new_file.setToolTip('Открыть каталог') toolbar.addAction(self.open_new_file) self.open_new_file.triggered.connect(self.openFile) self.create_catalog = QWidgetAction(self.ui.menubar) icon03 = QIcon('ico/new-file_40454.ico') self.create_catalog.setIcon(icon03) self.create_catalog.setToolTip('Создать каталог') toolbar.addAction(self.create_catalog) self.create_catalog.triggered.connect(self.newFile) self.save_file = QWidgetAction(self.ui.menubar) icon02 = QIcon('ico/save_14949.ico') self.save_file.setIcon(icon02) self.save_file.setToolTip('Сохранить изменения') toolbar.addAction(self.save_file) self.save_file.triggered.connect(self.saveFile) self.action_widgets.append(self.save_file) self.search = QWidgetAction(self.ui.menubar) icon1 = QIcon('ico/android-search_icon-icons.com_50501.ico') self.search.setIcon(icon1) self.search.setToolTip('Найти запись') toolbar.addAction(self.search) self.search.triggered.connect(self.bookSearch) self.action_widgets.append(self.search) self.add_table_row = QWidgetAction(self.ui.menubar) icon2 = QIcon('ico/add-book_icon-icons.com_71795.ico') self.add_table_row.setIcon(icon2) self.add_table_row.setToolTip('Добавить запись') toolbar.addAction(self.add_table_row) self.add_table_row.triggered.connect(self.addRecord) self.action_widgets.append(self.add_table_row) self.del_table_row = QWidgetAction(self.ui.menubar) icon3 = QIcon('ico/open-book-with-minus-sign_icon-icons.com_70432.ico') self.del_table_row.setIcon(icon3) self.del_table_row.setToolTip('Удалить запись') toolbar.addAction(self.del_table_row) self.del_table_row.triggered.connect(self.removeRecord) self.action_widgets.append(self.del_table_row) self.clean_catalog = QWidgetAction(self.ui.menubar) icon4 = QIcon('ico/delete_4219.ico') self.clean_catalog.setIcon(icon4) self.clean_catalog.setToolTip('Очистить каталог') toolbar.addAction(self.clean_catalog) self.clean_catalog.triggered.connect(self.cleanCatalog) self.action_widgets.append(self.clean_catalog) self.undo_action = QWidgetAction( self.ui.menubar ) # TODO: Не отменяет добавление, удаление и очистку записей icon5 = QIcon('ico/undolinear_106178.ico') self.undo_action.setIcon(icon5) self.undo_action.setToolTip('Отмена действия') toolbar.addAction(self.undo_action) self.undo_action.triggered.connect(self.undoAction) self.action_widgets.append(self.undo_action) self.refresh_catalog = QWidgetAction(self.ui.menubar) icon6 = QIcon('ico/vcsupdaterequired_93493.ico') self.refresh_catalog.setIcon(icon6) self.refresh_catalog.setToolTip('Обновить') toolbar.addAction(self.refresh_catalog) self.refresh_catalog.triggered.connect(self.refresh) self.action_widgets.append(self.refresh_catalog) self.close_catalog = QWidgetAction(self.ui.menubar) icon7 = QIcon('ico/action_exit_close_remove_13915.ico') self.close_catalog.setIcon(icon7) self.close_catalog.setToolTip('Закрыть каталог') toolbar.addAction(self.close_catalog) self.close_catalog.triggered.connect(self.catalogClose) self.action_widgets.append(self.close_catalog) self.actionwidgetsOff() @classmethod def empty_widget(cls): """ Метод для создания пустого Виджета :return: empty_widget """ empty_widget = QWidget() return empty_widget def actionwidgetsOn(self): """ Метод для активации Action-виджетов :return: None """ for i in self.action_widgets: i.setEnabled(True) def actionwidgetsOff(self): """ Метод для деактивации Action-виджетов :return: None """ for i in self.action_widgets: i.setEnabled(False) def confirmAction(self): """ Метод для подтверждения выбранного действия :return: str(result) """ result = QMessageBox.question( None, "Подтверждение выбора", "Вы действительно хотите вьполнить действие?", buttons=QMessageBox.Yes | QMessageBox.No, defaultButton=QMessageBox.Yes) return str(result) @Slot() def openFile(self): """ Слот для подключения каталога :return: None """ dialog = QFileDialog.getOpenFileName( caption="Открыть каталог", dir=str(os.path.abspath("main.py")), filter=f"{self.filter[0]};;{self.filter[1]}", selectedFilter=f"{self.filter[0]}") if len(str(dialog[0])) != 0: if str(dialog[0]).split(".")[1] not in ('db', 'sdb', 'sqlite', 'db3', 's3db', 'sqlite3', 'sl3', 'db2', 's2db', 'sqlite2', 'sl2'): QMessageBox.information(None, "Предупреждение", "Данный тип файлов не поддерживается", buttons=QMessageBox.Ok, defaultButton=QMessageBox.Ok) else: self.filename = str(dialog[0]) self.sql = SQLite(self.filename) widget = self.sql.on() self.setCentralWidget(widget) self.resize(widget.width(), widget.height()) self.actionwidgetsOn() @Slot() def newFile(self): """ Слот для создания нового каталога :return: None """ dialog = QFileDialog.getSaveFileName( caption="Создать каталог", dir=str(os.path.abspath("main.py")), filter=f"Data base(*.db);;{self.filter[1]}", selectedFilter=f"Data base(*.db)") if len(str(dialog[0])) == 0: QMessageBox.information(None, "Предупреждение", "Введите название файла", buttons=QMessageBox.Ok, defaultButton=QMessageBox.Ok) else: conn = sqlite3.connect(str(dialog[0])) cursor = conn.cursor() cursor.execute( """CREATE TABLE books (Название_книги text, Автор text, Год_выпуска text, Жанр text, Статус text)""" ) conn.commit() conn.close() self.filename = str(dialog[0]) self.sql = SQLite(self.filename) widget = self.sql.on() self.setCentralWidget(widget) self.resize(widget.width(), widget.height()) self.actionwidgetsOn() @staticmethod def lower_func(string: str): return string.lower() @Slot() def bookSearch(self): # TODO: не работает поиск, если не совпадает регистр """ Слот для поиска информации в каталоге :return: None """ valid = False tip_text = None while not valid: s, ok = QInputDialog.getText(None, "Окно поиска", "Найти", text=tip_text) tip_text = s if ok: # self.sql.conn.create_function("mylower", 1, MainWindow.lower_func) # s = s.lower() self.sql.model.setFilter(f"Название_книги LIKE '%{s}%' " f"OR Автор LIKE '%{s}%' " f"OR Год_выпуска LIKE '%{s}%' " f"OR Жанр LIKE '%{s}%' " f"OR Статус LIKE '%{s}%'") self.sql.model.select() else: self.refresh() valid = True @Slot() def addRecord(self): """ Слот для добавления записи в каталог :return: None """ self.sql.model.insertRow(self.sql.model.rowCount()) self.sql.model.submitAll() @Slot() def removeRecord(self): """ Слот для удаления записи из каталога :return: None """ result = self.confirmAction() if result.split(".")[-1] == "Yes": if not self.sql.tableView.selectedIndexes(): QMessageBox.information(None, "Предупреждение", "Выберите запись для удаления", buttons=QMessageBox.Ok, defaultButton=QMessageBox.Ok) else: self.sql.model.removeRow( self.sql.tableView.currentIndex().row()) self.sql.model.submitAll() self.sql.model.select() @Slot() def catalogClose(self): """ Слот для закрытия каталога :return: None """ result = self.confirmAction() if result.split(".")[-1] == "Yes": self.sql.db.close() self.setCentralWidget(MainWindow.empty_widget()) self.actionwidgetsOff() @Slot() def undoAction(self): """ Слот для отмены выполненных изменений :return: None """ self.sql.model.revertAll() @Slot() def refresh(self): """ Слот для обновления вывода на экран содержимого каталога :return: None """ self.sql.model.submitAll() self.sql.db.close() self.sql = SQLite(self.filename) widget = self.sql.on() self.setCentralWidget(widget) self.resize(widget.width(), widget.height()) @Slot() def cleanCatalog(self): """ Слот для очистки каталога от записей :return: None """ datas = None result = self.confirmAction() if result.split(".")[-1] == "Yes": for i in range(self.sql.model.rowCount() - 1, -1, -1): datas = self.sql.model.removeRow(i) self.sql.model.submitAll() self.sql.model.select() if datas is True: QMessageBox.information(None, "Информационное сообщение", "Каталог успешно очищен", buttons=QMessageBox.Ok, defaultButton=QMessageBox.Ok) @Slot() def saveFile(self): """ Слот для сохранения изменений в каталоге :return: None """ self.sql.model.submitAll() @Slot() def exit(self): QApplication.quit()
def __init__(self, parent): """Initialize class.""" super().__init__(parent) self.auto_filter = dict() # Layout self.all_item_model = AutoFilterMenuAllItemModel(self) self.value_item_model = AutoFilterMenuValueItemModel(self) self.text_filter = QLineEdit(self) self.text_filter.setPlaceholderText("Search...") self.text_filter.setClearButtonEnabled(True) self.all_item_view = AutoFilterMenuView(self) self.value_item_view = AutoFilterMenuView(self) self.all_item_view.setModel(self.all_item_model) self.value_item_view.setModel(self.value_item_model) text_filter_action = QWidgetAction(self) text_filter_action.setDefaultWidget(self.text_filter) all_item_view_action = QWidgetAction(self) all_item_view_action.setDefaultWidget(self.all_item_view) value_item_view_action = QWidgetAction(self) value_item_view_action.setDefaultWidget(self.value_item_view) self.addAction(text_filter_action) self.addAction(all_item_view_action) self.addAction(value_item_view_action) ok_action = self.addAction("Ok") self.text_filter.textEdited.connect(self.value_item_model.set_filter_reg_exp) ok_action.triggered.connect(self._handle_ok_action_triggered) self.all_item_model.checked_state_changed.connect(self.value_item_model.set_all_items_checked_state) self.value_item_model.all_checked_state_changed.connect(self.all_item_model.set_checked_state) self.aboutToShow.connect(self._fix_geometry)
def __init__(self): super().__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) self.sql = None self.filter = [[ "Файлы баз данных (*.db *.sdb *.sqlite *.db3 *.s3db *.sqlite3 *.sl3 *.db2 *.s2db *.sqlite2 " "*.sl2)" ], ["Все файлы (*)"]] self.action_widgets = [] self.filename = None self.action_4 = QAction("Выход") icon_000 = QIcon('ico/exit_closethesession_close_6317.ico') self.action_4.setIcon(icon_000) self.ui.menuFile.addAction(self.action_4) self.action_4.triggered.connect(self.exit) self.ui.action.triggered.connect(self.openFile) self.ui.action_2.triggered.connect(self.newFile) self.ui.action_3.triggered.connect(self.saveFile) self.action_widgets.append(self.ui.action_3) self.ui.menuFile.setTitle('Файл') toolbar = QToolBar() self.addToolBar(Qt.TopToolBarArea, toolbar) toolbar.setMovable(False) self.open_new_file = QWidgetAction(self.ui.menubar) icon01 = QIcon('ico/catalog_open.ico') self.open_new_file.setIcon(icon01) self.open_new_file.setToolTip('Открыть каталог') toolbar.addAction(self.open_new_file) self.open_new_file.triggered.connect(self.openFile) self.create_catalog = QWidgetAction(self.ui.menubar) icon03 = QIcon('ico/new-file_40454.ico') self.create_catalog.setIcon(icon03) self.create_catalog.setToolTip('Создать каталог') toolbar.addAction(self.create_catalog) self.create_catalog.triggered.connect(self.newFile) self.save_file = QWidgetAction(self.ui.menubar) icon02 = QIcon('ico/save_14949.ico') self.save_file.setIcon(icon02) self.save_file.setToolTip('Сохранить изменения') toolbar.addAction(self.save_file) self.save_file.triggered.connect(self.saveFile) self.action_widgets.append(self.save_file) self.search = QWidgetAction(self.ui.menubar) icon1 = QIcon('ico/android-search_icon-icons.com_50501.ico') self.search.setIcon(icon1) self.search.setToolTip('Найти запись') toolbar.addAction(self.search) self.search.triggered.connect(self.bookSearch) self.action_widgets.append(self.search) self.add_table_row = QWidgetAction(self.ui.menubar) icon2 = QIcon('ico/add-book_icon-icons.com_71795.ico') self.add_table_row.setIcon(icon2) self.add_table_row.setToolTip('Добавить запись') toolbar.addAction(self.add_table_row) self.add_table_row.triggered.connect(self.addRecord) self.action_widgets.append(self.add_table_row) self.del_table_row = QWidgetAction(self.ui.menubar) icon3 = QIcon('ico/open-book-with-minus-sign_icon-icons.com_70432.ico') self.del_table_row.setIcon(icon3) self.del_table_row.setToolTip('Удалить запись') toolbar.addAction(self.del_table_row) self.del_table_row.triggered.connect(self.removeRecord) self.action_widgets.append(self.del_table_row) self.clean_catalog = QWidgetAction(self.ui.menubar) icon4 = QIcon('ico/delete_4219.ico') self.clean_catalog.setIcon(icon4) self.clean_catalog.setToolTip('Очистить каталог') toolbar.addAction(self.clean_catalog) self.clean_catalog.triggered.connect(self.cleanCatalog) self.action_widgets.append(self.clean_catalog) self.undo_action = QWidgetAction( self.ui.menubar ) # TODO: Не отменяет добавление, удаление и очистку записей icon5 = QIcon('ico/undolinear_106178.ico') self.undo_action.setIcon(icon5) self.undo_action.setToolTip('Отмена действия') toolbar.addAction(self.undo_action) self.undo_action.triggered.connect(self.undoAction) self.action_widgets.append(self.undo_action) self.refresh_catalog = QWidgetAction(self.ui.menubar) icon6 = QIcon('ico/vcsupdaterequired_93493.ico') self.refresh_catalog.setIcon(icon6) self.refresh_catalog.setToolTip('Обновить') toolbar.addAction(self.refresh_catalog) self.refresh_catalog.triggered.connect(self.refresh) self.action_widgets.append(self.refresh_catalog) self.close_catalog = QWidgetAction(self.ui.menubar) icon7 = QIcon('ico/action_exit_close_remove_13915.ico') self.close_catalog.setIcon(icon7) self.close_catalog.setToolTip('Закрыть каталог') toolbar.addAction(self.close_catalog) self.close_catalog.triggered.connect(self.catalogClose) self.action_widgets.append(self.close_catalog) self.actionwidgetsOff()
def item_clicked(self, item): context_menu = QMenu(self) browser_item = QWidgetAction(context_menu) browser_item.setText("Open in Browser") browser_item.setIcon(QIcon("assets/browser.png")) context_menu.addAction(browser_item) remove_item = QWidgetAction(context_menu) remove_item.setText("Remove Line") remove_item.setIcon(QIcon("assets/delete.png")) context_menu.addAction(remove_item) close_item = QWidgetAction(context_menu) close_item.setText("Close") close_item.setIcon(QIcon("assets/close.png")) context_menu.addAction(close_item) action = context_menu.exec_(QCursor.pos()) if action == browser_item: if os.getuid() == 0: os.setuid(1000) if item.column(): webbrowser.open(item.data()) else: webbrowser.open(self.table.item(item.row(), 1).text()) elif action == remove_item: self.remove_item(item.row())