def _open_color_picker(self): init_color = self._cosmetic_patches.hud_color color = QColorDialog.getColor(QColor(*init_color)) if color.isValid(): color_tuple = (color.red(), color.green(), color.blue()) self._cosmetic_patches = dataclasses.replace( self._cosmetic_patches, hud_color=color_tuple) self._update_color_squares()
def _open_color_picker(self): init_color = self._cosmetic_patches.hud_color color = QColorDialog.getColor(QColor(*init_color)) if color.isValid(): color_tuple = (color.red(), color.green(), color.blue()) estimated_ingame_alpha = max(color_tuple) if estimated_ingame_alpha < 150: QMessageBox.warning(self, "Dangerous preset", ( "Be careful, desaturated colors like this one tend to produce a transparent HUD.\n" "Use at your own risk.")) self._cosmetic_patches = dataclasses.replace( self._cosmetic_patches, hud_color=color_tuple) self._update_color_squares()
def onClick(self): colorDialog = QColorDialog(self.color) colorDialog.setOption(QColorDialog.ShowAlphaChannel) colorDialog.show() def colorSelected(color): self.color = color self.styleButton() if self.on_change: self.on_change(self.color) colorDialog.currentColorChanged.connect(colorSelected) self.color_dialog = colorDialog
def show_color_dialog(): col = QColorDialog.getColor() if col.isValid(): SETTINGS.setValue('color', col.name())
def _init_color_picker(self): _cp = QColorDialog() _cp.currentColorChanged.connect(self._handle_color_picker_changed) return _cp
def __init__(self): super(MainWindow, self).__init__() # Załadowanie layoutu [Modyfikować tylko w Designerze!]: self.ui = Ui_MainWindow() self.ui.setupUi(self) # Ustawienie kilku parametrów aplikacji self.setWindowTitle("Paint Application") self.setWindowIcon(QIcon("../Icons/main_icon.png")) self.ui.actionselect.setChecked(True) self.unsaved_changes = False # GraphicItemModel i listView self.gim = GraphicItemModel() self.ui.listView.setModel(self.gim) # Scena self.scene = QGraphicsScene() # Widok - utworzenie, połączenie z widokiem, dodanie do okienka aplikacji self.graphicsView = CustomQGraphicsView(self.scene, self.centralWidget(), self.gim) self.graphicsView.setObjectName(u"graphicsView") self.graphicsView.setMinimumSize(QSize(250, 250)) self.ui.gridLayout.addWidget(self.graphicsView, 0, 0, 1, 1) # Dialogi: # PrePickerDialog - wyświetlanie dialogu przed wyborem koloru (dla brush lub pen) self.color_picker_decide = PrePickerDialog() # ColorDialog - wybór koloru, dialog wyświetlany po PrePickerDialog self.color_picker_dialog = QColorDialog() # UnsavedChangesDialog - wyświetalnie dialogu np. po "Quit" lub "New" gdy są niezapisane zmiany self.unsaved_changes_dialog = UnsavedChangesDialog() # AboutDialog - wyświetalnie dialogu z informacjami o aplikacji self.about_dialog = AboutDialog() # AboutDialog - wyświetalnie dialogu z informacjami o nawigacji self.navigation_dialog = NavigationDialog() # ItemsInputOutput - menadżer zapisu i odczytu plików zawierających figury self.reader_writer = ItemsInputOutput(self.scene) # Powiązanie sygnałów ze slotami self.ui.actionNew.triggered.connect(self.slot_menu_new) self.ui.actionExport.triggered.connect(self.slot_menu_export) self.ui.actionSave.triggered.connect(self.slot_menu_save) self.ui.actionOpen.triggered.connect(self.slot_menu_open) self.ui.actionQuit.triggered.connect(self.slot_menu_quit) self.ui.actionAbout.triggered.connect(self.slot_menu_about) self.ui.actionNavigation.triggered.connect(self.slot_menu_navigation) self.ui.actionselect.triggered.connect(self.slot_trigger_select) self.ui.actionrectangle.triggered.connect(self.slot_trigger_rectangle) self.ui.actiontriangle.triggered.connect(self.slot_trigger_triangle) self.ui.actionellipse.triggered.connect(self.slot_trigger_ellipse) self.ui.actionline.triggered.connect(self.slot_trigger_line) self.ui.actionpolygon.triggered.connect(self.slot_trigger_polygon) self.ui.actionpicker.triggered.connect(self.slot_trigger_picker) self.ui.actionWidth.triggered.connect(self.slot_trigger_line_width) self.ui.lineEdit.textEdited.connect(self.slot_text_edited) self.color_picker_dialog.colorSelected.connect( self.slot_color_selected) self.gim.renamed.connect(self.unsaved_changes_detected) self.graphicsView.changed.connect(self.unsaved_changes_detected)
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() # Załadowanie layoutu [Modyfikować tylko w Designerze!]: self.ui = Ui_MainWindow() self.ui.setupUi(self) # Ustawienie kilku parametrów aplikacji self.setWindowTitle("Paint Application") self.setWindowIcon(QIcon("../Icons/main_icon.png")) self.ui.actionselect.setChecked(True) self.unsaved_changes = False # GraphicItemModel i listView self.gim = GraphicItemModel() self.ui.listView.setModel(self.gim) # Scena self.scene = QGraphicsScene() # Widok - utworzenie, połączenie z widokiem, dodanie do okienka aplikacji self.graphicsView = CustomQGraphicsView(self.scene, self.centralWidget(), self.gim) self.graphicsView.setObjectName(u"graphicsView") self.graphicsView.setMinimumSize(QSize(250, 250)) self.ui.gridLayout.addWidget(self.graphicsView, 0, 0, 1, 1) # Dialogi: # PrePickerDialog - wyświetlanie dialogu przed wyborem koloru (dla brush lub pen) self.color_picker_decide = PrePickerDialog() # ColorDialog - wybór koloru, dialog wyświetlany po PrePickerDialog self.color_picker_dialog = QColorDialog() # UnsavedChangesDialog - wyświetalnie dialogu np. po "Quit" lub "New" gdy są niezapisane zmiany self.unsaved_changes_dialog = UnsavedChangesDialog() # AboutDialog - wyświetalnie dialogu z informacjami o aplikacji self.about_dialog = AboutDialog() # AboutDialog - wyświetalnie dialogu z informacjami o nawigacji self.navigation_dialog = NavigationDialog() # ItemsInputOutput - menadżer zapisu i odczytu plików zawierających figury self.reader_writer = ItemsInputOutput(self.scene) # Powiązanie sygnałów ze slotami self.ui.actionNew.triggered.connect(self.slot_menu_new) self.ui.actionExport.triggered.connect(self.slot_menu_export) self.ui.actionSave.triggered.connect(self.slot_menu_save) self.ui.actionOpen.triggered.connect(self.slot_menu_open) self.ui.actionQuit.triggered.connect(self.slot_menu_quit) self.ui.actionAbout.triggered.connect(self.slot_menu_about) self.ui.actionNavigation.triggered.connect(self.slot_menu_navigation) self.ui.actionselect.triggered.connect(self.slot_trigger_select) self.ui.actionrectangle.triggered.connect(self.slot_trigger_rectangle) self.ui.actiontriangle.triggered.connect(self.slot_trigger_triangle) self.ui.actionellipse.triggered.connect(self.slot_trigger_ellipse) self.ui.actionline.triggered.connect(self.slot_trigger_line) self.ui.actionpolygon.triggered.connect(self.slot_trigger_polygon) self.ui.actionpicker.triggered.connect(self.slot_trigger_picker) self.ui.actionWidth.triggered.connect(self.slot_trigger_line_width) self.ui.lineEdit.textEdited.connect(self.slot_text_edited) self.color_picker_dialog.colorSelected.connect( self.slot_color_selected) self.gim.renamed.connect(self.unsaved_changes_detected) self.graphicsView.changed.connect(self.unsaved_changes_detected) # Sloty dla sygnałów z akcji menu-bara def slot_menu_new(self): if self.unsaved_changes: if not self.unsaved_changes_dialog.exec_(): return self.scene.clear() self.unsaved_changes = False self.gim.remove_all_rows() def slot_menu_export(self): image = QImage(100, 100, QImage.Format_RGB32) painter = QPainter(image) painter.setRenderHint(QPainter.Antialiasing) self.scene.render(painter) image.save("saved_image.png") def slot_menu_save(self): file_name: tuple = QFileDialog.getSaveFileName( self, "Choose file with shapes to save", "", "Data (*.txt)") self.reader_writer.save_items(file_name[0], self.gim) def slot_menu_open(self): file_name: tuple = QFileDialog.getOpenFileName( self, "Choose file with shapes to load", "", "Data (*.txt)") self.reader_writer.load_items(file_name[0], self.gim) def slot_menu_quit(self): if self.unsaved_changes: if not self.unsaved_changes_dialog.exec_(): return QApplication.quit() def slot_menu_about(self): self.about_dialog.exec_() def slot_menu_navigation(self): self.navigation_dialog.exec_() # Sloty dla sygnałów z akcji tool-bara def slot_trigger_select(self): self.graphicsView.actual_selection = self.graphicsView.Selection.SELECT def slot_trigger_rectangle(self): self.graphicsView.actual_selection = self.graphicsView.Selection.RECTANGLE def slot_trigger_triangle(self): self.graphicsView.actual_selection = self.graphicsView.Selection.TRIANGLE def slot_trigger_ellipse(self): self.graphicsView.actual_selection = self.graphicsView.Selection.ELLIPSE def slot_trigger_line(self): self.graphicsView.actual_selection = self.graphicsView.Selection.LINE def slot_trigger_polygon(self): self.graphicsView.actual_selection = self.graphicsView.Selection.POLYGON def slot_trigger_picker(self): if self.color_picker_decide.exec_(): self.color_picker_dialog.show() def slot_trigger_line_width(self): width = QInputDialog.getDouble( self, "Width selection", "Please pass decimal value from range 0.01 to 20.00 <br /> with maximally " "2 decimal places", self.graphicsView.actual_pen.width(), 0.01, 20.00, 2, Qt.WindowFlags(), 1.0) if width[1]: self.graphicsView.actual_pen.setWidthF(width[0]) # Sloty dla pozostałych sygnałów def slot_color_selected(self): if self.color_picker_decide.radioButton.isChecked(): self.graphicsView.actual_pen.setColor( self.color_picker_dialog.selectedColor()) else: self.graphicsView.actual_brush.setColor( self.color_picker_dialog.selectedColor()) def slot_text_edited(self, text: str): data: list[GraphicItemModel.Item] = self.gim.return_shapes() if len(text) == 0: for i in range(0, len(data)): self.ui.listView.setRowHidden(i, False) else: for i in range(0, len(data)): if not data[i].name.lower().startswith(text.lower()): self.ui.listView.setRowHidden(i, True) else: self.ui.listView.setRowHidden(i, False) def unsaved_changes_detected(self): self.unsaved_changes = True
def showDialog(self): col = QColorDialog.getColor() if col.isValid(): self.frm.setStyleSheet("QWidget {background-color: %s}" % col.name())
def update_color_name(self): self._savedColor = QColorDialog.getColor().name() self.__draw_selected_buttons()