def prepare_layout(self): hbox_layout = QHBoxLayout() hbox_layout.setAlignment(QtCore.Qt.AlignVCenter) self.setLayout(hbox_layout) # CIRCLE IMAGE tab_image = QFrame() tab_image.setObjectName("TabImage") tab_image.setFixedSize(35, 35) tab_image.setStyleSheet( "QFrame#TabImage {background-image: url(Resources/images/icons/icon-rounded.png);}" ) hbox_layout.addWidget(tab_image) # TEXT label = QLabel() label.setText(self.label_text) label.setFixedWidth(100) hbox_layout.addWidget(label) # ARROW IMAGE tab_image = QFrame() tab_image.setObjectName("ArrowImage") tab_image.setFixedSize(25, 25) tab_image.setStyleSheet( "QFrame#ArrowImage {background-image: url(Resources/images/icons/icon-arrow.png);}" ) hbox_layout.addWidget(tab_image)
def _create_pixel(self, color): """ [description] **Arguments:** :``color``: `[type]` [description] **Keword Arguments:** None **Returns:** :``[type]``: [description] **Author:** Chris Bruce, [email protected], 12/3/2018 """ pixel = QFrame() pixel.setFixedSize(QSize(self.pixel_size, self.pixel_size)) pixel.setFrameShape(QFrame.Box) pixel.setFrameShadow(QFrame.Raised) pixel.setLineWidth(0) pixel.setMidLineWidth(self.pixel_size / 8) pixel.setStyleSheet("background-color: rgb{}".format(color)) return pixel
def draw_boarder(parent, width, height): frame = QFrame() frame.setFixedSize(int(width), int(height)) frame.setFrameShape(QFrame.StyledPanel) frame.setLineWidth(2) frame.setContentsMargins(5, 5, 5, 5) parent.addWidget(frame) return frame
class DialogWindow(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): grid = QGridLayout() grid.setSpacing(10) col = QColor(0, 0, 0) self.btn = QPushButton('Dialog') # self.btn.move(20, 20) self.btn.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.btn.clicked.connect(self.showDialog) self.le = QLineEdit() self.frm = QFrame() self.frm.setStyleSheet("QWidget {background-color: %s}" % col.name()) self.frm.setFixedSize(200, 100) self.lbl = QLabel('Knowledge only matters') grid.addWidget(self.btn, 1, 0) grid.addWidget(self.le, 1, 1) grid.addWidget(self.lbl, 2, 0) grid.addWidget(self.frm) self.setLayout(grid) self.setGeometry(300, 300, 290, 180) self.setWindowTitle("Dialog") self.show() def showDialog(self): text, ok = QInputDialog.getText(self, 'Input Dialog', 'Ennter your name:') # The first string is a dialog title, # the second one is a message within the dialog. if ok: self.le.setText(str(text)) else: col = QColorDialog.getColor() if col.isValid(): self.frm.setStyleSheet("QWidget {background-color: %s}" % col.name()) else: font, ok = QFontDialog.getFont() if ok: self.lbl.setFont(font)
def set_new_pdf(self, files): """ Adds the files from the list onto the UI by creating the necessary buttons, layouts and Frames :param files: List of pdf names in the form of folder/filename.pdf :return: Nothing """ for file in files: self.pdf_files.append(file) # This layout is used to place the up/down button on top of each other up_down_layout = QVBoxLayout() up_button = QPushButton("\u2303") up_button.setFixedSize(self.move_button_size) down_button = QPushButton("\u2304") down_button.setFixedSize(self.move_button_size) up_button.clicked.connect(self.move_up) down_button.clicked.connect(self.move_down) self.up_button_list.append(up_button) self.down_button_list.append(down_button) up_down_layout.addWidget(up_button) up_down_layout.addWidget(down_button) up_down_layout.setSpacing(1) # The foldername isn't displayed on the label pdf_name = os.path.split(file)[1] label = QLabel(pdf_name) main_layout = QHBoxLayout() main_layout.setContentsMargins(0, 0, 0, 0) width = self.widgets.MERGE_LeftLayout.geometry().width() height = self.move_button_size.height() * 2 + 5 new_frame = QFrame() new_frame.setContentsMargins(0, 0, 0, 0) new_frame.setFixedSize(QSize(width, height)) new_frame.setLayout(main_layout) new_frame.setFrameStyle(QFrame.WinPanel | QFrame.Plain) self.frame_list.append(new_frame) main_layout.addLayout(up_down_layout) main_layout.addWidget(label) # because of spacer at the bottom self.widgets.MERGE_PDFsVLayout.insertWidget( len(self.up_button_list) - 1, new_frame)
def initUI(self): frame = QFrame(self) frame.setFrameShape(QFrame.Box) frame.setFrameShadow(QFrame.Sunken) frame.setAutoFillBackground(True) frame.setFixedSize(450, 500) frame.move(0, 0) label = QLabel(frame) label.setPixmap(QPixmap("Imagenes/siacle.jpg").scaled(447, 447, Qt.KeepAspectRatio, Qt.SmoothTransformation)) label.move(1, 1) botonConfigurar = QPushButton("Информация", frame) botonConfigurar.setFixedSize(430, 32) botonConfigurar.move(10, 457) botonConfigurar.clicked.connect(self.Configuracion)
def findText(self): def Find(): flag = None if r1.isChecked(): self.form_widget.tab.currentWidget().findFirst( l.text(), True, cs.isChecked(), True, False, False) flag = self.form_widget.tab.currentWidget().findNext() elif r2.isChecked(): flag = self.form_widget.tab.currentWidget().findFirst( l.text(), True, cs.isChecked(), True, False) if not flag: QMessageBox.information(self, 'TextPad', 'Match not found', QMessageBox.Ok, QMessageBox.Ok) d = QDialog(self) d.setWindowTitle('Find') d.setWindowIcon(QIcon('icon.png')) d.setFixedSize(300, 130) label = QLabel("What to find", d) label.move(10, 5) l = QLineEdit(d) l.move(100, 5) b1 = QPushButton("Find Next", d) b1.move(210, 5) b1.clicked.connect(Find) b2 = QPushButton("Cancel", d) b2.move(210, 35) b2.clicked.connect(d.close) cs = QCheckBox("Case sensitive", d) cs.move(10, 62) f = QFrame(d) f.setFixedSize(120, 40) f.move(120, 59) f.setToolTip('Direction') r1 = QRadioButton("Up", f) r1.move(5, 5) r2 = QRadioButton("Down", f) r2.setChecked(True) r2.move(55, 5) d.show()
def add_price_box(widget, title, box_width=307, box_height=37, space=28): frame = QFrame(widget) frame.setFixedSize(box_width, box_height) frame_layout = add_layout(frame, HORIZONTAL, space=space) button = add_button(frame) frame_layout.addWidget(button) box = QFrame(frame) frame_layout.addWidget(box) box_layout = add_layout(box, HORIZONTAL, l_m=9, r_m=25) title = add_label(box, title) box_layout.addWidget(title) spacer = QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Minimum) box_layout.addItem(spacer) value = add_label(box, "0 credit / Hr") box_layout.addWidget(value) return frame, box, button
class QLevelViewer(QWidget): onLevelClicked = pyqtSignal() def __init__(self, model: GameControllerModel, level_num=0, level_name=None, parent=QWidget): super(QWidget, self).__init__() self.model = model self.lblNumber = QLabel() self.lblName = QLabel() self.frame = QFrame() self.level_name = level_name self.level_num = level_num self._setupUI() self.changeLevel(level_num, level_name) self.isClickable = False self.setClickable(self.isClickable) def _getColorByLevel(self, level_name: str): if level_name == "intro": return (247, 181, 41) elif level_name == "normal": return (23, 107, 239) elif level_name == "heal": return (23, 156, 82) elif level_name == "boss": return (255, 62, 48) elif level_name == "final_boss": return (127, 0, 0) else: return (255, 255, 255) def _changeLevelColor(self): level_color = self._getColorByLevel(self.level_name) self.frame.setStyleSheet( "background-color: rgb({}, {}, {}); border-radius: 5px;".format( level_color[0], level_color[1], level_color[2])) def changeLevel(self, newlevel: int, level_name=None): self.level_num = newlevel if level_name is not None: self.level_name = level_name else: for i, v in self.model.getLevelsNames().items(): if i == newlevel: self.level_name = v break self.lblName.setText(self.level_name) self.lblNumber.setText(str(newlevel)) self._changeLevelColor() def onSelfClicked(self, event): self.onLevelClicked.emit() def setClickable(self, isClickable: bool): self.isClickable = isClickable self.updateClickableUi(self.isClickable) def updateClickableUi(self, can_click): self.lblNumber.blockSignals(not can_click) self.lblName.blockSignals(not can_click) self.frame.blockSignals(not can_click) if can_click: self.lblNumber.setCursor(QCursor(QtCore.Qt.PointingHandCursor)) self.lblName.setCursor(QCursor(QtCore.Qt.PointingHandCursor)) self.frame.setCursor(QCursor(QtCore.Qt.PointingHandCursor)) else: self.lblNumber.setCursor(QCursor(QtCore.Qt.ArrowCursor)) self.lblName.setCursor(QCursor(QtCore.Qt.ArrowCursor)) self.frame.setCursor(QCursor(QtCore.Qt.ArrowCursor)) def _setupUI(self): self.frame.setAttribute(QtCore.Qt.WA_StyledBackground, True) self.frame.setFixedSize(80, 80) self.frame.setGeometry(0, 0, 0, 0) self.frame.mousePressEvent = self.onSelfClicked font = QtGui.QFont() font.setPointSize(15) self.lblNumber.setFont(font) self.lblNumber.setAlignment(Qt.AlignCenter) self.lblNumber.mousePressEvent = self.onSelfClicked font_name = QtGui.QFont() font_name.setPointSize(15) self.lblName.setFont(font_name) self.lblName.setAlignment(QtCore.Qt.AlignCenter) self.lblName.mousePressEvent = self.onSelfClicked frame_lay = QVBoxLayout() frame_lay.addWidget(self.lblNumber) frame_lay.addWidget(self.lblName) self.frame.setLayout(frame_lay) fram_lay = QHBoxLayout() fram_lay.addWidget(self.frame) self.setLayout(fram_lay) self.model.engineStatechanged.connect(self.onPlayStateChanged) def onPlayStateChanged(self, newState: EngineState): self.updateClickableUi(self.isClickable and (not newState == EngineState.Playing))
def prepare_layout(self): vbox_main_layout = QVBoxLayout() vbox_main_layout.setAlignment(QtCore.Qt.AlignTop) vbox_main_layout.setContentsMargins(0, 0, 0, 0) vbox_main_layout.setSpacing(0) self.setLayout(vbox_main_layout) # TITLE BAR title_bar = QFrame() title_bar.setFixedHeight(24) vbox_main_layout.addWidget(title_bar) # TABS hbox_tab_layout = QHBoxLayout() hbox_tab_layout.setAlignment(QtCore.Qt.AlignLeft) vbox_main_layout.addLayout(hbox_tab_layout) tab_texts = ["Preparing", "Material", "File", "Layers", "Control", "Generation"] for tab_text in tab_texts: progress_tab = CTabPivot(tab_text) progress_tab.clicked.connect(self.tab_clicked) progress_tab.setFixedSize(200, 56) hbox_tab_layout.addWidget(progress_tab) hbox_tab_layout.addSpacing(1) # CONTENT VIEW content_frame = QFrame() content_frame.setFixedHeight(1080-56-24) hbox_content_layout = QHBoxLayout() hbox_content_layout.setAlignment(QtCore.Qt.AlignLeft) hbox_content_layout.setContentsMargins(0, 0, 12, 12) content_frame.setLayout(hbox_content_layout) vbox_main_layout.addWidget(content_frame) # LEFT MENU vbox_left_menu_layout = QVBoxLayout() vbox_left_menu_layout.setAlignment(QtCore.Qt.AlignVCenter) hbox_content_layout.addLayout(vbox_left_menu_layout) # for i in range(8): # left_menu_button = QFrame() # button_name = "LeftMenuButton" + str(i+1) # button_icon_path = "url(Resources/images/icons/icon-%d.png)" % (i+1) # left_menu_button.setObjectName(button_name) # left_menu_button.setFixedSize(48, 48) # left_menu_button.setStyleSheet("""QFrame#%s {background-image: %s;} # QFrame#%s:pressed {background-image: url(Resources/images/icons/icon-1.png) # """ % (button_name, button_icon_path, button_name)) # vbox_left_menu_layout.addWidget(left_menu_button) # vbox_left_menu_layout.addSpacing(1) for i in range(8): left_menu_button = QPushButton() button_name = "LeftMenuButton" + str(i+1) button_icon_path = "url(Resources/images/icons/icon-%d.png)" % (i+1) left_menu_button.setObjectName(button_name) left_menu_button.setFixedSize(48, 48) left_menu_button.setIconSize(QSize(46, 46)) left_menu_button.setStyleSheet("""QPushButton#%s {background-image: %s;} QPushButton#%s:pressed {background-image: %s;}""" % (button_name, button_icon_path, button_name, button_icon_path)) vbox_left_menu_layout.addWidget(left_menu_button) vbox_left_menu_layout.addSpacing(1) # GRAPH VIEW graph_frame = QFrame() graph_frame.setFixedSize(1600, 1080-56-24) hbox_content_layout.addWidget(graph_frame) # BUTTON button = QPushButton() button.setText("Generation") button.setFixedSize(200, 50) button.setStyleSheet("""QPushButton { background-color: orange; color: white; border-width: 2px; border-radius: 15px; padding: 4px; font-family: Comic Sans MS; font-size: 12px } QPushButton:pressed {background-color: rgb(200, 200, 200)}""") hbox_content_layout.addWidget(button, alignment = QtCore.Qt.AlignBottom)
def __init__(self, parent=None): QWidget.__init__(self, parent) self.interface_lng_val = parent.interface_lng_val self.con = parent.con self.full_dir = parent.full_dir self.par = parent flag = False if 'mirrorMeshDict_x' in self.con.tables(): flag = True query = QtSql.QSqlQuery() query.exec("SELECT * FROM mirrorMeshDict_x") if query.isActive(): query.first() name_list = [] value_list = [] while query.isValid(): name_res = query.value('name') value_res = query.value('value') name_list.append(name_res) value_list.append(value_res) query.next() self.data_reprint() main_lbl = QLabel() # planeType planeType_lbl = QLabel() planeType_hbox = QHBoxLayout() self.planeType_edit = QComboBox() self.planeType_edit.setFixedSize(150, 25) planeType_list = ["pointAndNormal", "demo"] self.planeType_edit.addItems(planeType_list) planeType_hbox.addWidget(planeType_lbl) planeType_hbox.addWidget(self.planeType_edit) #pointAndNormalDict pAND_lbl = QLabel() #point point_lbl = QLabel() self.x1 = QLineEdit() self.x1.setFixedSize(50, 25) self.y1 = QLineEdit() self.y1.setFixedSize(50, 25) self.z1 = QLineEdit() self.z1.setFixedSize(50, 25) point_hbox = QHBoxLayout() point_hbox.addWidget(point_lbl) point_hbox.addWidget(self.x1) point_hbox.addWidget(self.y1) point_hbox.addWidget(self.z1) #normal normal_lbl = QLabel() self.x2 = QLineEdit() self.x2.setFixedSize(50, 25) self.y2 = QLineEdit() self.y2.setFixedSize(50, 25) self.z2 = QLineEdit() self.z2.setFixedSize(50, 25) normal_hbox = QHBoxLayout() normal_hbox.addWidget(normal_lbl) normal_hbox.addWidget(self.x2) normal_hbox.addWidget(self.y2) normal_hbox.addWidget(self.z2) pAND_grid = QGridLayout() pAND_grid.addLayout(point_hbox, 0, 0, alignment=QtCore.Qt.AlignCenter) pAND_grid.addLayout(normal_hbox, 1, 0, alignment=QtCore.Qt.AlignCenter) pAND_frame = QFrame() pAND_frame.setFixedSize(250, 100) pAND_frame.setStyleSheet( open("./styles/properties_form_style.qss", "r").read()) pAND_frame.setFrameShape(QFrame.Panel) pAND_frame.setFrameShadow(QFrame.Sunken) pAND_frame.setLayout(pAND_grid) # planeTolerance planeTolerance_lbl = QLabel() self.planeTolerance_edit = QLineEdit() self.planeTolerance_edit.setFixedSize(150, 25) if flag == True: planeType_mas = self.planeType_edit.count() for i in range(planeType_mas): if self.planeType_edit.itemText(i) == value_list[0]: self.planeType_edit.setCurrentIndex(i) self.x1.setText(value_list[1].split()[0]) self.y1.setText(value_list[1].split()[1]) self.z1.setText(value_list[1].split()[2]) self.x2.setText(value_list[2].split()[0]) self.y2.setText(value_list[2].split()[1]) self.z2.setText(value_list[2].split()[2]) self.planeTolerance_edit.setText(value_list[3]) planeTolerance_grid = QGridLayout() planeTolerance_grid.addWidget(planeTolerance_lbl, 0, 0, alignment=QtCore.Qt.AlignCenter) planeTolerance_grid.addWidget(self.planeTolerance_edit, 0, 1, alignment=QtCore.Qt.AlignCenter) btnSave = QPushButton() btnSave.setFixedSize(80, 25) btnSave.clicked.connect(self.on_btnSave_clicked) buttons_hbox = QHBoxLayout() buttons_hbox.addWidget(btnSave) if self.interface_lng_val == 'Russian': btnSave.setText("Сохранить") main_lbl.setText("Укажите параметры плоскости") planeType_lbl.setText("planeType:") pAND_lbl.setText("pointAndNormalDict") point_lbl.setText("point:") normal_lbl.setText("normal:") planeTolerance_lbl.setText("planeTolerance:") elif self.interface_lng_val == 'English': btnSave.setText("Save") main_lbl.setText("Specify the parameters of the plane") planeType_lbl.setText("planeType:") pAND_lbl.setText("pointAndNormalDict") point_lbl.setText("point:") normal_lbl.setText("normal:") planeTolerance_lbl.setText("planeTolerance:") mMD_grid = QGridLayout() mMD_grid.addWidget(main_lbl, 0, 0, alignment=QtCore.Qt.AlignCenter) mMD_grid.addLayout(planeType_hbox, 1, 0, alignment=QtCore.Qt.AlignCenter) mMD_grid.addWidget(pAND_lbl, 2, 0, alignment=QtCore.Qt.AlignCenter) mMD_grid.addWidget(pAND_frame, 3, 0, alignment=QtCore.Qt.AlignCenter) mMD_grid.addLayout(planeTolerance_grid, 4, 0, alignment=QtCore.Qt.AlignCenter) mMD_grid.addLayout(buttons_hbox, 5, 0, alignment=QtCore.Qt.AlignCenter) mMD_grid.setRowStretch(6, 2) mMD_frame = QFrame() mMD_frame.setFixedSize(670, 510) mMD_frame.setStyleSheet( open("./styles/properties_form_style.qss", "r").read()) mMD_frame.setFrameShape(QFrame.Panel) mMD_frame.setFrameShadow(QFrame.Sunken) mMD_frame.setLayout(mMD_grid) mMD_vbox = QVBoxLayout() mMD_vbox.addWidget(mMD_frame) # ---------------------Размещение на форме всех компонентов-------------------------# form = QFormLayout() form.addRow(mMD_vbox) self.setLayout(form)
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.setFixedSize(800, 500) self.file = None but = QPushButton("Choose a directory with images", self) but.move(300, 20) but.setFixedSize(200, 25) but.clicked.connect(lambda x: self.get_data_path()) but.setFocusPolicy(Qt.NoFocus) self.left = QFrame(self) self.left.setFixedSize(200, 200) self.left.move(50, 150) self.left.setAutoFillBackground(False) self.left.setStyleSheet( "QFrame { background-color: transparent; background: url('green_ar.png') no-repeat left; background-size: 50px 50px;}" ) self.right = QFrame(self) self.right.setFixedSize(200, 200) self.right.move(550, 150) self.right.setAutoFillBackground(False) self.right.setStyleSheet( "QFrame { background-color: transparent; background: url('red_ar.png') no-repeat right; background-size: 50px 50px;}" ) self.img = QFrame(self) self.img.setFixedSize(200, 400) self.img.setFrameShadow(QFrame.Sunken) self.img.setFrameShape(QFrame.Panel) self.img.move(300, 50) self.img.setAutoFillBackground(False) self.show() def get_data_path(self): local_path = str( QFileDialog.getExistingDirectory(self, "Select Directory")) if len(local_path) == 0: return self.local_path = local_path true_path = path.join(self.local_path, 'true') false_path = path.join(self.local_path, 'false') os.makedirs(true_path) if not os.path.exists(true_path) else None os.makedirs(false_path) if not os.path.exists(false_path) else None self.change_file() def change_file(self): self.first = os.listdir(self.local_path)[0] self.file = path.join(self.local_path, self.first).replace("\\", "/") self.img.setStyleSheet( "QFrame { background-color: transparent; background: url('" + self.file + "') no-repeat center; background-size: 100px 100px;}") def move_car(self, is_car): try: os.rename( self.file, path.join(self.local_path, "true" if is_car else "false", self.first)) self.change_file() except: pass def keyPressEvent(self, event): if event.key() == Qt.Key_Left: self.move_car(True) elif event.key() == Qt.Key_Right: self.move_car(False)
def setupUi(self, Form, imglist): #self.setWindowTitle("Image Gallary") #self.setWindowFlags(Qt.MSWindowsFixedSizeDialogHint) #self.setFixedSize(682, 573) # ======================== WIDGETS =========================== framePrincipal = QFrame(Form) #framePrincipal.setFrameShape(QFrame.Box) #framePrincipal.setFrameShadow(QFrame.Sunken) #framePrincipal.setAutoFillBackground(True) #framePrincipal.setBackgroundRole(QPalette.Light) framePrincipal.setFixedSize(662, 503) framePrincipal.move(10, 10) frame = QFrame(framePrincipal) frame.setFixedSize(640, 480) frame.move(10, 10) self.labelImagen = QLabel(frame) self.labelImagen.setAlignment(Qt.AlignCenter) self.labelImagen.setGeometry(0, 0, 640, 480) # self.labelImagen.setScaledContents(True) self.labelImagenUno = QLabel(frame) self.labelImagenUno.setAlignment(Qt.AlignCenter) self.labelImagenUno.setGeometry(-650, 0, 640, 480) # =================== BOTONES (QPUSHBUTTON) ================== self.buttonCargar = QPushButton("Choose Image", Form) self.buttonCargar.setCursor(Qt.PointingHandCursor) self.buttonCargar.setFixedSize(325, 30) self.buttonCargar.move(10, 519) self.buttonEliminar = QPushButton("Delete Image", Form) self.buttonEliminar.setCursor(Qt.PointingHandCursor) self.buttonEliminar.setFixedSize(255, 30) self.buttonEliminar.move(345, 519) self.buttonAnterior = QPushButton("<", Form) self.buttonAnterior.setObjectName("Anterior") self.buttonAnterior.setToolTip("Imagen anterior") self.buttonAnterior.setCursor(Qt.PointingHandCursor) self.buttonAnterior.setFixedSize(30, 30) self.buttonAnterior.move(607, 519) self.buttonSiguiente = QPushButton(">", Form) self.buttonSiguiente.setObjectName("Siguiente") self.buttonSiguiente.setToolTip("Imagen siguiente") self.buttonSiguiente.setCursor(Qt.PointingHandCursor) self.buttonSiguiente.setFixedSize(30, 30) self.buttonSiguiente.move(642, 519) # ===================== CONECTAR SEÑALES ===================== self.buttonCargar.clicked.connect(self.Cargar) self.buttonEliminar.clicked.connect(self.Eliminar) self.buttonAnterior.clicked.connect(self.anteriorSiguiente) self.buttonSiguiente.clicked.connect(self.anteriorSiguiente) # Establecer los valores predeterminados self.position = int self.estadoAnterior, self.estadoSiguiente = False, False self.carpetaActual = QDir() self.imagenesCarpeta = [] self.imagenesCarpeta = imglist
class ViewsController(QMainWindow): """This class will handle all the views of the application. Responsible for showing the differnet views in a specific order depending on the input of the user. If the application is launched with a profile (configuration file), the main view of the application will be shown; otherwise, the title and the configuration views will be shown prior to the main view. """ home_singal = pyqtSignal() robot_select_signal = pyqtSignal() def __init__(self, parent, configuration, controller=None): """Constructor of the class. Arguments: parent {ui.gui.views_controller.ParentWindow} -- Parent of this. configuration {utils.configuration.Config} -- Configuration instance of the application Keyword Arguments: controller {utils.controller.Controller} -- Controller of the application (default: {None}) """ QMainWindow.__init__(self) self.parent = parent self.controller = controller self.configuration = configuration self.main_view = None self.thread_gui = ThreadGUI(self) self.thread_gui.daemon = True # self.home_singal.connect(self.show_title) # self.robot_select_signal.connect(self.show_robot_selection) def show_title(self): """Shows the title view""" title = TitleWindow(self.parent) title.switch_window.connect(self.show_robot_selection) self.parent.main_layout.addWidget(title) self.fadein_animation() def show_robot_selection(self): """Shows the robot selection view""" from views.robot_selection import RobotSelection delete_widgets_from(self.parent.main_layout) robot_selector = RobotSelection(self.parent) robot_selector.switch_window.connect(self.show_world_selection) self.parent.main_layout.addWidget(robot_selector, 0) self.fadein_animation() def show_world_selection(self): """Shows the world selection view""" from views.world_selection import WorldSelection delete_widgets_from(self.parent.main_layout) world_selector = WorldSelection(self.parent.robot_selection, self.configuration, self.parent) world_selector.switch_window.connect(self.show_layout_selection) self.parent.main_layout.addWidget(world_selector) self.fadein_animation() def show_layout_selection(self): """Show the layout configuration view""" delete_widgets_from(self.parent.main_layout) self.layout_selector = LayoutSelection(self.configuration, self.parent) self.layout_selector.switch_window.connect(self.show_main_view_proxy) self.parent.main_layout.addWidget(self.layout_selector) self.fadein_animation() def show_main_view_proxy(self): """Helper function to show the main view. Will close the parent window to create a new one""" # self.show_main_view(False) self.parent.close() def show_main_view(self, from_main): """Shows the main window depending on where the application comes from. If the from_main flag is true, the configuration comes from the previous GUI views. Otherwise, the configuration comes from a configuration file. Eitherway, the main view will be shown with the proper configuration. Arguments: from_main {bool} -- tells if the configuration comes from either configuration file or GUI. """ if not from_main: layout_configuration = self.layout_selector.get_config() delete_widgets_from(self.parent.main_layout) else: layout_configuration = None self.main_view = MainView(layout_configuration, self.configuration, self.controller, self.parent) self.parent.main_layout.addWidget(self.main_view) self.fadein_animation() self.start_thread() def start_thread(self): """Start the GUI refresing loop""" self.thread_gui.start() def fadein_animation(self): """Start a fadein animation for views transitions""" self.w = QFrame(self.parent) # self.parent.main_layout.addWidget(self.w, 0) self.w.setFixedSize(WIDTH, HEIGHT) self.w.setStyleSheet('background-color: rgba(51,51,51,1)') self.w.show() effect = QGraphicsOpacityEffect() self.w.setGraphicsEffect(effect) self.animation = QPropertyAnimation(effect, b"opacity") self.animation.setDuration(500) self.animation.setStartValue(1) self.animation.setEndValue(0) self.animation.start(QPropertyAnimation.DeleteWhenStopped) self.animation.finished.connect(self.fade_animation) def fade_animation(self): """Safe kill the animation""" self.w.close() del self.w del self.animation def update_gui(self): """Update the GUI. Called from the refresing loop thread""" while not self.parent.closing: if self.main_view: self.main_view.update_gui() time.sleep(0.1)
def __init__(self, parent, db_path, file_name): QWidget.__init__(self, parent) # Получаем рисунок и помещаем его в виджет con = sqlite3.connect(db_path) cur = con.cursor() sql_item_img_select = "SELECT item_img FROM nomenclature WHERE item_name = ?" cur.execute(sql_item_img_select, [file_name]) item_img = cur.fetchone() pix = QPixmap(item_img[0]) pix_mini = pix.scaled(350, 290, QtCore.Qt.KeepAspectRatio) img_lbl = QLabel() img_lbl.setPixmap(pix_mini) img_lbl_vbox = QVBoxLayout() img_lbl_vbox.addWidget(img_lbl) img_lbl_frame = QFrame() img_lbl_frame.setLayout(img_lbl_vbox) img_lbl_frame.setFixedSize(350, 290) # Получаем все данные для товара # -номер sql_item_numb_select = "SELECT item_numb FROM nomenclature WHERE item_name = ?" cur.execute(sql_item_numb_select, [file_name]) item_numb = cur.fetchone() # -название sql_item_name_select = "SELECT item_name FROM nomenclature WHERE item_name = ?" cur.execute(sql_item_name_select, [file_name]) item_name = cur.fetchone() # -ед.изм. sql_item_unit_select = "SELECT item_unit FROM nomenclature WHERE item_name = ?" cur.execute(sql_item_unit_select, [file_name]) item_unit = cur.fetchone() # -категория sql_item_cat_select = "SELECT item_cat FROM nomenclature WHERE item_name = ?" cur.execute(sql_item_cat_select, [file_name]) item_cat = cur.fetchone() # -количество sql_item_amount_select = "SELECT item_amount FROM items_positions WHERE item_name = ?" # -поставщики sql_item_sup_select = "SELECT DISTINCT supp FROM ro_orders WHERE name = ?" # Проверяем, есть ли товар в наличии и только тогда выводим количество # и поставщиков sql_item_cur_select = "SELECT DISTINCT name FROM ro_orders WHERE name = ?" cur.execute(sql_item_cur_select, [file_name]) item_cur = cur.fetchone() if item_cur is not None: cur.execute(sql_item_amount_select, [file_name]) item_amount = cur.fetchone() cur.execute(sql_item_sup_select, [file_name]) item_supp = cur.fetchall() suppliers_str = '' k = 1 for el in item_supp[0]: if k != len(item_supp): suppliers_str = suppliers_str + el + ',' else: suppliers_str = suppliers_str + el k = k + 1 item_amount_str = str(item_amount[0]) else: item_amount_str = 'Товар не в наличии' suppliers_str = 'Товар не в наличии' # Формируем таблицу item_card_table = QTableWidget() item_card_table.setRowCount(6) item_card_table.setColumnCount(1) item_card_table.horizontalHeader().hide() item_card_table.setFixedSize(210, 185) item_card_table.horizontalHeader().resizeSection(0, 125) #horizontal # столбец - номер item_card_table.verticalHeader().resizeSection(0, 30) item_card_table.verticalHeader().setSectionResizeMode( 0, QHeaderView.Fixed) item_card_table.verticalHeader().minimumSectionSize() column_1 = QTableWidgetItem() column_1.setText("№") item_card_table.setVerticalHeaderItem(0, column_1) item_card_table.verticalHeader().setStyleSheet("color: steelblue") item_numb_lbl = QLabel(str(item_numb[0])) item_card_table.setCellWidget(0, 0, item_numb_lbl) # столбец - название item_card_table.verticalHeader().resizeSection(1, 30) item_card_table.verticalHeader().setSectionResizeMode( 1, QHeaderView.Fixed) column_2 = QTableWidgetItem() column_2.setText("Название") item_card_table.setVerticalHeaderItem(1, column_2) item_card_table.verticalHeader().setStyleSheet("color: steelblue") item_name_lbl = QLabel(item_name[0]) item_card_table.setCellWidget(1, 0, item_name_lbl) # столбец - ед.изм item_card_table.verticalHeader().resizeSection(2, 30) item_card_table.verticalHeader().setSectionResizeMode( 2, QHeaderView.Fixed) column_3 = QTableWidgetItem() column_3.setText("Ед.изм.") item_card_table.setVerticalHeaderItem(2, column_3) item_card_table.verticalHeader().setStyleSheet("color: steelblue") item_unit_lbl = QLabel(item_unit[0]) item_card_table.setCellWidget(2, 0, item_unit_lbl) # столбец - категория item_card_table.verticalHeader().resizeSection(3, 30) item_card_table.verticalHeader().setSectionResizeMode( 3, QHeaderView.Fixed) column_4 = QTableWidgetItem() column_4.setText("Категория") item_card_table.setVerticalHeaderItem(3, column_4) item_card_table.verticalHeader().setStyleSheet("color: steelblue") item_cat_lbl = QLabel(item_cat[0]) item_card_table.setCellWidget(3, 0, item_cat_lbl) # столбец - количество item_card_table.verticalHeader().resizeSection(4, 30) item_card_table.verticalHeader().setSectionResizeMode( 4, QHeaderView.Fixed) column_5 = QTableWidgetItem() column_5.setText("Количество") item_card_table.setVerticalHeaderItem(4, column_5) item_card_table.verticalHeader().setStyleSheet("color: steelblue") item_amount_lbl = QLabel(item_amount_str) item_card_table.setCellWidget(4, 0, item_amount_lbl) # столбец - поставщики item_card_table.verticalHeader().resizeSection(5, 30) item_card_table.verticalHeader().setSectionResizeMode( 5, QHeaderView.Fixed) column_6 = QTableWidgetItem() column_6.setText("Поставщики") item_card_table.setVerticalHeaderItem(5, column_6) item_card_table.verticalHeader().setStyleSheet("color: steelblue") item_supp_lbl = QLabel(suppliers_str) item_card_table.setCellWidget(5, 0, item_supp_lbl) cur.close() con.close() item_prs_grid = QGridLayout() item_prs_grid.addWidget(img_lbl_frame, 0, 0, alignment=QtCore.Qt.AlignCenter) item_prs_grid.addWidget(item_card_table, 1, 0, alignment=QtCore.Qt.AlignCenter) scrollArea = QScrollArea() scrollArea.setWidgetResizable(True) scrollArea.setLayout(item_prs_grid) scrollArea.setFixedSize(600, 518) fQMD_grid = QGridLayout() fQMD_grid.addWidget(scrollArea, 0, 0, alignment=QtCore.Qt.AlignCenter) fQMD_frame = QFrame() fQMD_frame.setStyleSheet( open("./styles/properties_form_style.qss", "r").read()) fQMD_frame.setFrameShape(QFrame.Panel) fQMD_frame.setFrameShadow(QFrame.Sunken) fQMD_frame.setLayout(fQMD_grid) fQMD_vbox = QVBoxLayout() fQMD_vbox.addWidget(fQMD_frame) # Размещение на форме всех компонентов form = QFormLayout() form.addRow(fQMD_vbox) self.setLayout(form)
class Window(QMainWindow): def __init__(self): super(Window, self).__init__() # Set size and centre window self.setGeometry(50, 50, 500, 400) qtRectangle = self.frameGeometry() centerPoint = QDesktopWidget().availableGeometry().center() qtRectangle.moveCenter(centerPoint) self.move(qtRectangle.topLeft()) self.setWindowTitle("Rthenticator") self.setWindowIcon(QIcon('icon.ico')) self.setStyleSheet("background-color: #2F3031") self.home() def home(self): # Init QSystemTrayIcon self.tray_icon = QSystemTrayIcon(self) self.tray_icon.setIcon(QIcon('icon.ico')) show_action = QAction("Show", self) quit_action = QAction("Exit", self) hide_action = QAction("Hide", self) show_action.triggered.connect(self.show) hide_action.triggered.connect(self.hide) quit_action.triggered.connect(qApp.quit) tray_menu = QMenu() tray_menu.addAction(show_action) tray_menu.addAction(hide_action) tray_menu.addAction(quit_action) self.tray_icon.setContextMenu(tray_menu) self.tray_icon.activated.connect(self.systemIcon) self.tray_icon.show() # Button Setup self.btnImport = QPushButton("Import", self) self.btnImport.move(50, 320) self.btnImport.setStyleSheet( "background-color: #737C7D; color: #E9E6E4") self.btnImport.clicked.connect(self.btnImportClicked) # Listbox Setup self.Listbox = QListWidget(self) self.Listbox.setAlternatingRowColors(True) self.Listbox.setFixedSize(220, 300) self.Listbox.move(10, 10) self.Listbox.setStyleSheet( "alternate-background-color: #3F4041; color: #E9E6E4;") self.Listbox.itemClicked.connect(self.listboxClicked) for key in sorted(secrets): self.Listbox.addItem(key) self.Listbox.setCurrentRow(0) self.Listbox.currentItem().setSelected(True) # Listview context menu self.Listbox.setContextMenuPolicy(Qt.CustomContextMenu) self.Listbox.customContextMenuRequested.connect(self.showMenu) self.Listbox.itemChanged.connect(self.listboxChanged) self.old_name = "" # Frame Setup self.Frame = QFrame(self) self.Frame.setFixedSize(220, 300) self.Frame.move(266, 10) self.Frame.setFrameShape(QFrame.Shape.Panel) self.Frame.setFrameShadow(QFrame.Shadow.Plain) self.Frame.setStyleSheet("color: #828790") # Progress Bar Setup self.progress = QProgressBar(self) self.progress.setGeometry(266, 325, 200, 20) self.progress.setTextVisible(False) self.progress.setStyleSheet( "QProgressBar::chunk { background: #6187CB; }") self.progress.setRange(1, 29) # Progress Bar Timer Setup self.timer = QTimer() self.timer.timeout.connect(self.progressTimer) self.timer.start(1000) # Label Setup self.label = QLabel(self) self.label.setGeometry(310, 220, 150, 40) self.label.setText("") self.label.setFont(QFont("Arial", 30, QFont.Bold)) self.label.setStyleSheet("color: #E9E6E4") self.label.setTextInteractionFlags(Qt.TextSelectableByMouse) self.image = QLabel(self) self.image.setGeometry(300, 40, 150, 150) self.Listbox.setFocus(True) self.listboxClicked() self.show() # Restore view when tray icon doubleclicked def systemIcon(self, reason): if reason == QSystemTrayIcon.DoubleClick: self.show() self.copy_auth_code() # Override closeEvent, to intercept the window closing event def closeEvent(self, event): event.ignore() self.hide() self.tray_icon.showMessage("Tray Program", "Application was minimized to Tray", QSystemTrayIcon.Information, 2000) def copy_auth_code(self): """ Copies Authentication code to the clipboard """ answer = self.Listbox.currentItem().text() totp = pyotp.TOTP(secrets[answer][0]) self.label.setText(str(totp.now())) pyperclip.copy(totp.now()) def progressTimer(self): """ Updates progress timer Copies authentication code to clipboard once timer has reached 0 and main window is not in system tray """ current_time = int(time.time() % 30) self.progress.setValue(current_time) if current_time == 0: if self.isVisible(): self.copy_auth_code() def setImage(self): """ Reads from the images directory to see if there is a matching logo and must be the same name Splits the text on a `:` png files only """ item = self.Listbox.currentItem().text().split(":")[0] fname = f"images/{item}.png" if os.path.isfile(fname): pixmap = QPixmap(fname).scaled(150, 150) self.image.setPixmap(pixmap) else: self.image.setPixmap(QPixmap()) def listboxClicked(self): """ Listbox has been clicked """ self.setImage() self.copy_auth_code() def btnImportClicked(self): """ Imports a QR-code png file and add its to secrets.json """ fileName, _ = QFileDialog.getOpenFileName( self, "QFileDialog.getOpenFileName()", "", "All Files (*)") if fileName: test = unquote( decode(Image.open(fileName))[0].data.decode("utf-8")) query = urlsplit(test).query params = parse_qs(query) start = "/totp/" end = "\\?" test = re.search(f'{start}(.*){end}', test).group(1) secrets[test] = [params['secret'][0]] self.Listbox.addItem(test) with open('secrets.json', 'w') as fh: json.dump(secrets, fh, sort_keys=True, indent=4) def showMenu(self, pos): """ Displays right click context menu, with 2 options - Rename - Allows us to rename an entry - Delete - Aloows us to remove and entry """ menu = QMenu() renameAction = menu.addAction("Rename") deleteAction = menu.addAction("Delete") action = menu.exec_(self.Listbox.viewport().mapToGlobal(pos)) if action == renameAction: this_item = self.Listbox.currentItem() self.Listbox.blockSignals( True ) # Block signals so we dont trigger the listboxChanged function this_item.setFlags( this_item.flags() | Qt.ItemIsEditable) # Allows us to edit the item self.Listbox.blockSignals(False) # Re-enables signals self.old_name = this_item.text() self.Listbox.edit(self.Listbox.currentIndex()) if action == deleteAction: self.showMessageBox() def showMessageBox(self): """ Creates and displays a message box for delete confirmation """ box = QMessageBox() box.setIcon(QMessageBox.Question) box.setWindowTitle('Warning!') box.setStandardButtons(QMessageBox.Yes | QMessageBox.No) box.setStyleSheet("background-color: #2F3031;") box.setText( "<FONT COLOR='#E9E6E4'>Do you really wish to delete this?</FONT>") btnYes = box.button(QMessageBox.Yes) btnYes.setStyleSheet("background-color: #737C7D; color: #E9E6E4") btnYes.setText('Yes') btnNo = box.button(QMessageBox.No) btnNo.setStyleSheet("background-color: #737C7D; color: #E9E6E4") btnNo.setText('No') box.exec_() if box.clickedButton() == btnYes: items = self.Listbox.selectedItems() for item in items: new_name = item.text() self.Listbox.takeItem(self.Listbox.row(item)) secrets.pop(new_name) with open('secrets.json', 'w') as fh: json.dump(secrets, fh, sort_keys=True, indent=4) def listboxChanged(self): """ Called when we have changed text of an item in the listbox """ new_name = self.Listbox.currentItem().text() self.Listbox.blockSignals( True) # Block signals so we dont trigger ourselves this_item = self.Listbox.currentItem() this_item.setFlags(this_item.flags() & ~Qt.ItemIsEditable) # Turn off the Editable flag self.Listbox.blockSignals(False) # Re-enables signals to be processed secrets[new_name] = secrets.pop(self.old_name) with open('secrets.json', 'w') as fh: json.dump(secrets, fh, sort_keys=True, indent=4)
def __init__(self, resObject): super().__init__() self.setWindowTitle("mainwidget") self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self._magicList = [] self.uploaded = False self.isConnected = False self.dim = (dim.height() - rPix(70), dim.width() - rPix(320) ) ##1010,1600 self.setFixedSize(self.dim[1], self.dim[0]) self.stackIndex = 0 ## Adopting global Resource Object self.res = resObject self.terminate = False ## Setting Attributes if winStat: self.setWindowFlags( Qt.FramelessWindowHint) #|Qt.WindowStaysOnTopHint) else: self.setWindowFlags(Qt.FramelessWindowHint) self.installEventFilter(self) self.setAttribute(Qt.WA_TranslucentBackground, True) self.setFocusPolicy(Qt.StrongFocus) self.setFocus() ## Ctrl + W Exit Shortcut self.shortcut = QShortcut(QKeySequence("Ctrl+W"), self) self.shortcut.activated.connect(self.closeApp) self.shortcut2 = QShortcut(QKeySequence("Ctrl+R"), self) self.shortcut2.activated.connect(self.resetStackColor) self.stack = QStackedWidget() ##Creating multiple instances of cStack self.stackList = [ cStack(i, self.res, self.res.bg[(i - 1) % 4]) for i in range(1, tconNum + 1) ] ##Initializing Main Stack self.mainStack = QWidget() self.mainStackUI() ## Adding cStack instances to StackedWidget self.stack.addWidget(self.mainStack) for i in self.stackList: self.stack.addWidget(i) ## Stack Frame Placeholder stackFrameLayout = QHBoxLayout() stackFrameLayout.addWidget(self.stack) stackFrameLayout.setSpacing(0) stackFrameLayout.setContentsMargins(0, 0, 0, 0) stackFrame = QFrame() stackFrame.setLayout(stackFrameLayout) ## Stack Buttons MAIN (prev and next stack) self.nextStack = ImageButton("resources/img/buttons/nextC", rPix(50), rPix(50), toggle=True, tooltip="<b>Next Contestant</b>") self.nextStack.clicked.connect(self.nextEvt) self.prevStack = ImageButton("resources/img/buttons/prevC", rPix(50), rPix(50), toggle=True, tooltip="<b>Previous Contestant</b>") self.prevStack.clicked.connect(self.prevEvt) ## Stack Buttons (MAIN - 14) self.stackSelector = [QPushButton() for i in range(0, tconNum + 1)] selectorHLayout = QHBoxLayout() selectorHLayout.setSpacing(rPix((14 / tconNum) * 20)) selectorHLayout.setContentsMargins(0, rPix(5), 0, rPix(5)) ##STYLING STACK SELECTORS for i in range(0, len(self.stackSelector)): self.stackSelector[i].setFixedSize(rPix((14 / tconNum) * 50), rPix(20)) stackSelectorState(self.stackSelector[i], 0) self.stackSelector[i].setFont(QFont(fonts[2])) self.stackSelector[i].setText(str(i)) _temp = partial(self.stackSelectorEvt, i) self.stackSelector[i].clicked.connect(_temp) selectorHLayout.addWidget(self.stackSelector[i]) ## Setting first stack selector as Main Widget self.stackSelector[0].setText("MAIN") self.stackSelector[0].setFont(QFont(fonts[0], rPix(10))) self.stackSelector[0].clicked.connect(lambda: self.stackSelectorEvt(0)) ## Stack Selector Frame self.selectorFrame = QFrame() self.selectorFrame.setObjectName("selector") self.selectorFrame.setStyleSheet( adaptiveStyle("selector", palette=self.res.buttonPanelPalette[0])) self.selectorFrame.setFixedSize( rPix(((14 / tconNum)) * (50 + 40)) * tconNum + 1, rPix(35)) self.selectorFrame.setLayout(selectorHLayout) ## Center Y Axis of selectorFrame selectorVLayout = QVBoxLayout() selectorVLayout.addStretch(1) selectorVLayout.addWidget(self.selectorFrame) selectorVLayout.addStretch(1) ## Selector Frame (MAIN-14) topLayout = QHBoxLayout() topLayout.addWidget(self.prevStack) topLayout.addStretch(1) topLayout.addLayout(selectorVLayout) topLayout.addStretch(1) topLayout.addWidget(self.nextStack) topLayout.setContentsMargins(rPix(20), 0, rPix(20), 0) topLayout.setSpacing(rPix(20)) ##Selector Frame + Prev and Next Button topFrame = QFrame() topFrame.setObjectName("noframe") topFrame.setStyleSheet(styles["noframe"]) topFrame.setFixedSize(self.dim[1], rPix(80)) topFrame.setLayout(topLayout) ##Bottom Panel OBJECTS reqAssistance = ImageButton("resources/img/buttons/assist", rPix(30), rPix(30), toggle=False, tooltip="<b>Request Assistance</b>") reqAssistance.setFixedSize(rPix(30), rPix(30)) manual = ImageButton("resources/img/buttons/manual", rPix(30), rPix(30), toggle=False, tooltip="<b>Open User Manual</b>") manual.clicked.connect(self.manualEvt) self.upload = ImageButton("resources/img/buttons/upload", rPix(30), rPix(30), toggle=True, tooltip="<b>Upload Scores</b>") self.upload.clicked.connect(self.uploadScores) ##Semi Rounded Rectangle LAYOUT buttonLayout = QHBoxLayout() buttonLayout.addWidget(self.upload) buttonLayout.addWidget(reqAssistance) buttonLayout.addWidget(manual) buttonLayout.setContentsMargins(rPix(10), 0, rPix(10), 0) buttonLayout.setSpacing(rPix(20)) self.buttonFrame = QFrame() self.buttonFrame.setObjectName("buttonFrame") self.buttonFrame.setStyleSheet( adaptiveStyle("buttonFrame", palette=self.res.buttonPanelPalette[0])) self.buttonFrame.setFixedSize(rPix(140), rPix(45)) self.buttonFrame.setLayout(buttonLayout) ##Semi Rounded Rectangle Handler botLayout = QHBoxLayout() botLayout.addStretch(1) botLayout.addWidget(self.buttonFrame) botLayout.setContentsMargins(rPix(20), 0, 0, 0) botLayout.setSpacing(rPix(20)) ##Filler Frame for Button Panel botFrame = QFrame() botFrame.setObjectName("noframe") botFrame.setStyleSheet(styles["noframe"]) botFrame.setFixedSize(self.dim[1], rPix(45)) botFrame.setLayout(botLayout) ##Top Frame + Stack stackLayout = QVBoxLayout(self) stackLayout.setContentsMargins(0, 0, 0, 0) stackLayout.setSpacing(0) stackLayout.addStretch(1) stackLayout.addWidget(topFrame) stackLayout.addWidget(stackFrame) stackLayout.addWidget(botFrame) stackLayout.addStretch(1) ##StackFrame stackLayoutFrame = QFrame() stackLayoutFrame.setObjectName("noframe") stackLayoutFrame.setStyleSheet(styles["noframe"]) stackLayoutFrame.setLayout(stackLayout) ##Mask Layout maskHLayout = QHBoxLayout() maskHLayout.setContentsMargins(0, 0, 0, 0) maskHLayout.setSpacing(0) maskHLayout.addStretch(1) maskHLayout.addWidget(stackLayoutFrame) maskHLayout.addStretch(1) maskVLayout = QHBoxLayout() maskVLayout.setContentsMargins(0, 0, 0, 0) maskVLayout.setSpacing(0) maskVLayout.addStretch(1) maskVLayout.addLayout(maskHLayout) maskVLayout.addStretch(1) ##Mask Frame mask = QFrame() mask.setObjectName("mask") mask.setStyleSheet(styles["mask"]) mask.setLayout(maskVLayout) ## Placeholder Layout MainPlaceholderLayout = QHBoxLayout() MainPlaceholderLayout.setContentsMargins(0, 0, 0, 0) MainPlaceholderLayout.setSpacing(0) MainPlaceholderLayout.addWidget(mask) self.setLayout(MainPlaceholderLayout) self.prevStack.setEnabled_(False) self.stackSelector[0].setEnabled(False) self.showFullScreen()
class Interface(QWidget): ''' Main widget ''' def __init__(self): super(Interface, self).__init__() # Initialize window details and geometry self.title = 'Options Viewer' self.setWindowTitle(self.title) self.width = 654 self.height = 342 self.setFixedSize(self.width, self.height) self.setGeometry(0, 0, self.width - 4, self.height - 4) self.centerWindow() # Initialize the ErrorPopup self.ePop = ErrorPopup(self) # Initialize layouts (class, size, margins, spacing) self.layout = QVBoxLayout(self) self.layout.setContentsMargins(0, 0, 0, 0) self.layout.setSpacing(0) self.top = QFrame() self.top.setFixedSize(self.width, 302) self.topLayout = QHBoxLayout(self.top) self.topLayout.setContentsMargins(0, 0, 0, 0) self.topLayout.setSpacing(0) self.topRight = QFrame(self) self.topRight.setObjectName('topRight') self.topRight.setFixedSize(200, 302) self.topRightLayout = QVBoxLayout(self.topRight) self.topRightLayout.setContentsMargins(0, 0, 0, 0) self.topRightLayout.setSpacing(0) self.bottom = QFrame(self) self.bottom.setObjectName('bottom') self.bottom.setFixedSize(self.width, 40) self.bottomLayout = QHBoxLayout(self.bottom) self.bottomLayout.setContentsMargins(0, 0, 0, 0) self.bottomLayout.setSpacing(0) # Create top-right widgets and add to layout self.add1x2 = Add1x2Container(self) self.buttonContainer = ButtonContainer(self) self.topRightLayout.addWidget(self.add1x2) self.topRightLayout.addWidget(QHLine()) self.topRightLayout.addWidget(self.buttonContainer) # Create table and add to layout self.model = EntryModel(self) self.table = Table1x2() self.table.setModel(self.model) self.table.resize() self.topLayout.addWidget(self.table) self.topLayout.addWidget(self.topRight) # Create bottom widgets and add to layout self.bottomContainer = BottomContainer(self) self.helpquitContainer = HelpQuitContainer(self) self.bottomLayout.addWidget(self.bottomContainer) self.bottomLayout.addWidget(self.helpquitContainer) # Create chart and add (along with other layouts/containers) to main layout self.chartContainer = ChartContainer(self) self.layout.addWidget(self.top) self.layout.addWidget(self.chartContainer) self.layout.addWidget(self.bottom) # Initialize with chart hidden self.chartContainer.hide() self.setStyleSheet(open("styles/main.qss", "r").read()) # Uncomment to debug frame locations # self.setStyleSheet("QFrame {background-color: rgb(255,0,0); border:1px solid rgb(0, 0, 0)}") def enableChart(self): ''' Enables chart button and calls plot() ''' self.buttonContainer.chartButton.setEnabled(True) self.chartContainer.plot() def disableChart(self): ''' Clears & hides chart, disables button, resizes window ''' self.chartContainer.figure.clear() self.chartContainer.hide() self.buttonContainer.chartButton.setEnabled(False) try: self.setFixedSize(self.width, 342) self.buttonContainer.chartButton.setText('VVV Show chart VVV') self.buttonContainer.chartButton.disconnect() self.buttonContainer.chartButton.clicked.connect( lambda: self.buttonContainer.showChart()) except: pass def centerWindow(self): ''' Centers window based on screen geometry ''' qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() cp.setY(cp.y() - 250) qr.moveCenter(cp) self.move(qr.topLeft()) return
def window(self): Register_Values = Components.Register_Values.Register_Values( ) # Object of Class Register Values List_of_Registers = Components.List_of_Registers.List_of_Registers( ) # Object of Class List of Registers self.tableWidget = Register_Values.getTable() self.listWidget = List_of_Registers.getListOfRegisters() self.listWidget.itemClicked.connect(self.Clicked) splitter = QSplitter(Qt.Vertical) splitter.addWidget(self.listWidget) splitter.addWidget(self.tableWidget) splitter.setSizes([300, 150]) horizontalLayout = QHBoxLayout() simulatorFont = QtGui.QFont("Arial", 15, QtGui.QFont.Bold) simulatorTitle = QtWidgets.QLabel(self) simulatorTitle.setText("ATMega328p") simulatorTitle.setAlignment(Qt.AlignCenter) simulatorTitle.setFont(simulatorFont) simulatorTitle.setAlignment(Qt.AlignCenter) simulatorFrame = QFrame() simulatorFrame.setStyleSheet("QWidget { background-color: silver }") simulatorFrame.setLineWidth(3) simulatorFrame.setMidLineWidth(3) simulatorFrame.setFrameShape(QFrame.Panel) simulatorFrame.setFixedSize(250, 450) simulatorFrame.layout = QHBoxLayout() simulatorFrame.layout.addWidget(simulatorTitle) simulatorFrame.setFrameShadow(simulatorFrame.Raised) simulatorFrame.setLayout(simulatorFrame.layout) pinFont = QtGui.QFont("Arial", 9, QtGui.QFont.Bold) pinsl = [ 'PD0', 'PD1', 'PD2', 'PD3', 'PD4', 'PD5', 'PD6', 'PB3', 'PB4', 'PB5', 'PB6' ] leftPinFrame = QFrame() leftPinFrame.layout = QVBoxLayout() leftPinFrame.layout.setAlignment(Qt.AlignRight) leftPinFrame.layout.addStretch() pinl_dict = {} for i in pinsl: pinl_dict[i] = QtWidgets.QPushButton(self) pinl_dict[i].setText(i) pinl_dict[i].setStyleSheet('color : dark grey') #pinl_dict[i].setAlignment(Qt.AlignRight) pinl_dict[i].setFixedSize(30, 30) pinl_dict[i].setFont(pinFont) leftPinFrame.layout.setSpacing(10) leftPinFrame.layout.addWidget(pinl_dict[i]) leftPinFrame.setLayout(leftPinFrame.layout) leftPinFrame.layout.addStretch() rightPinFrame = QFrame() rightPinFrame.layout = QVBoxLayout() rightPinFrame.layout.setAlignment(Qt.AlignLeft) rightPinFrame.layout.addStretch() pinsr = [ 'PC6', 'PC5', 'PC4', 'PC3', 'PC2', 'PC1', 'PC0', 'PB1', 'PB2', 'VCC', 'GND' ] pinr_dict = {} for i in pinsr: pinr_dict[i] = QtWidgets.QPushButton(self) pinr_dict[i].setText(i) pinr_dict[i].setStyleSheet('color : dark grey') pinr_dict[i].setFixedSize(30, 30) pinr_dict[i].setFont(pinFont) rightPinFrame.layout.setSpacing(10) rightPinFrame.layout.addWidget(pinr_dict[i]) rightPinFrame.layout.addStretch() rightPinFrame.setLayout(rightPinFrame.layout) pinl_dict['PD0'].setStyleSheet('color : red') pinl_dict['PD1'].setStyleSheet('color : red') pinl_dict['PD2'].setStyleSheet('color : red') pinr_dict['PC6'].setStyleSheet('color : green') pinr_dict['PC5'].setStyleSheet('color : green') pinr_dict['PC4'].setStyleSheet('color : green') rightFrame = QFrame() rightFrame.setFrameShape(QFrame.StyledPanel) rightFrame.layout = QHBoxLayout() rightFrame.layout.addWidget(leftPinFrame) rightFrame.layout.addWidget(simulatorFrame) rightFrame.layout.addWidget(rightPinFrame) rightFrame.setLayout(rightFrame.layout) horizontalSplitter = QSplitter(Qt.Horizontal) horizontalLayout.addWidget(splitter) horizontalSplitter.addWidget(rightFrame) horizontalSplitter.setSizes([80, 320]) horizontalSplitter.adjustSize() titleFont = QtGui.QFont("Arial", 15, QtGui.QFont.Bold) Title = QtWidgets.QLabel(self) Title.setText("ATMega328p Simulator") Title.setFont(titleFont) Title.setAlignment(Qt.AlignCenter) horizontalLayout.addWidget(horizontalSplitter) StatusFont = QtGui.QFont("Helvetica", 10, QtGui.QFont.Bold) Status = QtWidgets.QLabel(self) Status.setText(self.getConnectionStatus()) Status.setFont(StatusFont) Status.setStyleSheet('color : green') Status.setAlignment(Qt.AlignCenter) verticalLayout = QVBoxLayout() verticalLayout.addWidget(Title) verticalLayout.addWidget(Status) verticalLayout.addLayout(horizontalLayout) self.setLayout(verticalLayout)
class MainWindowClass(QMainWindow): def __init__(self, parent=None): QMainWindow.__init__(self, parent) self.interface_lng_val = 'Russian' if self.interface_lng_val == 'Russian': self.setWindowTitle("Графический интерфейс программы OpenFOAM") elif self.interface_lng_val == 'English': self.setWindowTitle("OpenFOAM_decompose_GUI") # Базовые переменные self.full_dir = '' self.prj_name = '' self.con = '' self.lock_bool = False self.application = '' self.object_edit_txt = '' # ---------------------------Панель управления подготовкой задачи МСС----------------------------- # self.proj_open = QAction(self) self.proj_open.setEnabled(True) proj_ico = self.style().standardIcon(QStyle.SP_ArrowUp) self.proj_open.setIcon(proj_ico) if self.interface_lng_val == 'Russian': self.proj_open.setToolTip('Открыть проект') elif self.interface_lng_val == 'English': self.proj_open.setToolTip('Open the project') self.lng_chs = QAction(self) self.lng_chs.setEnabled(True) lng_chs_ico = self.style().standardIcon( QStyle.SP_FileDialogDetailedView) self.lng_chs.setIcon(lng_chs_ico) if self.interface_lng_val == 'Russian': self.lng_chs.setToolTip('Выбрать язык интерфейса программы') elif self.interface_lng_val == 'English': self.lng_chs.setToolTip('Select the interface language') self.file_open = QAction(self) self.file_open.setEnabled(False) file_open_ico = self.style().standardIcon(QStyle.SP_FileIcon) self.file_open.setIcon(file_open_ico) if self.interface_lng_val == 'Russian': self.file_open.setToolTip( 'Открыть форму создания служебного файла для директории 0') elif self.interface_lng_val == 'English': self.file_open.setToolTip( 'Open the form for creating the service file for the directory 0' ) self.toolBar_1 = QToolBar("MyToolBar") self.toolBar_1.addAction(self.proj_open) self.toolBar_1.addAction(self.lng_chs) self.toolBar_1.addAction(self.file_open) self.proj_open.triggered.connect( lambda: first_toolbar_functions_class.on_proj_open(self)) self.lng_chs.triggered.connect( lambda: first_toolbar_functions_class.on_lng_chs(self)) self.file_open.triggered.connect( lambda: first_toolbar_functions_class.on_0_files_window_chs(self)) self.addToolBar(self.toolBar_1) ###----------------------Панель управления подготовкой РС--------------------------### self.msh_open = QAction(self) self.msh_open.setEnabled(False) msh_ico = self.style().standardIcon(QStyle.SP_FileDialogNewFolder) self.msh_open.setIcon(msh_ico) if self.interface_lng_val == 'Russian': self.msh_open.setToolTip('Открыть форму выбора расчетной сетки') elif self.interface_lng_val == 'English': self.msh_open.setToolTip('Open the mesh selection form') self.msh_run = QAction(self) self.msh_run.setEnabled(False) msh_ico = self.style().standardIcon(QStyle.SP_ArrowRight) self.msh_run.setIcon(msh_ico) if self.interface_lng_val == 'Russian': self.msh_run.setToolTip('Выполнить генерацию расчетной сетки') elif self.interface_lng_val == 'English': self.msh_run.setToolTip('Make the mesh generation') self.msh_visual = QAction(self) self.msh_visual.setEnabled(False) msh_visual_ico = self.style().standardIcon(QStyle.SP_MediaSeekForward) self.msh_visual.setIcon(msh_visual_ico) if self.interface_lng_val == 'Russian': self.msh_visual.setToolTip( 'Выполнить визуализацию расчетной сетки') elif self.interface_lng_val == 'English': self.msh_visual.setToolTip('Make the mesh visualization') self.toolBar_2 = QToolBar() self.toolBar_2.addAction(self.msh_open) self.toolBar_2.addAction(self.msh_run) self.toolBar_2.addAction(self.msh_visual) self.msh_open.triggered.connect( lambda: second_toolbar_functions_class.on_msh_open(self)) self.msh_run.triggered.connect( lambda: second_toolbar_functions_class.on_msh_run( prj_path_val, mesh_name_txt_val, pp_dir, self, self. interface_lng_val, msh_type)) self.msh_visual.triggered.connect( lambda: second_toolbar_functions_class.on_visual_msh_run( prj_path_val, mesh_name_txt_val, pp_dir, self, self. interface_lng_val, msh_type)) self.addToolBar(self.toolBar_2) self.insertToolBarBreak(self.toolBar_2) ###----------------------Панель управления решением задачи МСС--------------------------### self.solv_run = QAction(self) self.solv_run.setEnabled(False) solv_run_ico = self.style().standardIcon(QStyle.SP_DialogNoButton) self.solv_run.setIcon(solv_run_ico) if self.interface_lng_val == 'Russian': self.solv_run.setToolTip('Выполнить решение') elif self.interface_lng_val == 'English': self.solv_run.setToolTip('Run solution') self.solv_stop = QAction(self) self.solv_stop.setEnabled(False) close_ico = self.style().standardIcon(QStyle.SP_DockWidgetCloseButton) self.solv_stop.setIcon(close_ico) if self.interface_lng_val == 'Russian': self.solv_stop.setToolTip('Остановить процесс решения') elif self.interface_lng_val == 'English': self.solv_stop.setToolTip('Stop the solution process') self.solv_run_vis = QAction(self) self.solv_run_vis.setEnabled(False) solv_run_vis_ico = self.style().standardIcon(QStyle.SP_CommandLink) self.solv_run_vis.setIcon(solv_run_vis_ico) if self.interface_lng_val == 'Russian': self.solv_run_vis.setToolTip( 'Выполнить визуализацию результатов решения') elif self.interface_lng_val == 'English': self.solv_run_vis.setToolTip('Visualize the solution results') self.toolBar_3 = QToolBar() self.toolBar_3.addAction(self.solv_run) self.toolBar_3.addAction(self.solv_stop) self.toolBar_3.addAction(self.solv_run_vis) self.solv_run.triggered.connect( lambda: second_toolbar_functions_class.on_solv_run( prj_path_val, mesh_name_txt_val, pp_dir, self, self. interface_lng_val, msh_type)) self.solv_stop.triggered.connect( lambda: second_toolbar_functions_class.on_solv_stop( prj_path_val, mesh_name_txt_val, pp_dir, self, self. interface_lng_val, msh_type)) self.solv_run_vis.triggered.connect( lambda: second_toolbar_functions_class.on_solv_vis( prj_path_val, mesh_name_txt_val, pp_dir, self, self. interface_lng_val, msh_type)) self.addToolBar(self.toolBar_3) self.insertToolBarBreak(self.toolBar_3) ###----------------Верхний виджет с полным путем до файла сетки----------------### self.tdw = QDockWidget() self.tdw.setFixedSize(1400, 65) self.tdw.setFeatures(self.tdw.NoDockWidgetFeatures) self.tdw_grid = QGridLayout() self.tdw_grid.setColumnStretch(2, 1) self.tdw_frame = QFrame() self.tdw_frame.setStyleSheet("background-color: ghostwhite;" "border-width: 0.5px;" "border-style: solid;" "border-color: silver;") self.tdw_frame.setLayout(self.tdw_grid) self.tdw.setWidget(self.tdw_frame) self.addDockWidget(QtCore.Qt.TopDockWidgetArea, self.tdw) ###-----------------Левый виджет с файловой системой проекта---------------------### self.fsw = QDockWidget() self.fsw.setFeatures(self.fsw.NoDockWidgetFeatures) self.fsw_label = QLabel() self.fsw_label.setAlignment(QtCore.Qt.AlignCenter) self.fsw_grid = QGridLayout() self.fsw_grid.addWidget(self.fsw_label, 0, 0) self.fsw_frame = QFrame() self.fsw_frame.setFixedSize(200, 35) self.fsw_frame.setStyleSheet("background-color: honeydew;" "border-width: 1px;" "border-style: solid;" "border-color: dimgray;" "border-radius: 4px;") self.fsw_frame.setLayout(self.fsw_grid) if self.interface_lng_val == 'Russian': fs_lbl = "Файловая Cтруктура Проекта" elif self.interface_lng_val == 'English': fs_lbl = "File Structure of the Project" self.fsw_label.setText("<font color='SeaGreen'>" + fs_lbl + "</font>") self.fsw_label.setStyleSheet("border-style: none;" "font-size: 10pt;") self.fsw.setTitleBarWidget(self.fsw_frame) self.treeview = QTreeView() self.treeview.setFixedSize(200, 520) self.treeview.model = QtGui.QStandardItemModel() self.treeview.setModel(self.treeview.model) self.treeview.setColumnWidth(0, 100) self.treeview.setColumnHidden(1, True) self.treeview.setColumnHidden(2, True) self.treeview.setColumnHidden(3, True) self.treeview.header().hide() self.treeview.setItemsExpandable(False) self.treeview.clicked.connect(self.on_treeview_clicked) self.fsw.setWidget(self.treeview) ###-----------Правый виджет с формой вывода результатов генерации файлов-----------### self.cdw = QDockWidget() self.cdw.setFeatures(self.cdw.NoDockWidgetFeatures) self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.cdw) self.cdw_grid = QGridLayout() self.cdw_frame = QFrame() self.cdw_frame.setFixedSize(495, 35) self.cdw_frame.setStyleSheet("border-width: 1px;" "border-style: solid;" "border-color: dimgray;" "border-radius: 4px;" "background-color: honeydew;") self.cdw_frame.setLayout(self.cdw_grid) self.outf_lbl = QLabel() self.outf_lbl.setAlignment(QtCore.Qt.AlignCenter) self.outf_lbl.setStyleSheet("border-style: none;" "font-size: 9pt;") self.cdw_grid.addWidget(self.outf_lbl, 0, 0) self.outf_edit = QTextEdit() self.outf_scroll = QScrollArea() self.outf_scroll.setWidgetResizable(True) self.outf_scroll.setWidget(self.outf_edit) self.outf_scroll.setFixedSize(495, 520) ###-----------------Центральный виджет с формой параметров---------------------### self.ffw = QDockWidget() self.ffw.setFeatures(self.ffw.NoDockWidgetFeatures) self.ffw_label = QLabel() self.ffw_label.setAlignment(QtCore.Qt.AlignCenter) self.ffw_grid = QGridLayout() self.ffw_grid.addWidget(self.ffw_label, 0, 0) self.ffw_frame = QFrame() self.ffw_frame.setFixedSize(693, 44) self.ffw_frame.setStyleSheet("border-width: 1px;" "border-style: solid;" "border-color: dimgray;" "border-radius: 4px;" "background-color: honeydew;") self.ffw_frame.setLayout(self.ffw_grid) ###------------------Нижний виджет со служебными сообщениями------------------### if self.interface_lng_val == 'Russian': self.serv_mes = QDockWidget("Служебные сообщения") elif self.interface_lng_val == 'English': self.serv_mes = QDockWidget("Service messages") self.serv_mes.setFixedSize(1400, 160) self.serv_mes.setFeatures(self.serv_mes.NoDockWidgetFeatures) self.listWidget = QListWidget() self.serv_mes.setWidget(self.listWidget) ###---------------------Функции, связанные с работой главного окна------------------------### # ...........................Функция клика по файлу из дерева......................... ###........................Функция открытия окна выбора интерфейса программы...................### # ...........................Функция клика по файлу из дерева......................... def on_treeview_clicked(self, index): global fileName indexItem = self.treeview.model.index(index.row(), 0, index.parent()) self.lock_bool = True self.file_name = self.treeview.model.itemFromIndex(indexItem).text() file_form_class.inp_file_form_func(self, self.file_name, self.con) file_name_title = file_form_class.out_file_name_func() self.clear_label = QLabel() if file_name_title != None: if file_name_title != 'md': #self.cdw.setWidget(self.clear_label) #self.cdw.setTitleBarWidget if os.path.exists(self.full_dir + '/system/' + file_name_title): outf = open(self.full_dir + '/system/' + file_name_title) data = outf.read() self.outf_edit.setText(data) outf.close() elif os.path.exists(self.full_dir + '/constant/' + file_name_title): outf = open(self.full_dir + '/constant/' + file_name_title) data = outf.read() self.outf_edit.setText(data) outf.close() elif os.path.exists(self.full_dir + '/0/' + file_name_title): outf = open(self.full_dir + '/0/' + file_name_title) data = outf.read() self.outf_edit.setText(data) outf.close() self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.cdw) self.cdw.setWidget(self.outf_scroll) #data = outf.read() if self.interface_lng_val == 'Russian': self.outf_lbl.setText("Файл " + "<font color='peru'>" + file_name_title + "</font>") elif self.interface_lng_val == 'English': self.outf_lbl.setText("<font color='peru'>" + file_name_title + "</font>" + " file") #self.outf_edit.setText(data) self.cdw.setTitleBarWidget(self.cdw_frame) #outf.close() self.setCentralWidget(self.ffw) file_form = file_form_class.out_file_form_func() self.ffw.setWidget(file_form) self.ffw.setTitleBarWidget(self.ffw_frame) if self.interface_lng_val == 'Russian': self.ffw_label.setText("Форма параметров файла: " + "<font color='peru'>" + file_name_title + "</font>") elif self.interface_lng_val == 'English': self.ffw_label.setText("<font color='peru'>" + file_name_title + "</font>" + " file parameters form") self.ffw_label.setStyleSheet("border-style: none;" "font-size: 9pt;") elif file_name_title == 'md': if self.interface_lng_val == 'Russian': msg_lbl = QLabel( '<span style="color:blue">Для создания расчетной сетки воспользуйтесь панелью инструментов</span>' ) elif self.interface_lng_val == 'English': msg_lbl = QLabel( '<span style="color:blue">To create a mesh use the toolbar.</span>' ) self.listWidget.clear() self.item = QListWidgetItem() self.listWidget.addItem(self.item) self.listWidget.setItemWidget(self.item, msg_lbl) else: self.ffw.setTitleBarWidget(self.clear_label) self.ffw.setWidget(self.clear_label) self.cdw.setWidget(self.clear_label) self.cdw.setTitleBarWidget(self.clear_label) # .........................Функция получения языка интерфейса.......................... def on_lng_get(self, interface_lng): global interface_lng_val self.interface_lng_val = interface_lng if self.interface_lng_val == 'Russian': self.setWindowTitle("Графический интерфейс программы OpenFOAM") self.proj_open.setToolTip('Открыть проект') self.msh_run.setToolTip('Выполнить генерацию расчетной сетки') self.msh_visual.setToolTip( 'Выполнить визуализацию расчетной сетки') self.lng_chs.setToolTip('Выбрать язык интерфейса программы') self.file_open.setToolTip( 'Открыть форму создания служебного файла для директории 0') self.msh_open.setToolTip('Открыть форму выбора расчетной сетки') self.solv_run.setToolTip('Выполнить решение') self.solv_stop.setToolTip('Остановить процесс решения') self.solv_run_vis.setToolTip( 'Выполнить визуализацию результатов решения') elif self.interface_lng_val == 'English': self.setWindowTitle("OpenFOAM_decompose_GUI") self.proj_open.setToolTip('Open the project') self.msh_run.setToolTip('Run mesh generation') self.msh_visual.setToolTip('Run mesh visualization') self.lng_chs.setToolTip( 'Select the interface language for the program') self.file_open.setToolTip( 'Open the form for creating the service file for the directory 0' ) self.msh_open.setToolTip('Open the mesh selection form') self.solv_run.setToolTip('Run solution') self.solv_stop.setToolTip('Stop the solution process') self.solv_run_vis.setToolTip('Visualize the solution results') # .........................Функция получения пути до директории.......................... def on_prj_path_get(self, prj_path, mesh_name_txt): global prj_path_val global mesh_name_txt_val global pp_dir prj_path_val = prj_path mesh_name_txt_val = mesh_name_txt pp_dir, pp_sys = os.path.split(prj_path_val) # .............................Функция получения типа сетки.............................. def on_mesh_type_get(self, pd_2): global msh_type msh_type = pd_2
def initGUI(self): layout = QHBoxLayout() v = QVBoxLayout() line = QFrame() line.setFixedSize(300, 1) line.setStyleSheet('background-color: rgb(149,149,149)') widget = QWidget() grid = QGridLayout() addTrace = QPushButton('add trace') addTrace.setFixedSize(100, 30) addTrace.clicked[bool].connect(self.addTrace) grid.addWidget(addTrace, 9, 0) self.color = pg.ColorButton() self.color.setFixedSize(60, 30) self.color.setColor(color=(225, 200, 50)) grid.addWidget(self.color, 8, 0) names = [ 'Num:', '', '', '', 'Show', '', '', '', 'z_em:', '', '...', '', 'z_abs', '', '...', '', 'HI', '', '...', '', 'H2', '', '...', '', 'Av', '', '...', '', 'Av_bump', '', '...', '', ] positions = [(i, j) for i in range(8) for j in range(4)] for position, name in zip(positions, names): if name == '' or (position[1] == 0 and position[0] not in [0, 2]): continue label = QLabel(name) width = 30 if name == '...' else 45 label.setFixedSize(width, 30) grid.addWidget(label, *position) self.opt_but = OrderedDict([ ('traceNum', [0, 1]), ('z_em_min', [2, 1]), ('z_em_max', [2, 3]), ('z_abs_min', [3, 1]), ('z_abs_max', [3, 3]), ('HI_min', [4, 1]), ('HI_max', [4, 3]), ('H2_min', [5, 1]), ('H2_max', [5, 3]), ('Av_min', [6, 1]), ('Av_max', [6, 3]), ('Av_bump_min', [7, 1]), ('Av_bump_max', [7, 3]), ]) validator = QDoubleValidator() validator.setLocale(QLocale('C')) for opt, pos in self.opt_but.items(): b = QLineEdit(str(getattr(self, opt))) b.setFixedSize(40, 30) b.setValidator(validator) b.textChanged[str].connect(partial(self.onChanged, attr=opt)) grid.addWidget(b, pos[0], pos[1]) for position, name in zip(positions, names): if position[1] == 0 and position[0] not in [0, 2]: s = '' if position[0] == 1 else ':' setattr(self, name, QCheckBox(name + s)) getattr(self, name).setFixedSize(80, 30) grid.addWidget(getattr(self, name), *position) self.Show.setChecked(False) self.z_abs.setChecked(True) self.z_abs.stateChanged.connect(self.checkEvent) self.HI.setChecked(True) self.H2.setChecked(True) self.Av.setChecked(False) self.Av_bump.setChecked(False) widget.setFixedSize(250, 400) widget.setLayout(grid) v.addWidget(widget) v.addWidget(line) self.addSDSSStars = QCheckBox('add SDSS stars') self.addSDSSStars.setFixedSize(200, 30) self.addSDSSStars.stateChanged.connect(self.addStellarLocus) self.addSDSSStars.setChecked(False) v.addWidget(self.addSDSSStars) self.addSDSSQSO = QCheckBox('add SDSS QSO:') self.addSDSSQSO.setFixedSize(160, 30) self.addSDSSQSO.stateChanged.connect(self.addQSOSDSS) self.addSDSSQSO.setChecked(False) v.addWidget(self.addSDSSQSO) h = QHBoxLayout() self.z_SDSS_min = QLineEdit('2.6') self.z_SDSS_min.setFixedSize(50, 30) h.addWidget(self.z_SDSS_min) label = QLabel('...') label.setFixedSize(15, 30) h.addWidget(label) self.z_SDSS_max = QLineEdit('2.8') self.z_SDSS_max.setFixedSize(50, 30) h.addWidget(self.z_SDSS_max) h.addStretch(1) v.addLayout(h) v.addWidget(line) v.addWidget(QLabel('Select by criterion:')) self.criteria = QTextEdit('') self.criteria.setFixedSize(300, 200) self.criteria.setText('r-i 0.6 0.8 \ni-g -2.0 -0.8\ng-r 0.2 0.6') v.addWidget(self.criteria) self.select = QPushButton('Apply') self.select.setFixedSize(80, 30) self.select.clicked[bool].connect(self.applyCriteria) v.addWidget(self.select) v.addWidget(line) v.addWidget(QLabel('Select by name:')) self.names = QTextEdit('') self.names.setFixedSize(300, 200) self.names.setText('7093-0632 \n6439-0160') v.addWidget(self.names) self.shownames = QPushButton('Show') self.shownames.setFixedSize(80, 30) self.shownames.clicked[bool].connect(self.applyNames) v.addWidget(self.shownames) v.addStretch(1) layout.addLayout(v) self.plot = pg.GraphicsWindow(size=(1900, 1800)) self.p = [] for comb in self.combs: p = colorColorPlot(self, comb) setattr(self, p.name, p) self.p.append(getattr(self, p.name)) self.plot.addItem(self.p[-1], row=(len(self.p) - 1) // 4, col=(len(self.p) - 1) % 4) self.setLinks() layout.addWidget(self.plot) self.setLayout(layout)
class BRFViewer(QWidget): """ Window that is used to show all the results produced with for the currently selected water level dataset. """ def __init__(self, wldset=None, parent=None): super(BRFViewer, self).__init__(parent) self.__save_ddir = osp.dirname(__rootdir__) self.setWindowTitle('BRF Results Viewer') self.setWindowIcon(icons.get_icon('master')) self.setWindowFlags(Qt.Window | Qt.CustomizeWindowHint | Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint) self.__initGUI__() self.set_wldset(wldset) def __initGUI__(self): # ---- Navigator self.btn_prev = QToolButtonNormal(icons.get_icon('go_previous')) self.btn_prev.clicked.connect(self.navigate_brf) self.btn_next = QToolButtonNormal(icons.get_icon('go_next')) self.btn_next.clicked.connect(self.navigate_brf) self.current_brf = QSpinBox() self.current_brf.setRange(0, 99) self.current_brf.setAlignment(Qt.AlignCenter) self.current_brf.setButtonSymbols(QAbstractSpinBox.NoButtons) self.current_brf.setCorrectionMode( QAbstractSpinBox.CorrectToNearestValue) self.current_brf.valueChanged.connect(self.navigate_brf) self.current_brf.setValue(0) self.total_brf = QLabel('/ 0') # ---- Language button self.btn_language = LangToolButton() self.btn_language.setToolTip( "Set the language of the text shown in the graph.") self.btn_language.sig_lang_changed.connect(self.plot_brf) self.btn_language.setIconSize(icons.get_iconsize('normal')) # ---- Toolbar # Generate the buttons : self.btn_del = QToolButtonNormal(icons.get_icon('clear_search')) self.btn_del.setToolTip('Delete current BRF results') self.btn_del.clicked.connect(self.del_brf) self.btn_save = btn_save = QToolButtonNormal(icons.get_icon('save')) btn_save.setToolTip('Save current BRF graph...') btn_save.clicked.connect(self.select_savefig_path) self.btn_setp = QToolButtonNormal(icons.get_icon('page_setup')) self.btn_setp.setToolTip('Show graph layout parameters...') self.btn_setp.clicked.connect(self.toggle_graphpannel) # Generate the layout : self.tbar = myqt.QFrameLayout() buttons = [ btn_save, self.btn_del, VSep(), self.btn_prev, self.current_brf, self.total_brf, self.btn_next, VSep(), self.btn_setp, self.btn_language ] for btn in buttons: if isinstance(btn, QLayout): self.tbar.addLayout(btn, 1, self.tbar.columnCount()) else: self.tbar.addWidget(btn, 1, self.tbar.columnCount()) row = self.tbar.columnCount() self.tbar.addWidget(HSep(), 0, 0, 1, row + 1) self.tbar.setColumnStretch(row, 100) self.tbar.setContentsMargins(10, 0, 10, 10) # (l, t, r, b) # ---- Graph Canvas self.fig_frame = QFrame() self.fig_frame.setFrameStyle(StyleDB().frame) self.fig_frame.setObjectName("figframe") self.fig_frame.setStyleSheet("#figframe {background-color:white;}") self.brf_canvas = FigureCanvasQTAgg(BRFFigure()) fflay = QGridLayout(self.fig_frame) fflay.setContentsMargins(0, 0, 0, 0) # (left, top, right, bottom) fflay.addWidget(self.tbar, 1, 0) fflay.addWidget(self.brf_canvas, 0, 0) # ---- Graph Options Panel self.graph_opt_panel = BRFOptionsPanel() self.graph_opt_panel.sig_graphconf_changed.connect(self.plot_brf) # ---- Main Layout ml = QGridLayout(self) ml.addWidget(self.fig_frame, 0, 2) ml.addWidget(self.graph_opt_panel, 0, 3) ml.setColumnStretch(1, 100) # ---- Toolbar Handlers def toggle_graphpannel(self): if self.graph_opt_panel.isVisible() is True: # Hide the panel. self.graph_opt_panel.setVisible(False) self.btn_setp.setAutoRaise(True) self.btn_setp.setToolTip('Show graph layout parameters...') w = self.size().width() - self.graph_opt_panel.size().width() self.setFixedWidth(w) else: # Show the panel. self.graph_opt_panel.setVisible(True) self.btn_setp.setAutoRaise(False) self.btn_setp.setToolTip('Hide graph layout parameters...') w = self.size().width() + self.graph_opt_panel.size().width() self.setFixedWidth(w) def navigate_brf(self): if self.sender() == self.btn_prev: cur_num = self.current_brf.value() - 1 elif self.sender() == self.btn_next: cur_num = self.current_brf.value() + 1 elif self.sender() == self.current_brf: cur_num = self.current_brf.value() self.current_brf.setValue(cur_num) self.update_brfnavigate_state() def del_brf(self): """Delete the graph and data of the currently selected result.""" index = self.current_brf.value() - 1 name = self.wldset.get_brfAt(index) self.wldset.del_brf(name) self.update_brfnavigate_state() def new_brf_added(self): self.current_brf.setMaximum(self.wldset.brf_count()) self.current_brf.setValue(self.wldset.brf_count()) self.update_brfnavigate_state() def update_brfnavigate_state(self): count = self.wldset.brf_count() self.total_brf.setText('/ %d' % count) self.current_brf.setMinimum(min(count, 1)) self.current_brf.setMaximum(count) curnt = self.current_brf.value() self.tbar.setEnabled(count > 0) self.btn_prev.setEnabled(curnt > 1) self.btn_next.setEnabled(curnt < count) self.btn_del.setEnabled(count > 0) self.plot_brf() def select_savefig_path(self): """ Opens a dialog to select a file path where to save the brf figure. """ ddir = osp.join(self.__save_ddir, 'brf_%s' % self.wldset['Well']) dialog = QFileDialog() fname, ftype = dialog.getSaveFileName(self, "Save Figure", ddir, '*.pdf;;*.svg') ftype = ftype.replace('*', '') if fname: self.__save_ddir = osp.dirname(fname) if not fname.endswith(ftype): fname = fname + ftype self.save_brf_fig(fname) def save_brf_fig(self, fname): """Saves the current BRF figure to fname.""" self.brf_canvas.figure.savefig(fname) # ---- Others def set_wldset(self, wldset): self.wldset = wldset if wldset is None: self.setEnabled(False) else: self.setEnabled(True) self.update_brfnavigate_state() def plot_brf(self): self.brf_canvas.figure.set_language(self.btn_language.language) if self.wldset.brf_count() == 0: self.brf_canvas.figure.empty_BRF() else: name = self.wldset.get_brfAt(self.current_brf.value() - 1) lag, A, err, date_start, date_end = self.wldset.get_brf(name) well = self.wldset['Well'] if self.graph_opt_panel.show_ebar is False: err = [] msize = self.graph_opt_panel.markersize draw_line = self.graph_opt_panel.draw_line ymin = self.graph_opt_panel.ymin ymax = self.graph_opt_panel.ymax yscale = self.graph_opt_panel.yscale xmin = self.graph_opt_panel.xmin xmax = self.graph_opt_panel.xmax xscale = self.graph_opt_panel.xscale time_units = self.graph_opt_panel.time_units date0 = '%02d/%02d/%04d' % (date_start[2], date_start[1], date_start[0]) date1 = '%02d/%02d/%04d' % (date_end[2], date_end[1], date_end[0]) self.brf_canvas.figure.plot_BRF(lag, A, err, date0, date1, well, msize, draw_line, [ymin, ymax], [xmin, xmax], time_units, xscale, yscale) self.brf_canvas.draw() def show(self): super(BRFViewer, self).show() qr = self.frameGeometry() if self.parentWidget(): parent = self.parentWidget() wp = parent.frameGeometry().width() hp = parent.frameGeometry().height() cp = parent.mapToGlobal(QPoint(wp / 2, hp / 2)) else: cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) self.fig_frame.setFixedSize(self.fig_frame.size()) self.setFixedSize(self.size()) self.raise_() if self.windowState() == Qt.WindowMinimized: # Window is minimised. Restore it. self.setWindowState(Qt.WindowNoState)
class Main(UI_Main): resized = QtCore.pyqtSignal() total_price: int = 0 def __init__(self): super().__init__() self.v = QVBoxLayout() self.h = QHBoxLayout() self.v.addStretch(1) self.h.addStretch(1) self.v.addLayout(self.h) self.v.addStretch(1) self.h.addStretch(1) self.modal_container = QFrame(self) self.modal_container.setObjectName('modal_container') self.modal_container.setLayout(self.v) self.resized.connect(self.on_mainWindow_resized) self.open_modal(self.login_form) def resizeEvent(self, event): self.resized.emit() def sync_cart(self): self.clear_cart() layout = self.table.products_layout for i in database.get_cart(): self.update_total_price(i._selling_price * i._count) layout.insertWidget(layout.count() - 1, ProductTableItemWidget(i)) def clear_cart(self): self.clear_layout(self.table.products_layout, 1) self.total_price = 0 self.update_payment() def add2cart(self): product = self.sender().product database.add2cart(product.id) layout = self.table.products_layout product._count = 1 self.update_total_price(product._selling_price * product._count) layout.insertWidget(0, ProductTableItemWidget(product)) def update_total_price(self, add: int): self.total_price += add self.update_payment() def on_mainWindow_resized(self): if self.modal_container: self.modal_container.setFixedSize(self.size()) @QtCore.pyqtSlot() def on_plus_clicked(self): self.open_modal(self.add_product_form) # self.open_add_product() @QtCore.pyqtSlot(str) def on_search_textEdited(self, filter_str: str = ''): self.update_list(filter_str) @QtCore.pyqtSlot(int) def on_to_pay_value_valueChanged(self, value: int = 0): self.update_payment() @QtCore.pyqtSlot() def on_pay_btn_clicked(self): database.sell() self.payment.to_pay_value.setValue(0) self.clear_cart() def update_payment(self): self.payment.surrender_value.setText( f'{self.payment.to_pay_value.value() - self.total_price}') self.payment.total_value.setText(f'{self.total_price}') def open_add_product(self): self.add_product_form.show() def update_list(self, filter_str: str = ''): self.clear_list() for p in database.get_products(filter_str): product = ProductWidget(p) product.clicked.connect(self.add2cart) self.sidebar.products_layout.insertWidget( self.sidebar.products_layout.count() - 1, product) def clear_list(self): self.clear_layout(self.sidebar.products_layout, 1) @staticmethod def clear_layout(layout, offset=0): for i in range(layout.count() - offset): layout.itemAt(i).widget().close() def open_modal(self, modal: QWidget): self.modal_container.setFixedSize(self.size()) self.modal_container.show() self.h.insertWidget(1, modal, 1) self.h.itemAt(1).widget().show() shadow = QGraphicsDropShadowEffect() shadow.setColor(QColor(0, 0, 0, 100)) shadow.setBlurRadius(50) shadow.setOffset(0, 10) modal.setGraphicsEffect(shadow) modal.setObjectName("modal") def close_modal(self): self.modal_container.hide() def close_add_product_form(self): self.close_modal() self.update_list() def close_login_form(self): self.close_modal() self.navbar.shop.setText(database.dbname) self.update_data() def update_data(self): self.update_list() self.sync_cart()
def initUI(self): fuenteSiacle = self.font() fuenteSiacle.setBold(True) fuenteSiacle.setPointSize(12) paletaBotones = self.palette() paletaBotones.setColor(QPalette.Background, QColor("#2EFEC8")) frameBotones = QFrame() frameBotones.setFrameStyle(QFrame.NoFrame) frameBotones.setAutoFillBackground(True) frameBotones.setPalette(paletaBotones) frameBotones.setFixedWidth(220) paletaPanel = self.palette() paletaPanel.setBrush(QPalette.Background, QBrush(QColor(255, 90, 0), Qt.SolidPattern)) paletaPanel.setColor(QPalette.Foreground, Qt.white) labelSiacle = QLabel("ПАНЕЛЬ УПРАВЛЕНИЯ", frameBotones) labelSiacle.setAlignment(Qt.AlignCenter | Qt.AlignVCenter) labelSiacle.setFont(fuenteSiacle) labelSiacle.setAutoFillBackground(True) labelSiacle.setPalette(paletaPanel) labelSiacle.setFixedSize(220, 46) labelSiacle.move(0, 0) # ============================================================ tamanioIcono = QSize(30, 30) botonNuevo = Boton(frameBotones) botonNuevo.setText(" Новый") botonNuevo.setToolTip("Новый клиент") botonNuevo.setCursor(Qt.PointingHandCursor) botonNuevo.move(-2, 45) botonActualizar = Boton(frameBotones) botonActualizar.setText(" Обновление") botonActualizar.setToolTip("Обновление клиента ") botonActualizar.setCursor(Qt.PointingHandCursor) botonActualizar.move(-2, 82) botonEliminar = Boton(frameBotones) botonEliminar.setText(" Удалить") botonEliminar.setToolTip("Удалить клиента") botonEliminar.setCursor(Qt.PointingHandCursor) botonEliminar.move(-2, 119) botonLimpiar = Boton(frameBotones) botonLimpiar.setText(" Закрыть") botonLimpiar.setToolTip("Закрыть бд") botonLimpiar.setCursor(Qt.PointingHandCursor) botonLimpiar.move(-2, 156) # ============================================================ paletaSuscribete = self.palette() paletaSuscribete.setBrush(QPalette.Background, QBrush(QColor(135, 206, 250), Qt.SolidPattern)) fuenteSuscribete = self.font() fuenteSuscribete.setBold(True) fuenteSuscribete.setFamily("Arial") fuenteSuscribete.setPointSize(11) labelSuscribete = QLabel("<a href='https://t.me/yarosla_0v'>АВТОР</a>", frameBotones) labelSuscribete.setAlignment(Qt.AlignCenter | Qt.AlignVCenter) labelSuscribete.setOpenExternalLinks(True) labelSuscribete.setFont(fuenteSuscribete) labelSuscribete.setAutoFillBackground(True) labelSuscribete.setPalette(paletaSuscribete) labelSuscribete.setFixedSize(220, 46) labelSuscribete.move(0, 210) paletaFrame = self.palette() paletaFrame.setColor(QPalette.Background, QColor("blue")) frameBienvenido = QFrame() frameBienvenido.setFrameStyle(QFrame.NoFrame) frameBienvenido.setAutoFillBackground(True) frameBienvenido.setPalette(paletaFrame) frameBienvenido.setFixedHeight(46) # ============================================================ paletaTitulo = self.palette() paletaTitulo.setColor(QPalette.Foreground, Qt.yellow) labelBienvenido = QLabel("Клиенты") labelBienvenido.setAlignment(Qt.AlignCenter) labelBienvenido.setFont(fuenteSiacle) labelBienvenido.setPalette(paletaTitulo) botonConfiguracion = QPushButton() botonConfiguracion.setIcon(QIcon("Imagenes/configuracion.png")) botonConfiguracion.setIconSize(QSize(24, 24)) botonConfiguracion.setToolTip("Конфигурация") botonConfiguracion.setCursor(Qt.PointingHandCursor) botonConfiguracion.setFixedWidth(36) disenioFrame = QHBoxLayout() disenioFrame.addWidget(labelBienvenido, Qt.AlignCenter) disenioFrame.addStretch() disenioFrame.addWidget(botonConfiguracion) disenioFrame.setContentsMargins(0, 0, 5, 0) frameBienvenido.setLayout(disenioFrame) # ============================================================ self.buscarLineEdit = QLineEdit() self.buscarLineEdit.setObjectName("Enter") self.buscarLineEdit.setPlaceholderText("Имя клента") self.buscarLineEdit.setMinimumSize(200, 26) botonBuscar = QPushButton("Поиск") botonBuscar.setObjectName("Поиск") botonBuscar.setCursor(Qt.PointingHandCursor) botonBuscar.setMinimumSize(60, 26) separadorTodos = QFrame() separadorTodos.setFrameShape(QFrame.VLine) separadorTodos.setFrameShadow(QFrame.Raised) separadorTodos.setFixedSize(1, 26) botonTodos = QPushButton("Все записи") botonTodos.setObjectName("Все записи") botonTodos.setCursor(Qt.PointingHandCursor) botonTodos.setMinimumSize(60, 26) nombreColumnas = ("Id", "Имя", "Фамилия", "Пол", "Дата рождения", "Страна", "Телефон") menuMostrarOcultar = QMenu() for indice, columna in enumerate(nombreColumnas, start=0): accion = QAction(columna, menuMostrarOcultar) accion.setCheckable(True) accion.setChecked(True) accion.setData(indice) menuMostrarOcultar.addAction(accion) botonMostrarOcultar = QPushButton("Скрыть столбцы") botonMostrarOcultar.setCursor(Qt.PointingHandCursor) botonMostrarOcultar.setMenu(menuMostrarOcultar) botonMostrarOcultar.setMinimumSize(180, 26) disenioBuscar = QHBoxLayout() disenioBuscar.setSpacing(10) disenioBuscar.addWidget(self.buscarLineEdit) disenioBuscar.addWidget(botonBuscar) disenioBuscar.addWidget(separadorTodos) disenioBuscar.addWidget(botonTodos) disenioBuscar.addWidget(botonMostrarOcultar) self.tabla = QTableWidget() self.tabla.setEditTriggers(QAbstractItemView.NoEditTriggers) self.tabla.setDragDropOverwriteMode(False) self.tabla.setSelectionBehavior(QAbstractItemView.SelectRows) self.tabla.setSelectionMode(QAbstractItemView.SingleSelection) self.tabla.setTextElideMode(Qt.ElideRight) # Qt.ElideNone self.tabla.setWordWrap(False) self.tabla.setSortingEnabled(False) self.tabla.setColumnCount(7) self.tabla.setRowCount(0) self.tabla.horizontalHeader().setDefaultAlignment(Qt.AlignHCenter | Qt.AlignVCenter | Qt.AlignCenter) self.tabla.horizontalHeader().setHighlightSections(False) self.tabla.horizontalHeader().setStretchLastSection(True) self.tabla.verticalHeader().setVisible(False) self.tabla.setAlternatingRowColors(True) self.tabla.verticalHeader().setDefaultSectionSize(20) # self.tabla.verticalHeader().setHighlightSections(True) self.tabla.setHorizontalHeaderLabels(nombreColumnas) self.tabla.setContextMenuPolicy(Qt.CustomContextMenu) self.tabla.customContextMenuRequested.connect(self.menuContextual) for indice, ancho in enumerate((80, 240, 240, 140, 150, 130), start=0): self.tabla.setColumnWidth(indice, ancho) # ============================================================ disenioBuscarTabla = QVBoxLayout() disenioBuscarTabla.addLayout(disenioBuscar) disenioBuscarTabla.addWidget(self.tabla) disenioBuscarTabla.setSpacing(8) disenioBuscarTabla.setContentsMargins(10, 10, 10, 0) disenioDerecho = QVBoxLayout() disenioDerecho.addWidget(frameBienvenido) disenioDerecho.addLayout(disenioBuscarTabla) disenioDerecho.setContentsMargins(0, 0, 0, 0) disenioFinal = QGridLayout() disenioFinal.addWidget(frameBotones, 0, 0) disenioFinal.addLayout(disenioDerecho, 0, 1) disenioFinal.setSpacing(0) disenioFinal.setContentsMargins(0, 0, 0, 0) self.setLayout(disenioFinal) self.copiarInformacion = QApplication.clipboard() botonNuevo.clicked.connect(self.Nuevo) botonActualizar.clicked.connect(self.Actualizar) botonEliminar.clicked.connect(self.Eliminar) botonLimpiar.clicked.connect(self.limpiarTabla) self.buscarLineEdit.returnPressed.connect(self.Buscar) botonBuscar.clicked.connect(self.Buscar) botonTodos.clicked.connect(self.Buscar) botonConfiguracion.clicked.connect(lambda: Configuracion(self).exec_()) self.tabla.itemDoubleClicked.connect(self.Suscribete) menuMostrarOcultar.triggered.connect(self.mostrarOcultar)
def prepare_layout(self): main_view = QFrame() main_view.setObjectName("CPreparingWindowView") main_view.setStyleSheet( """QFrame#CPreparingWindowView {background-image: url(Resources/images/backgrounds/prepare-background.png); border-width: 2px;}""" ) vbox_main_layout = QVBoxLayout() vbox_main_layout.setAlignment(QtCore.Qt.AlignTop) vbox_main_layout.setContentsMargins(2, 2, 2, 2) vbox_main_layout.setSpacing(0) main_view.setLayout(vbox_main_layout) self.setCentralWidget(main_view) # TITLE BAR title_bar = QFrame() title_bar.setFixedSize(500, 36) vbox_main_layout.addWidget(title_bar) # TOP PART top_part = QFrame() top_part.setFixedHeight(238) top_part.setObjectName("TopPart") top_part.setStyleSheet( """QFrame#TopPart { background-image: url(Resources/images/backgrounds/prepare-top-part.png); }""" ) vbox_main_layout.addWidget(top_part) # BOTTOM PART hbox_bottom_layout = QHBoxLayout() hbox_bottom_layout.setAlignment(QtCore.Qt.AlignTop) vbox_main_layout.addLayout(hbox_bottom_layout) parts_detail = { "Number": ["100090", "100060", "100035"], "Number of wells": ["96", "48", "24", "12", "6"], "Size (mm)": ["38000S2CL", "38000S6CL", "38000S8CL"] } for k, v in parts_detail.items(): bottom_part_element = QWidget() vbox_bottom_part_layout = QVBoxLayout() vbox_bottom_part_layout.setAlignment(QtCore.Qt.AlignTop) bottom_part_element.setLayout(vbox_bottom_part_layout) bottom_part_element.setFixedSize(299, 176) hbox_bottom_layout.addWidget(bottom_part_element) hbox_bottom_layout.setSpacing(1) # TEXT label = QLabel() label.setText(k) label.setObjectName("PreparingWindowLabel") label.setStyleSheet( """QLabel#PreparingWindowLabel { font-size: 18px }""") vbox_bottom_part_layout.addWidget(label) combo_box = QComboBox() combo_box.setObjectName("PreparingWindowComboBox") combo_box.addItems(v) bottom_part_element.setStyleSheet( """QComboBox#PreparingWindowComboBox { background-color: white; padding: 6px; font-size: 18px}""") vbox_bottom_part_layout.addWidget(combo_box)
def out_frame_func(int_lng, prj_path, mesh_name_txt): obj = None #----------------Если файл initial.pkl существует, получаем данные из него для вывода в форму---------------# initial_path_file = prj_path + '/' + mesh_name_txt + '/' + 'initial.pkl' if os.path.exists(initial_path_file): input = open(initial_path_file, 'rb') obj = pickle.load(input) input.close() vertices_visible = True blocks_visible = True if obj['spe'] == True: edges_visible = True else: edges_visible = False if obj['spp'] == True: patches_visible = True else: patches_visible = False if obj['mpp'] == True: mergepatchpairs_visible = True else: mergepatchpairs_visible = False else: vertices_visible = False blocks_visible = False edges_visible = False patches_visible = False mergepatchpairs_visible = False #-----------------------Формируем внешний вид формы для файла initial.pkl----------------------# main_lbl = QLabel() cTM_lbl = QLabel() cTM_edit = QDoubleSpinBox() cTM_edit.setFixedSize(100, 22) if obj != None: cTM_edit.setValue(obj['cTM']) nov_lbl = QLabel() nov_edit = QSpinBox() nov_edit.setFixedSize(100, 22) nov_edit.setRange(1, 1000) if obj != None: nov_edit.setValue(obj['nov']) nob_lbl = QLabel() nob_edit = QSpinBox() nob_edit.setFixedSize(100, 22) nob_edit.setRange(1, 1000) if obj != None: nob_edit.setValue(obj['nob']) spe_lbl = QLabel() spe_edit = QCheckBox() if obj != None: if obj['spe'] == True: spe_edit.setChecked(True) elif obj['spe'] == False: spe_edit.setChecked(False) nospe_lbl = QLabel() nospe_lbl.setEnabled(False) nospe_edit = QSpinBox() nospe_edit.setFixedSize(100, 22) nospe_edit.setRange(1, 100) nospe_edit.setEnabled(False) if obj != None: if spe_edit.isChecked() == True: nospe_edit.setEnabled(True) nospe_edit.setValue(obj['nospe']) nospe_lbl.setEnabled(True) spp_lbl = QLabel() spp_edit = QCheckBox() if obj != None: if obj['spp'] == True: spp_edit.setChecked(True) elif obj['spp'] == False: spp_edit.setChecked(False) nop_lbl = QLabel() nop_lbl.setEnabled(False) nop_edit = QSpinBox() nop_edit.setFixedSize(100, 22) nop_edit.setRange(1, 1000) nop_edit.setEnabled(False) if obj != None: if spp_edit.isChecked() == True: nop_edit.setEnabled(True) nop_edit.setValue(obj['nop']) nop_lbl.setEnabled(True) mpp_lbl = QLabel() mpp_lbl.setEnabled(False) mpp_edit = QCheckBox() mpp_edit.setEnabled(False) if obj != None: if obj['mpp'] == True: mpp_lbl.setEnabled(True) mpp_edit.setEnabled(True) mpp_edit.setChecked(True) nompp_lbl = QLabel() nompp_lbl.setEnabled(False) nompp_edit = QSpinBox() nompp_edit.setFixedSize(100, 22) nompp_edit.setRange(1, 1000) nompp_edit.setEnabled(False) if obj != None: if mpp_edit.isChecked() == True: nompp_edit.setEnabled(True) nompp_edit.setValue(obj['nompp']) nompp_lbl.setEnabled(True) prs_grid = QGridLayout() prs_grid.addWidget(cTM_lbl, 0, 0) prs_grid.addWidget(cTM_edit, 0, 1) prs_grid.addWidget(nov_lbl, 1, 0) prs_grid.addWidget(nov_edit, 1, 1) prs_grid.addWidget(nob_lbl, 2, 0) prs_grid.addWidget(nob_edit, 2, 1) prs_grid.addWidget(spe_lbl, 3, 0) prs_grid.addWidget(spe_edit, 3, 1) prs_grid.addWidget(nospe_lbl, 3, 2) prs_grid.addWidget(nospe_edit, 3, 3) prs_grid.addWidget(spp_lbl, 4, 0) prs_grid.addWidget(spp_edit, 4, 1) prs_grid.addWidget(nop_lbl, 4, 2) prs_grid.addWidget(nop_edit, 4, 3) prs_grid.addWidget(mpp_lbl, 5, 0) prs_grid.addWidget(mpp_edit, 5, 1) prs_grid.addWidget(nompp_lbl, 5, 2) prs_grid.addWidget(nompp_edit, 5, 3) prs_frame = QFrame() prs_frame.setFixedSize(500, 150) prs_frame.setLayout(prs_grid) # -----------------------------Кнопка сохранения--------------------------# initial_btnSave = QPushButton() initial_btnSave.setFixedSize(80, 25) buttons_hbox = QHBoxLayout() buttons_hbox.addWidget(initial_btnSave) # --------------------Определяем параметры интерфейса окна---------# if int_lng == 'Russian': main_lbl.setText("Начальные данные") cTM_lbl.setText("Масштабный коэффициент:") cTM_edit.setToolTip( "Введите положительное, отрицательное целое или дробное число") nov_lbl.setText("Количество вершин:") nov_edit.setToolTip( "Количество вершин должно быть не меньше одной") nob_lbl.setText("Количество блоков:") nob_edit.setToolTip( "Количество блоков должно быть не менее одного") spe_lbl.setText("Изогнутые ребра:") spe_edit.setToolTip( "Установите флажок при наличии изогнутых ребер") nospe_lbl.setText("Количество:") nospe_edit.setToolTip( "Количество изогнутых ребер должно быть не менее одного") spp_lbl.setText("Патчи:") spp_edit.setToolTip("Установите флажок при наличии патчей") nop_lbl.setText("Количество:") nop_edit.setToolTip( "Количество патчей должно быть не менее одного") mpp_lbl.setText("Слияние граней:") mpp_edit.setToolTip("Установите флажок при слиянии патчей блоков") nompp_lbl.setText("Количество:") nompp_edit.setToolTip( "Количество слияний должно быть не менее одного") initial_btnSave.setText("Записать") elif int_lng == 'English': main_lbl.setText("Initial data") cTM_lbl.setText("Scale factor:") cTM_edit.setToolTip( "Enter a positive, negative integer or a fractional number") nov_lbl.setText("Number of vertices:") nov_edit.setToolTip("The number of vertices must be at least one") nob_lbl.setText("Number of blocks:") nob_edit.setToolTip("The number of blocks must be at least one") spe_lbl.setText("Curved edges:") spe_edit.setToolTip("Check the box if you have curved edges") nospe_lbl.setText("Number:") nospe_edit.setToolTip( "The number of curved edges must be at least one") spp_lbl.setText("Patches:") spp_edit.setToolTip("Check the box if you have patches") nop_lbl.setText("Number:") nop_edit.setToolTip("The number of patches must be at least one") mpp_lbl.setText("Merging faces:") mpp_edit.setToolTip("Check the box when merging patch blocks") nompp_lbl.setText("Number:") nompp_edit.setToolTip("The number of mergers must be at least one") initial_btnSave.setText("Write") # -------------------------Групповой элемент формы---------------------------# initial_grid = QGridLayout() initial_grid.addWidget(main_lbl, 0, 0, alignment=QtCore.Qt.AlignCenter) initial_grid.addWidget(prs_frame, 1, 0, alignment=QtCore.Qt.AlignCenter) initial_grid.addLayout(buttons_hbox, 2, 0, alignment=QtCore.Qt.AlignCenter) initial_grid.setRowStretch(3, 6) initial_group = QGroupBox() initial_group.setLayout(initial_grid) return initial_group, spe_edit, nospe_lbl, nospe_edit, initial_btnSave, cTM_edit, nov_edit, spp_edit, nop_lbl, nop_edit, nob_edit, mpp_lbl, mpp_edit, nompp_lbl, nompp_edit, vertices_visible, blocks_visible, edges_visible, patches_visible, mergepatchpairs_visible
def initUI(self): # ======================== WIDGETS =========================== framePrincipal = QFrame(self) framePrincipal.setFrameShape(QFrame.Box) framePrincipal.setFrameShadow(QFrame.Sunken) framePrincipal.setAutoFillBackground(True) framePrincipal.setBackgroundRole(QPalette.Light) framePrincipal.setFixedSize(640,480) framePrincipal.move(10, 10) frame = QFrame(framePrincipal) frame.setFixedSize(2000, 2000) frame.move(10, 10) self.labelImagen = QLabel(frame) self.labelImagen.setAlignment(Qt.AlignCenter) self.labelImagen.setGeometry(0, 0, 640, 480) self.labelImagenUno = QLabel(frame) self.labelImagenUno.setAlignment(Qt.AlignCenter) self.labelImagenUno.setGeometry(-650, 0, 640, 480) # =================== BOTONES (QPUSHBUTTON) ================== self.buttonCargar = QPushButton("Cargar imagen", self) self.buttonCargar.setCursor(Qt.PointingHandCursor) self.buttonCargar.setFixedSize(100, 30) self.buttonCargar.move(10, 519) self.buttonEliminar = QPushButton("Eliminar imagen", self) self.buttonEliminar.setCursor(Qt.PointingHandCursor) self.buttonEliminar.setFixedSize(100, 30) self.buttonEliminar.move(120, 519) self.buttonAnterior = QPushButton("<", self) self.buttonAnterior.setObjectName("Anterior") self.buttonAnterior.setToolTip("Imagen anterior") self.buttonAnterior.setCursor(Qt.PointingHandCursor) self.buttonAnterior.setFixedSize(30, 30) self.buttonAnterior.move(230, 519) self.buttonSiguiente = QPushButton(">", self) self.buttonSiguiente.setObjectName("Siguiente") self.buttonSiguiente.setToolTip("Imagen siguiente") self.buttonSiguiente.setCursor(Qt.PointingHandCursor) self.buttonSiguiente.setFixedSize(30, 30) self.buttonSiguiente.move(265, 519) self.buttonCarpeta1= QPushButton("Carpeta 1", self) self.buttonCarpeta1.setObjectName("Carpeta1") self.buttonCarpeta1.setToolTip("Guardar en Carpeta 1") self.buttonCarpeta1.setCursor(Qt.PointingHandCursor) self.buttonCarpeta1.setFixedSize(160,30) self.buttonCarpeta1.move(300,519) self.buttonCarpeta2= QPushButton("Carpeta 2", self) self.buttonCarpeta2.setObjectName("Carpeta2") self.buttonCarpeta2.setToolTip("Guardar en Carpeta 2") self.buttonCarpeta2.setCursor(Qt.PointingHandCursor) self.buttonCarpeta2.setFixedSize(160,30) self.buttonCarpeta2.move(465,519) # ===================== CONECTAR SEÑALES ===================== self.buttonCargar.clicked.connect(self.Cargar) self.buttonEliminar.clicked.connect(self.Eliminar) self.buttonAnterior.clicked.connect(self.anteriorSiguiente) self.buttonSiguiente.clicked.connect(self.anteriorSiguiente) self.buttonCarpeta1.clicked.connect(self.GuardarCarpeta1) self.buttonCarpeta2.clicked.connect(self.GuardarCarpeta2) # Establecer los valores predeterminados self.posicion = int self.estadoAnterior, self.estadoSiguiente = False, False self.carpetaActual = QDir() self.imagenesCarpeta = []
class GuiMain(object): """ Static GUI class See module docstring for explanation. """ def setupUi(self, MainWindow): """ __init__ :param MainWindow: mainwindow object called in guis_event_handler.py """ # Presets self._presets(MainWindow) # Main Frames # *********************************************************** self._main_frame() # *********************************************************** # Left Side # *********************************************************** self._left_side() # *********************************************************** # *********************************************************** # Right Side self._right_side() # *********************************************************** # Postsets self._postsets() def _main_frame(self): """ Main layout and frame. Separation in left and right side. """ self.MainWindow.resize(1200, 900) self.MainWindow.setWindowTitle("NOViZ") self.centralwidget = QWidget(self.MainWindow) self.centralwidget.setObjectName("centralwidget") self.MainWindow.setWindowIcon(QIcon(module_dir + 'gui_imgs/NoviZ4.png')) # menu layout self.verticalLayout_menu = QVBoxLayout(self.centralwidget) self.verticalLayout_menu.setObjectName("verticalLayout_menu") self._add_menus_on_top() # main layout self.horizontalLayout_main = QHBoxLayout() self.horizontalLayout_main.setObjectName("verticalLayout_menu") self.verticalLayout_menu.addLayout(self.horizontalLayout_main) # left frame and left layout self.frame_left = QFrame() self.frame_left.setObjectName("frame_left") self.frame_left.setFrameShape(QFrame.StyledPanel) self.frame_left.setFrameShadow(QFrame.Plain) self.frame_left.setLineWidth(10) self.verticalLayout_left = QVBoxLayout(self.frame_left) self.verticalLayout_left.setObjectName("verticalLayout_left") self.horizontalLayout_main.addWidget(self.frame_left) # right frame and right layout self.frame_right = QFrame() self.frame_right.setObjectName("frame_right") self.frame_right.setFrameShape(QFrame.StyledPanel) self.frame_right.setFrameShadow(QFrame.Plain) self.frame_right.setLineWidth(10) self.verticalLayout_right = QVBoxLayout(self.frame_right) self.verticalLayout_right.setObjectName("verticalLayout_right") self.verticalLayout_right.setSizeConstraint(4) self.horizontalLayout_main.addWidget(self.frame_right) def _add_menus_on_top(self): """ init main menu """ # set up menu bar self.main_menu = QMenuBar() self.main_menu.setObjectName("main_menu") self.verticalLayout_menu.addWidget(self.main_menu) # menu entrys # file menu self.file_menu = self.main_menu.addMenu('File') self.file_menu.setObjectName("file_menu") # save self.menu_file_save = QAction("Save") self.menu_file_save.setShortcut('Ctrl+S') self.menu_file_save.setStatusTip('Save current image') self.menu_file_save.setObjectName("menu_file_save") self.file_menu.addAction(self.menu_file_save) # exit self.menu_file_exit = QAction("Exit") self.menu_file_exit.setShortcut('Ctrl+Q') self.menu_file_exit.setStatusTip('Exit application') self.menu_file_exit.setObjectName("menu_file_exit") self.file_menu.addAction(self.menu_file_exit) # view menu self.view_menu = self.main_menu.addMenu('View') self.view_menu.setObjectName("view_menu") # tracing self.menu_view_trace = QAction("Focus tracing") self.menu_view_trace.setShortcut('Ctrl+Alt+T') self.menu_view_trace.setStatusTip("Trace current point") self.menu_view_trace.setObjectName("menu_view_trace") self.view_menu.addAction(self.menu_view_trace) # dark theme self.menu_view_theme = QAction("Dark theme") self.menu_view_theme.setShortcut('Ctrl+Alt+D') self.menu_view_theme.setStatusTip("Activate dark theme") self.menu_view_theme.setObjectName("menu_view_theme") self.view_menu.addAction(self.menu_view_theme) # settings menu self.settings_menu = self.main_menu.addMenu('Settings') self.settings_menu.setObjectName("settings_menu") # figure setup self.menu_settings_figure = QAction("Figure setup") self.menu_settings_figure.setShortcut('Ctrl+Alt+F') self.menu_settings_figure.setStatusTip('Figure setup') self.menu_settings_figure.setObjectName("menu_settings_figure") self.settings_menu.addAction(self.menu_settings_figure) # plot setup self.menu_settings_plot = QAction("Plot setup") self.menu_settings_plot.setShortcut('Ctrl+Alt+P') self.menu_settings_plot.setStatusTip('Plot setup') self.menu_settings_plot.setObjectName("menu_settings_plot") self.settings_menu.addAction(self.menu_settings_plot) self.settings_menu.addSeparator() # start point self.menu_start_point = QAction("Start point") self.menu_start_point.setShortcut('Ctrl+Alt+S') self.menu_start_point.setStatusTip('Set start point') self.menu_start_point.setObjectName("menu_start_point") self.settings_menu.addAction(self.menu_start_point) # speed self.menu_speed = QAction("Animation Speed") self.menu_speed.setShortcut('Ctrl+Alt+.') self.menu_speed.setStatusTip('Set animatio speed') self.menu_speed.setObjectName('menu_speed') self.settings_menu.addAction(self.menu_speed) # help menu self.help_menu = self.main_menu.addMenu('Help') self.help_menu.setObjectName("help_menu") # Manual self.menu_settings_manual = QAction("Manual") self.menu_settings_manual.setShortcut('Ctrl+Alt+M') self.menu_settings_manual.setStatusTip('Open Manual') self.menu_settings_manual.setObjectName("menu_settings_manual") self.help_menu.addAction(self.menu_settings_manual) # About self.menu_settings_about = QAction("About") self.menu_settings_about.setShortcut('Ctrl+Alt+A') self.menu_settings_about.setStatusTip('About this Programm') self.menu_settings_about.setObjectName("menu_settings_about") self.help_menu.addAction(self.menu_settings_about) def _left_side(self): """ Init left side objects: - Plot canvas - Player and settings buttons in layout and frame """ # plot label # Input layout for matplotlib canvas object self.verticalLayout_plot_canvas = QVBoxLayout() self.verticalLayout_plot_canvas.setObjectName( "verticalLayout_plot_canvas") self.verticalLayout_left.addLayout(self.verticalLayout_plot_canvas) # player button frame and layout self.frame_playerbuttons = QFrame() self.frame_playerbuttons.setObjectName("frame_playerbuttons") self.frame_playerbuttons.setFrameShape(QFrame.StyledPanel) self.frame_playerbuttons.setFrameShadow(QFrame.Plain) self.frame_playerbuttons.setLineWidth(10) self.verticalLayout_left.addWidget(self.frame_playerbuttons) self.verticalLayout_playerbottons = QHBoxLayout( self.frame_playerbuttons) self.verticalLayout_playerbottons.setObjectName( "verticalLayout_playerbottons") self._add_player_buttons() def _right_side(self): """ Init right side objects: - function / method combo boxes with layout and frames - function parameter display and button with layout and frame - method parameter display and button with layout and frame - pseudocode display - go and reset button with layput and frame """ # combo boxes frame and layouts # function/method self.frame_combo_boxes = QFrame() self.frame_combo_boxes.setObjectName("frame_combo_boxes") self.frame_combo_boxes.setFrameShape(QFrame.StyledPanel) self.frame_combo_boxes.setFrameShadow(QFrame.Plain) self.frame_combo_boxes.setLineWidth(10) self.frame_combo_boxes.setFixedSize(200, 70) self.verticalLayout_right.addWidget(self.frame_combo_boxes) self.verticalLayout_combo_boxes = QVBoxLayout(self.frame_combo_boxes) self.verticalLayout_combo_boxes.setObjectName( "verticalLayout_combo_boxes") # inner combo box frame layouts self.horizontalLayout_function = QHBoxLayout() self.horizontalLayout_function.setObjectName( "horizontalLayout_function") self.verticalLayout_combo_boxes.addLayout( self.horizontalLayout_function) self.horizontalLayout_method = QHBoxLayout() self.horizontalLayout_method.setObjectName("horizontalLayout_method") self.verticalLayout_combo_boxes.addLayout(self.horizontalLayout_method) # combo box and label function self.label_function = QLabel() self.label_function.setObjectName("label_function") self.label_function.setText("Function:") self.horizontalLayout_function.addWidget(self.label_function) self.horizontalLayout_function.setObjectName("label_function") self.comboBox_function = QComboBox(self.centralwidget) self.comboBox_function.setObjectName("comboBox_function") self.comboBox_function.addItem("") self.horizontalLayout_function.addWidget(self.comboBox_function) # combo box and label method self.label_method = QLabel() self.label_function.setObjectName("label_method") self.label_method.setText("Method:") self.horizontalLayout_method.addWidget(self.label_method) self.horizontalLayout_method.setObjectName("horizontalLayout_method") self.comboBox_method = QComboBox(self.centralwidget) self.comboBox_method.setObjectName("comboBox_method") self.comboBox_method.addItem("") self.horizontalLayout_method.addWidget(self.comboBox_method) # start point # frame and layout self.frame_start_point = QFrame() self.frame_start_point.setObjectName("frame_start_point") self.frame_start_point.setFrameShape(QFrame.StyledPanel) self.frame_start_point.setFrameShadow(QFrame.Plain) self.frame_start_point.setLineWidth(10) self.frame_start_point.setFixedSize(200, 40) self.verticalLayout_right.addWidget(self.frame_start_point) self.horizontalLayout_start_point = QHBoxLayout(self.frame_start_point) self.horizontalLayout_start_point.setObjectName( "horizontalLayout_start_point") # button self.button_set_start_point = QPushButton() self.button_set_start_point.setObjectName("button_set_start_point") self.button_set_start_point.setText("Set start point") self.horizontalLayout_start_point.addWidget( self.button_set_start_point) # label self.label_start_point = QLabel() self.label_start_point.setObjectName("label_start_point") self.label_start_point.setAlignment(Qt.AlignCenter) self.horizontalLayout_start_point.addWidget(self.label_start_point) # function parameters # function parameters frame and layout self.frame_function_parameters = QFrame() self.frame_function_parameters.setObjectName( "frame_function_parameters") self.frame_function_parameters.setFrameShape(QFrame.StyledPanel) self.frame_function_parameters.setFrameShadow(QFrame.Plain) self.frame_function_parameters.setLineWidth(10) self.frame_function_parameters.setFixedSize(200, 150) self.verticalLayout_right.addWidget(self.frame_function_parameters) self.verticalLayout_function_parameters = QVBoxLayout( self.frame_function_parameters) self.verticalLayout_function_parameters.setObjectName( "verticalLayout_function_parameters") # function parameter label self.label_function_parameters = QLabel() self.label_function_parameters.setObjectName( "label_function_parameters") self.label_function_parameters.setText("Parameterized function:") self.verticalLayout_function_parameters.addWidget( self.label_function_parameters) self.label_function_parameters_show = QLabel() self.label_function_parameters_show.setObjectName( "label_function_parameters_show") self.label_function_parameters_show.setFont(self.italic_font) self.label_function_parameters_show.setText(" not set yet") self.label_function_parameters_show.setFixedHeight(80) self.verticalLayout_function_parameters.addWidget( self.label_function_parameters_show) # with scrolling self.scroll_area_label_function = QScrollArea() self.scroll_area_label_function.setObjectName( "scroll_area_label_function") self.scroll_area_label_function.setWidgetResizable(True) self.scroll_area_label_function.setFixedHeight(80) self.scroll_area_label_function.setWidget( self.label_function_parameters_show) self.verticalLayout_function_parameters.addWidget( self.scroll_area_label_function) # function parameter button self.button_function_parameter = QPushButton() self.button_function_parameter.setObjectName( "button_function_parameter") self.button_function_parameter.setText("Set Parameters") self.verticalLayout_function_parameters.addWidget( self.button_function_parameter) # method parameters # method parameters frame and layout self.frame_method_parameters = QFrame() self.frame_method_parameters.setObjectName("frame_method_parameters") self.frame_method_parameters.setFrameShape(QFrame.StyledPanel) self.frame_method_parameters.setFrameShadow(QFrame.Plain) self.frame_method_parameters.setLineWidth(10) self.frame_method_parameters.setFixedSize(200, 150) self.verticalLayout_right.addWidget(self.frame_method_parameters) self.verticalLayout_method_parameters = QVBoxLayout( self.frame_method_parameters) self.verticalLayout_method_parameters.setObjectName( "verticalLayout_method_parameters") # method parameter label self.label_method_parameters = QLabel() self.label_method_parameters.setObjectName("label_method_parameters") self.label_method_parameters.setText("Method parameters:") self.verticalLayout_method_parameters.addWidget( self.label_method_parameters) self.label_method_parameters_show = QLabel() self.label_method_parameters_show.setObjectName( "label_method_parameters_show") self.label_method_parameters_show.setFont(self.italic_font) self.label_method_parameters_show.setText(" not set yet") self.label_method_parameters_show.setFixedHeight(80) self.verticalLayout_method_parameters.addWidget( self.label_method_parameters_show) # with scrolling self.scroll_area_label_method = QScrollArea() self.scroll_area_label_method.setObjectName("scroll_area_label_method") self.scroll_area_label_method.setWidgetResizable(True) self.scroll_area_label_method.setFixedHeight(80) self.scroll_area_label_method.setWidget( self.label_method_parameters_show) self.verticalLayout_method_parameters.addWidget( self.scroll_area_label_method) # method parameter button self.button_method_parameter = QPushButton() self.button_method_parameter.setObjectName("button_method_parameter") self.button_method_parameter.setText("Set Parameters") self.verticalLayout_method_parameters.addWidget( self.button_method_parameter) # pseudocode self.label_animation_pseudocode = PseudocodeHighlightAnimation() self.label_animation_pseudocode.setObjectName( "label_animation_pseudocode") self.verticalLayout_right.addWidget(self.label_animation_pseudocode) # show and reset button frame and layout self.frame_show_reset = QFrame() self.frame_show_reset.setObjectName("frame_show_reset") self.frame_show_reset.setFrameShape(QFrame.StyledPanel) self.frame_show_reset.setFrameShadow(QFrame.Plain) self.frame_show_reset.setLineWidth(10) self.frame_show_reset.setFixedSize(200, 90) self.verticalLayout_right.addWidget(self.frame_show_reset) self.verticalLayout_show_reset = QVBoxLayout(self.frame_show_reset) self.verticalLayout_show_reset.setObjectName( "verticalLayout_show_reset") # show button self.button_calculate = QPushButton() self.button_calculate.setObjectName("button_calculate") self.verticalLayout_show_reset.addWidget(self.button_calculate) self.button_calculate.setText('Calculate') # reset button self.button_reset = QPushButton() self.button_reset.setObjectName("button_reset") self.verticalLayout_show_reset.addWidget(self.button_reset) self.button_reset.setText('Reset') def _add_player_buttons(self): """ Init 'media' player buttons as well as all other buttons in this frame """ # player buttons size policy self.button_policy = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding) # first button self.button_first = QPushButton(self.centralwidget) self.button_first.setObjectName("button_first") self.first_icon = QIcon(module_dir + 'gui_imgs/first.png') self.button_first.setIcon(self.first_icon) self.button_first.setIconSize(QSize(35, 35)) self.button_first.setFlat(True) self.verticalLayout_playerbottons.addWidget(self.button_first, alignment=Qt.AlignRight) # previous button self.button_prev = QPushButton(self.centralwidget) self.button_prev.setObjectName("button_prev") self.prev_icon = QIcon(module_dir + 'gui_imgs/prev.png') self.button_prev.setIcon(self.prev_icon) self.button_prev.setIconSize(QSize(50, 50)) self.button_prev.setFlat(True) self.verticalLayout_playerbottons.addWidget(self.button_prev, alignment=Qt.AlignLeft) # play / pause button self.button_play_pause = QPushButton(self.centralwidget) self.button_play_pause.setObjectName("button_play_pause") self.button_play_pause_icon = QIcon(module_dir + 'gui_imgs/play.png') self.button_play_pause.setIcon(self.button_play_pause_icon) self.button_play_pause.setIconSize(QSize(55, 55)) self.button_play_pause.setFlat(True) self.verticalLayout_playerbottons.addWidget(self.button_play_pause, alignment=Qt.AlignCenter) # next button self.button_next = QPushButton(self.centralwidget) self.button_next.setObjectName("button_next") self.next_icon = QIcon(module_dir + 'gui_imgs/next.png') self.button_next.setIcon(self.next_icon) self.button_next.setIconSize(QSize(50, 50)) self.button_next.setFlat(True) self.verticalLayout_playerbottons.addWidget(self.button_next, alignment=Qt.AlignRight) # last button self.button_last = QPushButton(self.centralwidget) self.button_last.setObjectName("button_last") self.last_icon = QIcon(module_dir + 'gui_imgs/last.png') self.button_last.setIcon(self.last_icon) self.button_last.setIconSize(QSize(35, 35)) self.button_last.setFlat(True) self.verticalLayout_playerbottons.addWidget(self.button_last, alignment=Qt.AlignLeft) # array position and xy mouse coords self.verticalLayout_pos_xy = QVBoxLayout() self.verticalLayout_pos_xy.setObjectName("verticalLayout_pos_xy") self.verticalLayout_playerbottons.addLayout(self.verticalLayout_pos_xy) # array position self.horizontalLayout_array_position = QHBoxLayout() self.horizontalLayout_array_position.setObjectName( "horizontalLayout_startpoint") self.horizontalLayout_array_position.setSizeConstraint( QVBoxLayout.SetFixedSize) self.verticalLayout_pos_xy.addLayout( self.horizontalLayout_array_position) # array position spinbox self.spinbox_currentposition = QSpinBox() self.spinbox_currentposition.setObjectName("spinbox_currentposition") self.spinbox_currentposition.setValue(0) self.spinbox_currentposition.setMaximum(0) self.horizontalLayout_array_position.addWidget( self.spinbox_currentposition) # array length lable self.label_arraylength = QLabel() self.label_arraylength.setObjectName("label_arraylength") self.label_arraylength.setText("/ -") self.horizontalLayout_array_position.addWidget(self.label_arraylength) # xy cords self.label_xy = QLabel() self.label_xy.setObjectName("label_xy") self.label_xy.setText("x: | y:") self.verticalLayout_pos_xy.addWidget(self.label_xy) # speed control self.verticalLayout_speed = QVBoxLayout() self.verticalLayout_playerbottons.addLayout(self.verticalLayout_speed) # slow fast label self.label_speed = QLabel() self.label_speed.setText("slow fast") self.label_speed.setAlignment(Qt.AlignBottom) self.verticalLayout_speed.addWidget(self.label_speed) # slider self.slider_speed = QSlider(Qt.Horizontal) self.slider_speed.setObjectName("slider_speed") self.slider_speed.setTickInterval(25) self.slider_speed.setFixedSize(75, 20) self.slider_speed.setSingleStep(1) self.slider_speed.setValue(50) self.slider_speed.setTickPosition(QSlider.NoTicks) self.verticalLayout_speed.addWidget(self.slider_speed) def _presets(self, MainWindow): """ Helper variables to be used in object inits :param MainWindow: MainWindow object. see main.py and guis_event_handler.py for further information """ self.italic_font = QFont() self.italic_font.setItalic(True) self.non_italic_font = QFont() self.non_italic_font.setItalic(False) self.MainWindow = MainWindow def _postsets(self): """ No Idea what this is doing """ self.MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QStatusBar(self.MainWindow) self.statusbar.setObjectName("statusbar") self.MainWindow.setStatusBar(self.statusbar) QMetaObject.connectSlotsByName(self.MainWindow) def set_pseudocode(self, pseudocode_pos): """ Sets the pseudo code picture anew :param pseudocode_pos: current pseudo code line number """ self.label_animation_pseudocode.move(pseudocode_pos)
class MainWindow(QMainWindow): def reset_canvas_action(self): self.item_cnt = 0 self.canvas_widget.reset_canvas() #self.list_widget.clear() self.list_widget.currentTextChanged.disconnect( self.canvas_widget.selection_changed) self.list_widget.clear() self.list_widget.currentTextChanged.connect( self.canvas_widget.selection_changed) self.scene = QGraphicsScene(self) self.scene.setSceneRect(1, 1, 601, 601) #挪一个像素,不然会有边框线 self.item_cnt = 0 self.statusBar().showMessage('重置画布') self.canvas_widget.setScene(self.scene) #self.canvas_widget = MyCanvas(self.scene, self.Image_window) #解决了一个bug参考 https://blog.csdn.net/yaowangII/article/details/80929261 def save_canvas_action(self): # pixMap = view->grab(view->sceneRect().toRect()); # QString # fileName = QFileDialog::getSaveFileName(this, "Save image", # QCoreApplication::applicationDirPath(), "BMP Files (*.bmp);;JPEG (*.JPEG);;PNG (*.png)" ); # filename=QFileDialog.getSaveFileName("Save image",QCoreApplication.applicationDirPath(),"BMP Files (*.bmp);;JPEG (*.JPEG);;PNG (*.png)") filename, ok2 = QFileDialog.getSaveFileName( self, "Save Image", QDir.currentPath(), "BMP Files (*.bmp);;JPEG (*.JPEG);;PNG (*.png)") # pixmap = QPixmap() pixmap = self.canvas_widget.grab( self.canvas_widget.sceneRect().toRect()) pixmap.save(filename) def theme1_action(self): self.setStyleSheet(css1) def theme2_action(self): self.setStyleSheet(css2) def Menu_init(self): menubar = self.menuBar() # 菜单栏 mfile = menubar.addMenu("文件") themefile = menubar.addMenu("主题") # 重置 reset_canvas_act = QAction(QIcon("./icon/file.png"), "重置画布", self) reset_canvas_act.triggered.connect( self.reset_canvas_action) # To be done # 保存 save_canvas_act = QAction(QIcon("./icon/save.png"), "保存画布", self) save_canvas_act.triggered.connect(self.save_canvas_action) #默认主题: theme1_act = QAction("Blue theme", self) theme1_act.triggered.connect(self.theme1_action) theme2_act = QAction("Coffee theme", self) theme2_act.triggered.connect(self.theme2_action) # 将action添加到file上面 mfile.addAction(reset_canvas_act) mfile.addAction(save_canvas_act) #将action添加到theme上面 themefile.addAction(theme1_act) themefile.addAction(theme2_act) # 工具栏 toolbar = QToolBar() toolbar.setMovable(False) self.addToolBar(toolbar) toolbar.addAction(reset_canvas_act) toolbar.addAction(save_canvas_act) def pen_width(self): w = self.spinbox_penwidth.text() w = int(w) # print("w:" + w) self.canvas_widget.setpenWidth(w) self.statusBar().showMessage('宽度为%d' % (w)) def pen_color(self): c = QColorDialog.getColor() self.frame_color.setPalette(QPalette(c)) # assert(0) self.frame_color.setStyleSheet("QWidget { background-color: %s }" % c.name()) # self.frame_color.setStyleSheet("QFrame{background-color: rgba("+c.red()+","+c.green()+","+c.blue()+",1);border:none}") # print(c.red()) # 参考了https://www.cnblogs.com/icat-510/p/10166882.html self.canvas_widget.setpenColor(c) def Color_init(self): colorbar = QToolBar("画笔属性栏") self.addToolBar(colorbar) colorbar.setMovable(True) label_penwidth = QLabel("画笔宽度") self.spinbox_penwidth = QSpinBox() self.spinbox_penwidth.setRange(1, 50) self.spinbox_penwidth.setValue(2) self.color_botton = QPushButton("画笔颜色") self.frame_color = QFrame(self) self.frame_color.setObjectName("colorframe") self.frame_color.setFrameShape(QFrame.Box) self.frame_color.setPalette(QPalette(Qt.black)) self.frame_color.setAutoFillBackground(True) self.frame_color.setFixedSize(30, 30) self.frame_color.setStyleSheet( "QFrame{background-color: rgba(0,0,0,1);border:none}") # 槽函数 self.spinbox_penwidth.valueChanged[int].connect(self.pen_width) self.color_botton.clicked.connect(self.pen_color) # 布局 color_layout = QHBoxLayout() color_layout.setAlignment(Qt.AlignLeft) color_layout.addWidget(label_penwidth) color_layout.addWidget(self.spinbox_penwidth) color_layout.addWidget(self.color_botton) color_layout.addWidget(self.frame_color) color_widget = QWidget() color_widget.setLayout(color_layout) colorbar.addWidget(color_widget) def layout_init(self): # p=self.takeCentralWidget() self.setDockNestingEnabled(True) # 允许嵌套 self.Tool_window = QDockWidget("工具栏") self.setCentralWidget(self.Image_window) self.addDockWidget(Qt.TopDockWidgetArea, self.Tool_window) self.addDockWidget(Qt.RightDockWidgetArea, self.List_window) def line_action(self, algorithm): self.canvas_widget.start_draw_line(algorithm, self.get_id()) self.statusBar().showMessage(algorithm + '算法绘制线段:左键点击绘制,松开结束') self.list_widget.clearSelection() self.canvas_widget.clear_selection() def DDA_line_draw_action(self): self.line_action('DDA') def Bresenham_line_draw_action(self): self.line_action('Bresenham') def polygon_action(self, algorithm): self.canvas_widget.start_draw_polygon(algorithm, self.get_id()) self.statusBar().showMessage(algorithm + '算法绘制多边形:左键点击设置控制点,右键或者切换其他工具栏图标结束') self.list_widget.clearSelection() self.canvas_widget.clear_selection() def DDA_polygon_draw_action(self): self.polygon_action('DDA') def Bresenham_polygon_draw_action(self): self.polygon_action('Bresenham') def ellipse_draw_action(self): self.canvas_widget.start_draw_ellipse(self.get_id()) self.statusBar().showMessage('中心圆算法绘制椭圆:左键点击设置控制点1,拖动松开后设置控制点2,完成绘制') self.list_widget.clearSelection() self.canvas_widget.clear_selection() def curve_draw_action(self, algorithm): self.canvas_widget.start_draw_curve(algorithm, self.get_id()) self.statusBar().showMessage(algorithm + '算法绘制曲线:左键点击设置控制点,右键或者点击其他工具栏图标结束绘制') self.list_widget.clearSelection() self.canvas_widget.clear_selection() def Bezier_curve_draw_action(self): self.curve_draw_action('Bezier') def B_spline_curve_draw_action(self): self.curve_draw_action('B-spline') def translate_draw_action(self): self.canvas_widget.start_draw_translate() self.statusBar().showMessage('平移图元:选择图元之后任意拖动,松开结束') # self.list_widget.clearSelection() # self.canvas_widget.clear_selection() def rotate_draw_action(self): self.canvas_widget.start_draw_rotate() self.statusBar().showMessage('旋转图元:选择图元之后任意旋转,松开结束') def scale_draw_action(self): self.canvas_widget.start_draw_scale() self.statusBar().showMessage('缩放图元:选择图元之后任意移动,松开结束') def clip_draw_action(self, algorithm): self.canvas_widget.start_draw_clip(algorithm) self.statusBar().showMessage(algorithm + '裁剪线段:选择线段图元之后,左键点击拖动得到红色的裁剪框,松开结束') def Cohen_Sutherland_clip_draw_action(self): self.clip_draw_action("Cohen-Sutherland") def Liang_Barsky_clip_draw_action(self): self.clip_draw_action("Liang-Barsky") def cursor_draw_action(self): self.canvas_widget.start_cursor_selection() self.statusBar().showMessage('鼠标选择:左键点击任意图元进行选择') def fill_draw_action(self): self.canvas_widget.start_fill_polygon() self.statusBar().showMessage('多边形填充:选择多边形图元之后根据颜色框颜色填充') def polygon_clip_draw_action(self): self.canvas_widget.start_cut_polygon() self.statusBar().showMessage('多边形裁剪:选择多边形图元之后左键点击拖动得到绿色裁剪框进行裁剪') def x_mirror_draw_action(self): self.canvas_widget.start_x_mirror_draw() self.statusBar().showMessage('水平方向镜像:选择图元之后点击按钮') def y_mirror_draw_action(self): self.canvas_widget.start_y_mirror_draw() self.statusBar().showMessage('竖直方向镜像:选择图元之后点击按钮') def copy_draw_action(self): self.canvas_widget.start_copy_draw(self.get_id()) self.statusBar().showMessage('复制粘贴:选择图元之后点击按钮,在原位置复制') def delete_draw_action(self): self.canvas_widget.start_delete_draw() self.statusBar().showMessage('删除图元:选择图元之后点击按钮删除') def tool_init(self): # line相关,使用的https://www.walletfox.com/course/customqtoolbutton.php做的可选算法button self.line_action_1 = QAction("DDA line") self.line_action_2 = QAction("Bresenham line") self.line_action_1.setIcon(QIcon("./icon/line.png")) self.line_action_2.setIcon(QIcon("./icon/line.png")) self.line_action_1.triggered.connect(self.DDA_line_draw_action) self.line_action_2.triggered.connect(self.Bresenham_line_draw_action) self.line_menu = QMenu() self.line_menu.addAction(self.line_action_1) self.line_menu.addAction(self.line_action_2) self.line_tool_button = CusToolButton() self.line_tool_button.setMenu(self.line_menu) self.line_tool_button.setDefaultAction(self.line_action_1) self.line_tool_bar = QToolBar(self) self.line_tool_bar.addWidget(self.line_tool_button) # polygon相关 self.polygon_action_1 = QAction("DDA polygon") self.polygon_action_2 = QAction("Bresenham polygon") self.polygon_action_1.setIcon(QIcon("./icon/polygon.png")) self.polygon_action_2.setIcon(QIcon("./icon/polygon.png")) self.polygon_action_1.triggered.connect(self.DDA_polygon_draw_action) self.polygon_action_2.triggered.connect( self.Bresenham_polygon_draw_action) self.polygon_menu = QMenu() self.polygon_menu.addAction(self.polygon_action_1) self.polygon_menu.addAction(self.polygon_action_2) self.polygon_tool_button = CusToolButton() self.polygon_tool_button.setMenu(self.polygon_menu) self.polygon_tool_button.setDefaultAction(self.polygon_action_1) self.polygon_tool_bar = QToolBar(self) self.polygon_tool_bar.addWidget(self.polygon_tool_button) # ellipse相关 self.ellipse_action = QAction("Ellipse") self.ellipse_action.setIcon(QIcon("./icon/ellipse.png")) self.ellipse_action.triggered.connect(self.ellipse_draw_action) self.ellipse_tool_bar = QToolBar(self) self.ellipse_tool_bar.addAction(self.ellipse_action) # curve相关 self.curve_action_1 = QAction("Bezier Curve") self.curve_action_1.setIcon(QIcon("./icon/curve.png")) self.curve_action_2 = QAction("B-spline Curve") self.curve_action_2.setIcon(QIcon("./icon/curve.png")) self.curve_action_1.triggered.connect(self.Bezier_curve_draw_action) self.curve_action_2.triggered.connect(self.B_spline_curve_draw_action) self.curve_menu = QMenu() self.curve_menu.addAction(self.curve_action_1) self.curve_menu.addAction(self.curve_action_2) self.curve_tool_button = CusToolButton() self.curve_tool_button.setMenu(self.curve_menu) self.curve_tool_button.setDefaultAction(self.curve_action_1) self.curve_tool_bar = QToolBar(self) self.curve_tool_bar.addWidget(self.curve_tool_button) # translate相关(平移) self.translate_action = QAction("Translate") self.translate_action.setIcon(QIcon("./icon/move.png")) self.translate_action.triggered.connect(self.translate_draw_action) self.translate_tool_bar = QToolBar(self) self.translate_tool_bar.addAction(self.translate_action) # rotate相关 旋转 self.rotate_action = QAction("Rotate") self.rotate_action.setIcon(QIcon("./icon/rotate.png")) self.rotate_action.triggered.connect(self.rotate_draw_action) self.rotate_tool_bar = QToolBar(self) self.rotate_tool_bar.addAction(self.rotate_action) # scale相关,缩放; self.scale_action = QAction("Scale") self.scale_action.setIcon(QIcon("./icon/scale.png")) self.scale_action.triggered.connect(self.scale_draw_action) self.scale_tool_bar = QToolBar(self) self.scale_tool_bar.addAction(self.scale_action) # clip 裁剪 self.clip_action_1 = QAction("Cohen-Sutherland Clip") self.clip_action_2 = QAction("Liang-Barsky Clip") self.clip_action_1.setIcon(QIcon("./icon/crop.png")) self.clip_action_2.setIcon(QIcon("./icon/crop.png")) self.clip_action_1.triggered.connect( self.Cohen_Sutherland_clip_draw_action) self.clip_action_2.triggered.connect( self.Liang_Barsky_clip_draw_action) self.clip_menu = QMenu() self.clip_menu.addAction(self.clip_action_1) self.clip_menu.addAction(self.clip_action_2) self.clip_tool_button = CusToolButton() self.clip_tool_button.setMenu(self.clip_menu) self.clip_tool_button.setDefaultAction(self.clip_action_1) self.clip_tool_bar = QToolBar(self) self.clip_tool_bar.addWidget(self.clip_tool_button) #鼠标选择相关; self.cursor_action = QAction("Cursor") self.cursor_action.setIcon(QIcon("./icon/cursor.png")) self.cursor_action.triggered.connect(self.cursor_draw_action) self.cursor_tool_bar = QToolBar(self) self.cursor_tool_bar.addAction(self.cursor_action) #多边形填充相关: self.fill_action = QAction("Fill") self.fill_action.setIcon(QIcon("./icon/fill.png")) self.fill_action.triggered.connect(self.fill_draw_action) self.fill_tool_bar = QToolBar(self) self.fill_tool_bar.addAction(self.fill_action) #多边形裁剪相关: self.polygon_clip_action = QAction("Polygon Clip") self.polygon_clip_action.setIcon(QIcon("./icon/cut_polygon.png")) self.polygon_clip_action.triggered.connect( self.polygon_clip_draw_action) self.polygon_clip_tool_bar = QToolBar(self) self.polygon_clip_tool_bar.addAction(self.polygon_clip_action) #x轴镜像相关: self.x_mirror_action = QAction("X Axis Mirror") self.x_mirror_action.setIcon(QIcon("./icon/flip_horizontal.png")) self.x_mirror_action.triggered.connect(self.x_mirror_draw_action) self.x_mirror_tool_bar = QToolBar(self) self.x_mirror_tool_bar.addAction(self.x_mirror_action) #y轴镜像相关: self.y_mirror_action = QAction("Y Axis Mirror") self.y_mirror_action.setIcon(QIcon("./icon/flip_vertical.png")) self.y_mirror_action.triggered.connect(self.y_mirror_draw_action) self.y_mirror_tool_bar = QToolBar(self) self.y_mirror_tool_bar.addAction(self.y_mirror_action) #复制粘贴相关: self.copy_action = QAction("Copy paste") self.copy_action.setIcon(QIcon("./icon/copy.png")) self.copy_action.triggered.connect(self.copy_draw_action) self.copy_tool_bar = QToolBar(self) self.copy_tool_bar.addAction(self.copy_action) #删除图元相关: self.delete_action = QAction("Delete") self.delete_action.setIcon(QIcon("./icon/trash.png")) self.delete_action.triggered.connect(self.delete_draw_action) self.delete_tool_bar = QToolBar(self) self.delete_tool_bar.addAction(self.delete_action) # #布局 tools_layout = QGridLayout() tools_layout.setAlignment(Qt.AlignLeft) tools_layout.addWidget(self.line_tool_bar, 0, 0) tools_layout.addWidget(self.polygon_tool_bar, 0, 1) tools_layout.addWidget(self.ellipse_tool_bar, 0, 2) tools_layout.addWidget(self.curve_tool_bar, 0, 3) tools_layout.addWidget(self.translate_tool_bar, 0, 4) tools_layout.addWidget(self.rotate_tool_bar, 0, 5) tools_layout.addWidget(self.scale_tool_bar, 0, 6) tools_layout.addWidget(self.clip_tool_bar, 0, 7) tools_layout.addWidget(self.cursor_tool_bar, 0, 8) tools_layout.addWidget(self.fill_tool_bar, 0, 9) tools_layout.addWidget(self.polygon_clip_tool_bar, 0, 10) tools_layout.addWidget(self.x_mirror_tool_bar, 0, 11) tools_layout.addWidget(self.y_mirror_tool_bar, 0, 12) tools_layout.addWidget(self.copy_tool_bar, 0, 13) tools_layout.addWidget(self.delete_tool_bar, 0, 14) # 加入tool_window tools_widget = QWidget(self.Tool_window) tools_widget.setLayout(tools_layout) self.Tool_window.setWidget(tools_widget) self.Tool_window.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # # # #按钮组 通过按钮组的值连接槽函数确定状态 # toolbuttons=QButtonGroup() # toolbuttons.addButton(line_button_1,1) # # # toolbuttons.buttonClicked[int].connect(self.tool_clicked) # def tool_clicked(self,type:int): # a=type def __init__(self): super().__init__() self.item_cnt = 0 ## 主窗口布局 # 图片与标题 QMainWindow.setWindowIcon(self, QIcon("./picture/icon.png")) QMainWindow.setWindowTitle(self, "Image Editor By ytr") # self.setWindowTitle('CG Demo') # 界面大小位置 # QMainWindow.resize(self,QApplication.desktop().width()*0.9,QApplication.desktop().height()*0.9) # QMainWindow.move(self,QApplication.desktop().width()*0.05,QApplication.desktop().height()*0.05) self.Menu_init() self.Color_init() self.Image_window = QDockWidget("图像编辑框") self.Image_window.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) self.Image_window.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.Image_window.setMinimumSize(620, 620) #大一点点 不然会有边框线 self.List_window = QDockWidget("图元列表") self.List_window.setFeatures(QDockWidget.DockWidgetMovable) self.list_widget = QListWidget(self.List_window) self.list_widget.setMinimumWidth(200) self.scene = QGraphicsScene(self) self.scene.setSceneRect(1, 1, 601, 601) #挪一个像素,不然会有边框线 self.canvas_widget = MyCanvas(self.scene, self.Image_window) self.canvas_widget.setFixedSize(610, 610) #这样就没有滑动条了 self.canvas_widget.main_window = self self.canvas_widget.list_widget = self.list_widget self.List_window.setWidget(self.list_widget) self.Image_window.setWidget(self.canvas_widget) self.setCentralWidget(self.Image_window) height = self.Image_window.height() width = self.Image_window.width() center_y = (self.canvas_widget.geometry().height() - height) / 2 center_x = (self.canvas_widget.geometry().width() - width) / 2 self.canvas_widget.setGeometry(center_x, center_y, self.canvas_widget.geometry().width(), self.canvas_widget.geometry().height()) self.canvas_widget.setAlignment(Qt.AlignCenter) # 槽函数 self.list_widget.currentTextChanged.connect( self.canvas_widget.selection_changed) self.layout_init() self.tool_init() self.setStyleSheet(css) # self.hbox_layout = QHBoxLayout() # self.hbox_layout.addWidget(self.canvas_widget) # self.hbox_layout.addWidget(self.list_widget, stretch=1) # self.central_widget = QWidget(self.Image_window) # self.central_widget.setLayout(self.hbox_layout) # self.setCentralWidget(self.central_widget) self.statusBar().showMessage('空闲') self.resize(600, 600) def get_id(self): _id = str(self.item_cnt) self.item_cnt += 1 return _id
class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) self.frame = QFrame(self) self.virusIco = QLabel(self) self.virusTitle = QLabel(self) self.greetings = QLabel(self) self.pneumoniaInfo = QLabel(self) self.loading = QLabel(self) self.movieLabel = QLabel(self) self.testStat = QLabel(self) self.predictStat = QLabel(self) self.about = QLabel(self) self.testButton = QPushButton(self) self.predictButton = QPushButton(self) self.aboutButton = QPushButton(self) self.refreshButton = QPushButton(self) self.movie = QMovie(self) self.tableWidget = QTableWidget() self.modelsDir = os.getcwd() + "/pneumonia/models" self.assetsDir = os.getcwd() + "/assets/" self.window() def window(self): self.setGeometry(540, 250, 600, 750) self.setWindowTitle("Pneumonia Detector") self.setWindowIcon(QIcon(self.assetsDir + "corona.ico")) self.setFixedSize(900, 600) self.setStyleSheet("background-color: #3a6186") self.sidePanel() self.createUI() self.invokes() def createUI(self): self.icons(self.virusIco, self.assetsDir + "corona.png", 50, (10, 50), "background-color: #254059;") self.virusIco.show() self.labels(self.virusTitle, "Pneumonia\nDetector", (70, 15, 130, 30), QFont("Courier New", 13, weight=QFont.Bold), "background-color: #254059;") self.virusTitle.show() self.labels(self.pneumoniaInfo, "Pneumonia is an infection that inflames the air sacs in one or both lungs. The" " air sacs may fill with fluid or pus (purulent material), causing cough with " "phlegm or pus, fever, chills, and difficulty breathing. A variety of " "organisms, including bacteria, viruses and fungi, can cause pneumonia. " "Pneumonia can range in seriousness from mild to life-threatening. It is most " "serious for infants and young children, people older than age 65, and people " "with health problems or weakened immune systems.", (10, 90, 190, 310), QFont("Roboto", 10), "background-color: #254059;", Qt.AlignCenter) self.pneumoniaInfo.show() self.labels(self.greetings, "Welcome to the pneumonia detector! \n Choose an option and enjoy our app!", (210, 30, 700, 100), QFont("Courier", 15, weight=QFont.Bold), "background-color: #3a6186", Qt.AlignCenter) self.greetings.show() self.labels(self.loading, "Loading...", (450, 110, 400, 400), QFont("Courier", 30, weight=QFont.Bold), "background-color: #3a6186", hide=True) self.labels(self.testStat, "", (215, 10, 675, 580), QFont("Courier", 30, weight=QFont.Bold), "background-color: #254059", hide=True) self.labels(self.predictStat, "", (690, 10, 200, 400), QFont("Courier", 30, weight=QFont.Bold), "background-color: #254059", hide=True) self.labels(self.about, "This app gives only chances of disease, it's not a medical conclusions. If you " "get more than 35% in case you input a good photo, then you you should see a " "doctor. If you choose a test option, you must to give a directory which consist " "of 2 directories,'NORMAL' and 'PNEUMONIA', this command tests the " "app(works not so fast). To use the predict button you must give a directory " "consist of '.jpg' or '.jpeg'. The example photos are given below.", (210, 0, 600, 250), QFont("Courier", 15, weight=QFont.Bold), "background-color: #3a6186", hide=True) self.buttons(self.testButton, "Test", QIcon(self.assetsDir + "test.png"), QSize(32, 32), QFont("Roboto", 15), (10, 480, 185, 50), "background-color: #254059;") self.testButton.show() self.buttons(self.predictButton, "Predict", QIcon(self.assetsDir + "predict.png"), QSize(25, 25), QFont("Roboto", 15), (10, 420, 185, 50), "background-color: #254059;") self.predictButton.show() self.buttons(self.aboutButton, "About", QIcon(self.assetsDir + "about.png"), QSize(25, 25), QFont("Roboto", 15), (10, 540, 185, 50), "background-color: #254059;", hide=False) self.aboutButton.show() self.buttons(self.refreshButton, "Refresh", QIcon(self.assetsDir + "refresh.png"), QSize(25, 25), QFont("Roboto", 15), (10, 540, 185, 50), "background-color: #254059;", hide=True) self.movieStart(self.movieLabel, self.movie, self.assetsDir + "neponel.gif", QSize(400, 400), (355, 130, 400, 400)) def invokes(self): self.testButton.clicked.connect(partial(self.buttonClicked, self.testButton)) self.predictButton.clicked.connect(partial(self.buttonClicked, self.predictButton)) self.refreshButton.clicked.connect(partial(self.buttonClicked, self.refreshButton)) self.aboutButton.clicked.connect(partial(self.buttonClicked, self.aboutButton)) def sidePanel(self): self.frame.setFrameShape(QFrame.StyledPanel) self.frame.setLineWidth(1) self.frame.setFixedSize(205, 600) self.frame.setStyleSheet("background-color: #254059") @staticmethod def icons(labelObject, title, scale, geometry, backColor): labelObject.setPixmap(QPixmap(title).scaled(scale, scale)) labelObject.setGeometry(geometry[0], geometry[0], geometry[1], geometry[1]) labelObject.setStyleSheet(backColor) @staticmethod def labels(labelObject, text, geometry, font, backColor, alignment=None, hide=False): labelObject.setWordWrap(True) labelObject.setText(text) labelObject.setGeometry(geometry[0], geometry[1], geometry[2], geometry[3]) labelObject.setFont(font) labelObject.setStyleSheet(backColor) if alignment: labelObject.setAlignment(alignment) if hide: labelObject.hide() @staticmethod def buttons(buttonObject, text, icon, icoSize, font, geometry, backColor, hide=False): buttonObject.setText(text) buttonObject.setGeometry(geometry[0], geometry[1], geometry[2], geometry[3]) buttonObject.setIcon(icon) buttonObject.setIconSize(icoSize) buttonObject.setFont(font) buttonObject.setStyleSheet(backColor) if hide: buttonObject.hide() def buttonClicked(self, buttonObject): self.greetings.hide() self.movieLabel.hide() self.testButton.hide() self.predictButton.hide() self.aboutButton.hide() if buttonObject == self.testButton: imagesDir = QFileDialog.getExistingDirectory(self, "Select directory", expanduser("~"), QFileDialog.ShowDirsOnly | QFileDialog.DontUseNativeDialog)+"/" self.refreshButton.show() self.refreshButton.setEnabled(False) self.loading.show() self.repaint() pd = PneumoniaDetect(self.modelsDir, imagesDir) pd.modelsTest() graph = QPixmap("test_stat.png") self.testStat.setPixmap(graph.scaled(675, 580)) self.testStat.show() self.refreshButton.setEnabled(True) self.repaint() elif buttonObject == self.predictButton: imagesDir = QFileDialog.getExistingDirectory(self, "Select directory", expanduser("~"), QFileDialog.ShowDirsOnly | QFileDialog.DontUseNativeDialog)+"/" self.loading.show() self.repaint() pd = PneumoniaDetect(self.modelsDir, imagesDir) result = pd.modelsPrediction() self.tableWidget = QTableWidget() self.tableWidget.setWindowTitle("Pneumonia probability") self.tableWidget.setStyleSheet("background-color: #3a6186") self.tableWidget.setGeometry(745, 250, 695, 600) self.tableWidget.setColumnCount(2) self.tableWidget.setRowCount(len(result)) j = 0 for i in result: self.tableWidget.setItem(j, 0, QTableWidgetItem(i)) self.tableWidget.setItem(j, 1, QTableWidgetItem((str(result[i])[:6]) + "%")) j += 1 self.tableWidget.setHorizontalHeaderLabels(["Image title", "Probability"]) self.tableWidget.setColumnWidth(0, 300) self.tableWidget.setColumnWidth(1, 100) self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) self.tableWidget.show() self.createUI() elif buttonObject == self.aboutButton: self.about.show() self.refreshButton.show() self.refreshButton.setEnabled(False) self.repaint() self.refreshButton.setEnabled(True) self.repaint() elif buttonObject == self.refreshButton: self.createUI() @staticmethod def movieStart(labelObject, movieObject, title, movieSize, geometry): movieObject.setFileName(title) movieObject.setScaledSize(movieSize) labelObject.setGeometry(geometry[0], geometry[1], geometry[2], geometry[3]) labelObject.setMovie(movieObject) movieObject.start()
class BRFViewer(QWidget): """ Window that is used to show all the results produced with for the currently selected water level dataset. """ def __init__(self, wldset=None, parent=None): super(BRFViewer, self).__init__(parent) self.__save_ddir = None self.setWindowTitle('BRF Results Viewer') self.setWindowIcon(icons.get_icon('master')) self.setWindowFlags(Qt.Window | Qt.CustomizeWindowHint | Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint) self.__initGUI__() self.set_wldset(wldset) def __initGUI__(self): # ---- Navigator self.btn_prev = QToolButtonNormal(icons.get_icon('go_previous')) self.btn_prev.clicked.connect(self.navigate_brf) self.btn_next = QToolButtonNormal(icons.get_icon('go_next')) self.btn_next.clicked.connect(self.navigate_brf) self.current_brf = QSpinBox() self.current_brf.setRange(0, 99) self.current_brf.setAlignment(Qt.AlignCenter) self.current_brf.setButtonSymbols(QAbstractSpinBox.NoButtons) self.current_brf.setCorrectionMode( QAbstractSpinBox.CorrectToNearestValue) self.current_brf.valueChanged.connect(self.navigate_brf) self.current_brf.setValue(0) self.total_brf = QLabel('/ 0') # ---- Language button self.btn_language = LangToolButton() self.btn_language.setToolTip( "Set the language of the text shown in the graph.") self.btn_language.sig_lang_changed.connect(self.plot_brf) self.btn_language.setIconSize(icons.get_iconsize('normal')) # ---- Toolbar # Generate the buttons : self.btn_del = QToolButtonNormal(icons.get_icon('delete_data')) self.btn_del.setToolTip('Delete current BRF results') self.btn_del.clicked.connect(self.del_brf) self.btn_del_all = QToolButtonNormal(icons.get_icon('close_all')) self.btn_del_all.setToolTip( 'Delete all BRF results for the current water level dataset.') self.btn_del_all.clicked.connect(self.del_all_brf) self.btn_save = btn_save = QToolButtonNormal(icons.get_icon('save')) btn_save.setToolTip('Save current BRF graph as...') btn_save.clicked.connect(self.select_savefig_path) self.btn_export = QToolButtonNormal(icons.get_icon('export_data')) self.btn_export.setToolTip('Export data to file.') self.btn_export.clicked.connect(self.select_export_brfdata_filepath) self.btn_copy = QToolButtonNormal('copy_clipboard') self.btn_copy.setToolTip('Copy figure to clipboard as image.') self.btn_copy.clicked.connect(self.copyfig_to_clipboard) self.btn_setp = QToolButtonNormal(icons.get_icon('page_setup')) self.btn_setp.setToolTip('Show graph layout parameters...') self.btn_setp.clicked.connect(self.toggle_graphpannel) # Generate the layout : self.tbar = myqt.QFrameLayout() buttons = [btn_save, self.btn_copy, self.btn_export, self.btn_del, self.btn_del_all, VSep(), self.btn_prev, self.current_brf, self.total_brf, self.btn_next, VSep(), self.btn_setp, self.btn_language] for btn in buttons: if isinstance(btn, QLayout): self.tbar.addLayout(btn, 1, self.tbar.columnCount()) else: self.tbar.addWidget(btn, 1, self.tbar.columnCount()) row = self.tbar.columnCount() self.tbar.addWidget(HSep(), 0, 0, 1, row+1) self.tbar.setColumnStretch(row, 100) self.tbar.setContentsMargins(10, 0, 10, 10) # (l, t, r, b) # ---- Graph Canvas self.fig_frame = QFrame() self.fig_frame.setFrameStyle(StyleDB().frame) self.fig_frame.setObjectName("figframe") self.fig_frame.setStyleSheet("#figframe {background-color:white;}") self.brf_canvas = FigureCanvasQTAgg(BRFFigure()) fflay = QGridLayout(self.fig_frame) fflay.setContentsMargins(0, 0, 0, 0) # (left, top, right, bottom) fflay.addWidget(self.tbar, 1, 0) fflay.addWidget(self.brf_canvas, 0, 0) # ---- Graph Options Panel self.graph_opt_panel = BRFOptionsPanel() self.graph_opt_panel.sig_graphconf_changed.connect(self.plot_brf) # ---- Main Layout ml = QGridLayout(self) ml.addWidget(self.fig_frame, 0, 2) ml.addWidget(self.graph_opt_panel, 0, 3) ml.setColumnStretch(1, 100) @property def savedir(self): """Return a path where figures and files are saved by default.""" if self.__save_ddir is None or not osp.exists(self.__save_ddir): try: savedir = self.wldset.dirname except AttributeError: savedir = osp.dirname(__rootdir__) finally: return savedir else: return self.__save_ddir # ---- Toolbar Handlers def toggle_graphpannel(self): if self.graph_opt_panel.isVisible() is True: # Hide the panel. self.graph_opt_panel.setVisible(False) self.btn_setp.setAutoRaise(True) self.btn_setp.setToolTip('Show graph layout parameters...') w = self.size().width() - self.graph_opt_panel.size().width() self.setFixedWidth(w) else: # Show the panel. self.graph_opt_panel.setVisible(True) self.btn_setp.setAutoRaise(False) self.btn_setp.setToolTip('Hide graph layout parameters...') w = self.size().width() + self.graph_opt_panel.size().width() self.setFixedWidth(w) def navigate_brf(self): if self.sender() == self.btn_prev: cur_num = self.current_brf.value() - 1 elif self.sender() == self.btn_next: cur_num = self.current_brf.value() + 1 elif self.sender() == self.current_brf: cur_num = self.current_brf.value() self.current_brf.setValue(cur_num) self.update_brfnavigate_state() def del_brf(self): """Delete the graph and data of the currently selected result.""" index = self.current_brf.value()-1 name = self.wldset.get_brfname_at(index) self.wldset.del_brf(name) self.update_brfnavigate_state() def del_all_brf(self): """Delete all the graphs and BRF results for the current dataset.""" msg = ("Do you want to delete all BRF results that were evaluated " "for dataset <i>{}</i>?" "<br><br>" "All data will be lost permanently." ).format(self.wldset.name) btn = QMessageBox.Yes | QMessageBox.No reply = QMessageBox.question(self, 'Delete all BRF results', msg, btn) if reply == QMessageBox.Yes: for name in self.wldset.saved_brf(): self.wldset.del_brf(name) self.update_brfnavigate_state() def new_brf_added(self): self.current_brf.setMaximum(self.wldset.brf_count()) self.current_brf.setValue(self.wldset.brf_count()) self.update_brfnavigate_state() def update_brfnavigate_state(self): count = self.wldset.brf_count() self.total_brf.setText('/ %d' % count) self.current_brf.setMinimum(min(count, 1)) self.current_brf.setMaximum(count) curnt = self.current_brf.value() self.tbar.setEnabled(count > 0) self.btn_prev.setEnabled(curnt > 1) self.btn_next.setEnabled(curnt < count) self.btn_del.setEnabled(count > 0) self.plot_brf() def select_savefig_path(self): """ Opens a dialog to select a file path where to save the brf figure. """ ddir = osp.join(self.savedir, 'brf_%s' % self.wldset['Well']) dialog = QFileDialog() fname, ftype = dialog.getSaveFileName( self, "Save Figure", ddir, '*.pdf;;*.svg') ftype = ftype.replace('*', '') if fname: if not osp.samefile(osp.dirname(ddir), osp.dirname(fname)): self.__save_ddir = osp.dirname(fname) if not fname.endswith(ftype): fname = fname + ftype self.save_brf_fig(fname) def save_brf_fig(self, fname): """Saves the current BRF figure to fname.""" self.brf_canvas.figure.savefig(fname) def copyfig_to_clipboard(self): """Saves the current BRF figure to the clipboard.""" buf = io.BytesIO() self.save_brf_fig(buf) QApplication.clipboard().setImage(QImage.fromData(buf.getvalue())) buf.close() def select_export_brfdata_filepath(self): """ Open a dialog to select a file path where to save the brf data. """ fname = 'brf_' + self.wldset['Well'] if self.wldset['Well ID']: fname += '_%s' % self.wldset['Well ID'] ddir = osp.join(self.savedir, fname) dialog = QFileDialog() fname, ftype = dialog.getSaveFileName( self, "Export Data", ddir, "*.xlsx;;*.xls;;*.csv") ftype = ftype.replace('*', '') if fname: if not osp.samefile(osp.dirname(ddir), osp.dirname(fname)): self.__save_ddir = osp.dirname(fname) if not fname.endswith(ftype): fname = fname + ftype self.export_brf_data(fname) def export_brf_data(self, fname): """Export the current BRF data to to file.""" self.wldset.export_brf_to_csv(fname, self.current_brf.value()-1) # ---- Others def set_wldset(self, wldset): self.wldset = wldset self.setEnabled(wldset is not None) if wldset is not None: self.update_brfnavigate_state() def plot_brf(self): self.brf_canvas.figure.set_language(self.btn_language.language) if self.wldset.brf_count() == 0: self.brf_canvas.figure.empty_BRF() else: name = self.wldset.get_brfname_at(self.current_brf.value()-1) databrf = self.wldset.get_brf(name) well = self.wldset['Well'] msize = self.graph_opt_panel.markersize draw_line = self.graph_opt_panel.draw_line ymin = self.graph_opt_panel.ymin ymax = self.graph_opt_panel.ymax yscale = self.graph_opt_panel.yscale xmin = self.graph_opt_panel.xmin xmax = self.graph_opt_panel.xmax xscale = self.graph_opt_panel.xscale time_units = self.graph_opt_panel.time_units date0 = databrf.date_start.strftime(format='%d/%m/%y %H:%M') date1 = databrf.date_end.strftime(format='%d/%m/%y %H:%M') self.brf_canvas.figure.plot_BRF( databrf['Lag'].values, databrf['SumA'].values, databrf['sdA'].values, date0, date1, well, msize, draw_line, [ymin, ymax], [xmin, xmax], time_units, xscale, yscale) self.brf_canvas.draw() def show(self): super(BRFViewer, self).show() qr = self.frameGeometry() if self.parentWidget(): parent = self.parentWidget() wp = parent.frameGeometry().width() hp = parent.frameGeometry().height() cp = parent.mapToGlobal(QPoint(wp/2, hp/2)) else: cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) self.fig_frame.setFixedSize(self.fig_frame.size()) self.setFixedSize(self.size()) self.raise_() if self.windowState() == Qt.WindowMinimized: # Window is minimised. Restore it. self.setWindowState(Qt.WindowNoState)