def manage_menu(self): self.table = QTableWidget() self.table.setStyleSheet("background:#fff") self.table.resize(self.width(), self.height()) self.table.setColumnCount(7) self.table.horizontalHeader().setSectionResizeMode( QHeaderView.ResizeToContents ) self.table.setHorizontalHeaderItem(0, QTableWidgetItem("License Plate")) self.table.setHorizontalHeaderItem(1, QTableWidgetItem("Car Brand")) self.table.setHorizontalHeaderItem(2, QTableWidgetItem("Owner Name")) self.table.setHorizontalHeaderItem(3, QTableWidgetItem("Space ID")) self.table.setHorizontalHeaderItem(4, QTableWidgetItem("Check-in time")) self.table.setHorizontalHeaderItem(5, QTableWidgetItem("Discount")) self.table.setHorizontalHeaderItem(6, QTableWidgetItem("ACTION")) self.refresh_manage_menu() frame = QFrame() layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) layout.addWidget(self.table) frame.setLayout(layout) frame.setContentsMargins(0, 0, 0, 0) frame.setMaximumWidth(self.width()) frame.setMinimumWidth(self.width()) frame.setMaximumHeight(self.height()) frame.setMinimumHeight(self.height()) self.vertical_3.addWidget(frame) self.vertical_3.addStretch()
class EditColorValue(QWidget): def __init__(self, value): super().__init__() self._val = value self._rootLayout = QHBoxLayout() self._colorLineEdit = QLineEdit() self._colorLineEdit.setAlignment(Qt.AlignRight) self._colorLineEdit.setReadOnly(True) self._rootLayout.addWidget(self._colorLineEdit) self._frame = QFrame() self._frame.setFrameStyle(QFrame.StyledPanel) self._frame.setFrameShadow(QFrame.Plain) self._frameLayout = QHBoxLayout() self._colorSelectBt = QPushButton() self._colorSelectBt.setFlat(True) self._colorSelectBt.clicked.connect(self._signal_colorSelectBt_clicked) self._frameLayout.setContentsMargins(0, 0, 0, 0) self._frameLayout.setSpacing(0) self._frameLayout.addWidget(self._colorSelectBt) self._frame.setMaximumHeight( self._colorSelectBt.minimumSizeHint().height() - 2) self._frame.setLayout(self._frameLayout) self._rootLayout.addWidget(self._frame) self._rootLayout.setContentsMargins(1, 1, 1, 1) self.setLayout(self._rootLayout) self._pull() def _updateWith(self, col): palette = self._colorSelectBt.palette() palette.setColor(QPalette.Button, col) self._colorSelectBt.setAutoFillBackground(True) self._colorSelectBt.setPalette(palette) self._colorSelectBt.update() self._colorLineEdit.setText("<{0}, {1}, {2}, {3}>".format( col.red(), col.green(), col.blue(), col.alpha())) def _signal_colorSelectBt_clicked(self): r, g, b, a = self._val.getVal() resColor = QColorDialog.getColor(QColor(r, g, b, a), self, "Select Color", QColorDialog.ShowAlphaChannel) if not resColor.isValid(): return self._push(resColor) SendMessage(MsgOnLogicDataEdited(self._val)) def _push(self, col): self._val.setVal(col.red(), col.green(), col.blue(), col.alpha()) def _pull(self): r, g, b, a = self._val.getVal() self._updateWith(QColor(r, g, b, a))
def create_calculator(self): title_frame = QFrame() title_layout = QVBoxLayout() #calculator_label = QLabel("Calculate your body fat", self) #calculator_label.setFont(QFont("Ariel", 15)) #calculator_label.setFixedHeight(70) #title_layout.addWidget(calculator_label) #title_frame.setLayout(title_layout) calculator_frame = QFrame() calculator_frame.setObjectName("frameObj") calculator_frame.setFrameStyle(QFrame.Box) calculator_frame.setLineWidth(3) calculator_frame.setStyleSheet("""#frameObj {color: #322d2d;}""") calculator_frame.setMaximumWidth(600) calculator_frame.setMaximumHeight(350) form_layout = self.create_form_metric( ) if self.units == "metric" else self.create_form_imperial() calculator_frame.setLayout(form_layout) wrapper_layout = QVBoxLayout() #wrapper_layout.addWidget(title_frame) wrapper_layout.addWidget(calculator_frame) return wrapper_layout
class BookmarkWidget(QFrame): SPELL_TAB = 0 DICE_TAB = 1 def __init__(self, monster_table, monster_viewer, spell_table, spell_viewer): super().__init__() self.monster_table = monster_table self.spell_table = spell_table self.monster_viewer = monster_viewer self.spell_viewer = spell_viewer self.bookmark_frame = QFrame() self.bookmark_frame.setMaximumHeight(300) self.button_bar = QFrame() self.button_bar.setLayout(QHBoxLayout()) bookmark_layout = QHBoxLayout() self.setLayout(QVBoxLayout()) self.layout().setContentsMargins(0, 0, 0, 0) self.setSizePolicy(QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Maximum)) self.spell_bookmark = LinkedSpellTable(self.spell_table, self.spell_viewer) self.monster_bookmark = LinkedMonsterTable(self.monster_table, self.monster_viewer) self.monster_tabWidget = QTabWidget() self.monster_tabWidget.addTab(self.monster_bookmark, "Monster") self.spell_tabWidget = QTabWidget() self.spell_tabWidget.addTab(self.spell_bookmark, "Spell") self.dice_bookmark = QFrame() dice_layout = QVBoxLayout() for i in range(5): dice_layout.addWidget(DiceBox().frame) dice_help_button = QPushButton("Help") dice_help_button.clicked.connect(self.dice_instructions) dice_layout.addWidget(dice_help_button) self.dice_bookmark.setLayout(dice_layout) self.spell_tabWidget.addTab(self.dice_bookmark, "Dice") bookmark_layout.addWidget(self.monster_tabWidget) bookmark_layout.addWidget(self.spell_tabWidget) self.bookmark_frame.setLayout(bookmark_layout) self.clear_bookmark_button = QPushButton("Clear Bookmark") self.toggle_bookmark_button = QPushButton("Toggle Bookmark") self.button_bar.layout().setContentsMargins(0, 0, 0, 0) self.button_bar.layout().addWidget(self.clear_bookmark_button) self.button_bar.layout().addWidget(self.toggle_bookmark_button) self.layout().addWidget(self.bookmark_frame) self.layout().addWidget(self.button_bar) self.bookmark_frame.setHidden(True) self.hidden = True def dice_instructions(self): sNexus.printSignal.emit("\nEither input diceroll in format xdy+z, AttackBonus|DamageRoll, or" " AttackBonus, DamageRoll\nExample: 1d20+6\n5|2d6+3\n5, 2d6+3\n") def toggle_hide(self): self.hidden = not self.hidden self.bookmark_frame.setHidden(self.hidden)
def addAddStudentPage(self): layout = QVBoxLayout() frame = QFrame() name_label = QLabel("Name : ") name_label.setStyleSheet("color:#fff;padding:8px 0px;font-size:20px") mobile_label = QLabel("Mobile : ") mobile_label.setStyleSheet("color:#fff;padding:8px 0px;font-size:20px") vechicle_label = QLabel("Vehicle No : ") vechicle_label.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px") vechicle_type = QLabel("Vehicle Type : ") vechicle_type.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px") error_label = QLabel("") error_label.setStyleSheet("color:red;padding:8px 0px;font-size:20px") name_input = QLineEdit() name_input.setStyleSheet("color:#fff;padding:8px 0px;font-size:20px") mobile_input = QLineEdit() mobile_input.setStyleSheet("color:#fff;padding:8px 0px;font-size:20px") vehicle_input = QLineEdit() vehicle_input.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px") vtype = QComboBox() vtype.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px;border:1px solid white") vtype.addItem("2 Wheeler") vtype.addItem("4 Wheeler") button = QPushButton("Add Vehicle") button.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px;background:green;border:1px solid white" ) layout.addWidget(name_label) layout.addWidget(name_input) layout.addWidget(mobile_label) layout.addWidget(mobile_input) layout.addWidget(vechicle_label) layout.addWidget(vehicle_input) layout.addWidget(vechicle_type) layout.addWidget(vtype) layout.addWidget(button) layout.addWidget(error_label) layout.setContentsMargins(0, 0, 0, 0) frame.setMinimumHeight(self.height()) frame.setMinimumWidth(self.width()) frame.setMaximumHeight(self.width()) frame.setMaximumWidth(self.width()) layout.addStretch() frame.setLayout(layout) button.clicked.connect( lambda: self.addVehicles(name_input.text(), vehicle_input.text( ), mobile_input.text(), vtype.currentIndex(), error_label)) self.vertical_2.addWidget(frame)
def horizontalSpacer(): spacer = QFrame() spacer.setFrameShape(QFrame.HLine) spacer.setMaximumHeight(1) spacer.setContentsMargins(0, 0, 0, 0) # spacer.setLineWidth(0) # spacer.setFrameShadow(QFrame.Sunken) spacer.setStyleSheet('color: #434858') return spacer
def addManagePage(self): data = self.dbOperation.getCurrentVehicle() self.table = QTableWidget() self.table.setStyleSheet("background:#fff") self.table.resize(self.width(), self.height()) self.table.setRowCount(len(data)) self.table.setColumnCount(7) self.table.horizontalHeader().setSectionResizeMode( QHeaderView.ResizeToContents) self.table.setHorizontalHeaderItem(0, QTableWidgetItem("ID")) self.table.setHorizontalHeaderItem(1, QTableWidgetItem("Name")) self.table.setHorizontalHeaderItem(2, QTableWidgetItem("VEHICLE No")) self.table.setHorizontalHeaderItem(3, QTableWidgetItem("MOBILE")) self.table.setHorizontalHeaderItem(4, QTableWidgetItem("VEHICLE TYPE")) self.table.setHorizontalHeaderItem(5, QTableWidgetItem("ENTRY TIME")) self.table.setHorizontalHeaderItem(6, QTableWidgetItem("ACTION")) loop = 0 for smalldata in data: self.table.setItem(loop, 0, QTableWidgetItem(str(smalldata[0]))) self.table.setItem(loop, 1, QTableWidgetItem(str(smalldata[1]))) self.table.setItem(loop, 2, QTableWidgetItem(str(smalldata[6]))) self.table.setItem(loop, 3, QTableWidgetItem(str(smalldata[2]))) self.table.setItem(loop, 4, QTableWidgetItem(str(smalldata[7]))) self.table.setItem(loop, 5, QTableWidgetItem(str(smalldata[3]))) self.button_exit = QPushButton("Exit") self.button_exit.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px;background:green;border:1px solid white" ) self.table.setCellWidget(loop, 6, self.button_exit) self.button_exit.clicked.connect(self.exitCall) loop = loop + 1 frame = QFrame() layout = QVBoxLayout() button = QPushButton("Refresh") button.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px;background:green;border:1px solid white" ) button.clicked.connect(self.refreshManage) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) layout.addWidget(button) layout.addWidget(self.table) frame.setLayout(layout) frame.setContentsMargins(0, 0, 0, 0) frame.setMaximumWidth(self.width()) frame.setMinimumWidth(self.width()) frame.setMaximumHeight(self.height()) frame.setMinimumHeight(self.height()) self.vertical_3.addWidget(frame) self.vertical_3.addStretch()
def construct_innerframe(self, spacing: int) -> QFrame: parent_toolbar = tabtoolbar.find_tabtoolbar(self) if not parent_toolbar: raise Exception("Could not find Parent Tabtoolbar") group_maxheight = parent_toolbar.group_maxheight rowcount = parent_toolbar.rowcount() frame = QFrame(self) frame.setFrameShape(QFrame.NoFrame) frame.setLineWidth(0) frame.setContentsMargins(0, 0, 0, 0) policy = QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Preferred) policy.setHorizontalStretch(0) policy.setVerticalStretch(1) frame.setSizePolicy(policy) frame.setMaximumHeight(group_maxheight / rowcount) llayout = QHBoxLayout(frame) # layout.setMargin(0) llayout.setContentsMargins(0, 0, 0, 0) llayout.setSpacing(spacing) llayout.setDirection(QBoxLayout.LeftToRight) frame.setLayout(llayout) spacer = QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding) llayout.addItem(spacer) return frame
class ManagementPanel(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Home") widget = QWidget() widget.setStyleSheet("background:#467f90") layout_horizontal = QHBoxLayout() menu_vertical_layout = QVBoxLayout() self.btn_home = QPushButton("Lot\nOverview") self.btn_add = QPushButton("Car\nRegistration") self.btn_manage = QPushButton("Manage\nMenu") menu_vertical_layout.setContentsMargins(0, 0, 0, 0) menu_vertical_layout.setSpacing(0) self.btn_home.setStyleSheet( "width:200px;height:160px;font-size:20px;background:blue;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_add.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_manage.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_home.clicked.connect(self.show_overview_menu) self.btn_add.clicked.connect(self.show_add_menu) self.btn_manage.clicked.connect(self.show_manage_menu) menu_frame = QFrame() menu_vertical_layout.addWidget(self.btn_home) menu_vertical_layout.addWidget(self.btn_add) menu_vertical_layout.addWidget(self.btn_manage) menu_vertical_layout.addStretch() menu_frame.setLayout(menu_vertical_layout) # menu_frame.setMinimumWidth(200) # menu_frame.setMaximumHeight(200) parent_vertical = QVBoxLayout() parent_vertical.setContentsMargins(0, 0, 0, 0) self.vertical_1 = QVBoxLayout() self.overview_menu() self.vertical_2 = QVBoxLayout() self.vertical_2.setContentsMargins(0, 0, 0, 0) self.add_menu() self.vertical_3 = QVBoxLayout() self.vertical_3.setContentsMargins(0, 0, 0, 0) self.manage_menu() self.frame_1 = QFrame() self.frame_1.setMinimumWidth(self.width()) self.frame_1.setMaximumWidth(self.width()) self.frame_1.setMinimumHeight(self.height()) self.frame_1.setMaximumHeight(self.height()) self.frame_1.setLayout(self.vertical_1) self.frame_2 = QFrame() self.frame_2.setLayout(self.vertical_2) self.frame_3 = QFrame() self.frame_3.setLayout(self.vertical_3) parent_vertical.addWidget(self.frame_1) parent_vertical.addWidget(self.frame_2) parent_vertical.addWidget(self.frame_3) layout_horizontal.addWidget(menu_frame) layout_horizontal.addLayout(parent_vertical) layout_horizontal.setContentsMargins(0, 0, 0, 0) parent_vertical.setContentsMargins(0, 0, 0, 0) parent_vertical.addStretch() # menu_vertical_layout.addStretch() layout_horizontal.addStretch() widget.setLayout(layout_horizontal) self.frame_1.show() self.frame_2.hide() self.frame_3.hide() self.setCentralWidget(widget) def show_add_menu(self): self.btn_home.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_add.setStyleSheet( "width:200px;height:160px;font-size:20px;background:blue;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_manage.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.frame_1.hide() self.frame_3.hide() self.frame_2.show() def add_menu(self): layout = QVBoxLayout() frame = QFrame() license_plate_label = QLabel("License Plate: ") license_plate_label.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px" ) brand_name_label = QLabel("Brand: ") brand_name_label.setStyleSheet( "color:#fff;margin-top:32px;padding:8px 0px;font-size:20px" ) fuel_type_label = QLabel("Fuel: ") fuel_type_label.setStyleSheet( "color:#fff;margin-top:32px;padding:8px 0px;font-size:20px" ) license_plate_input = QLineEdit() license_plate_input.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px" ) brand_name_input = QLineEdit() brand_name_input.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px" ) fuel_type_input = QComboBox() fuel_type_input.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px;border:1px solid white" ) fuel_type_input.addItem("Gasoline") fuel_type_input.addItem("Diesel") fuel_type_input.addItem("Hydrogen") fuel_type_input.addItem("Electric") button = QPushButton("Check-in") button.setStyleSheet( "color:#fff;margin-top:32px;padding:8px 0px;font-size:20px;background:blue;border:1px solid white" ) layout.addWidget(license_plate_label) layout.addWidget(license_plate_input) layout.addWidget(brand_name_label) layout.addWidget(brand_name_input) layout.addWidget(fuel_type_label) layout.addWidget(fuel_type_input) layout.addWidget(button) layout.setContentsMargins(0, 0, 0, 0) frame.setMinimumHeight(self.height()) frame.setMinimumWidth(self.width()) frame.setMaximumHeight(self.width()) frame.setMaximumWidth(self.width()) layout.addStretch() frame.setLayout(layout) button.clicked.connect( lambda: self.add_car_db( license_plate_input.text(), brand_name_input.text(), fuel_type_input.currentText(), ) ) self.vertical_2.addWidget(frame) def add_car_db(self, license_plate, brand_name, fuel_type): owner_id = None record_id = uuid1().bytes now = datetime.now() formatted_date = now.strftime("%Y-%m-%d %H:%M:%S") with DatabaseDAO("ticket_booth") as dao: space_id = dao.get_random_parking_space(fuel_type)[0] car_data = (license_plate, owner_id, brand_name, fuel_type) record_data = (record_id, license_plate, space_id, formatted_date) dao.register_new_car(car_data) dao.create_new_car_record(record_data) dao.occupy_parking_space(space_id) def show_manage_menu(self): self.btn_home.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_add.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_manage.setStyleSheet( "width:200px;height:160px;font-size:20px;background:blue;color:#fff;font-weight:bold;border:1px solid white" ) self.frame_1.hide() self.frame_2.hide() self.frame_3.show() self.refresh_manage_menu() def manage_menu(self): self.table = QTableWidget() self.table.setStyleSheet("background:#fff") self.table.resize(self.width(), self.height()) self.table.setColumnCount(7) self.table.horizontalHeader().setSectionResizeMode( QHeaderView.ResizeToContents ) self.table.setHorizontalHeaderItem(0, QTableWidgetItem("License Plate")) self.table.setHorizontalHeaderItem(1, QTableWidgetItem("Car Brand")) self.table.setHorizontalHeaderItem(2, QTableWidgetItem("Owner Name")) self.table.setHorizontalHeaderItem(3, QTableWidgetItem("Space ID")) self.table.setHorizontalHeaderItem(4, QTableWidgetItem("Check-in time")) self.table.setHorizontalHeaderItem(5, QTableWidgetItem("Discount")) self.table.setHorizontalHeaderItem(6, QTableWidgetItem("ACTION")) self.refresh_manage_menu() frame = QFrame() layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) layout.addWidget(self.table) frame.setLayout(layout) frame.setContentsMargins(0, 0, 0, 0) frame.setMaximumWidth(self.width()) frame.setMinimumWidth(self.width()) frame.setMaximumHeight(self.height()) frame.setMinimumHeight(self.height()) self.vertical_3.addWidget(frame) self.vertical_3.addStretch() def refresh_manage_menu(self): with DatabaseDAO("ticket_booth") as dao: data = dao.get_currently_parked_cars(with_owner=True) self.table.setRowCount(len(data)) for index, row in enumerate(data): self.table.setItem(index, 0, QTableWidgetItem(str(row[0]))) self.table.setItem(index, 1, QTableWidgetItem(str(row[1]))) if row[2] is not None: self.table.setItem( index, 2, QTableWidgetItem(str(row[2]) + " " + str(row[3])) ) else: self.table.setItem(index, 2, QTableWidgetItem("VISITOR")) self.table.setItem(index, 3, QTableWidgetItem(str(row[4]))) self.table.setItem(index, 4, QTableWidgetItem(str(row[5]))) self.discout_drop_down = QComboBox() if row[6] is not None: self.discout_drop_down.addItem(str(row[6])) else: self.discout_drop_down.addItem("0") self.discout_drop_down.addItem("10") self.discout_drop_down.addItem("15") self.discout_drop_down.addItem("20") self.discout_drop_down.addItem("25") self.discout_drop_down.addItem("30") self.table.setCellWidget(index, 5, self.discout_drop_down) self.button_check_out = QPushButton("Check-out") self.button_check_out.setStyleSheet( "color:#fff;padding:4px 0px;font-size:16px;background:green;border:1px solid white" ) self.table.setCellWidget(index, 6, self.button_check_out) self.button_check_out.clicked.connect(self.check_out_call) def check_out_call(self): btn = self.sender() if btn: index = self.table.indexAt(btn.pos()).row() license_plate = str(self.table.item(index, 0).text()) space_id = str(self.table.item(index, 3).text()) new_discount = self.table.cellWidget(index, 5).currentText() check_out_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") with DatabaseDAO("ticket_booth") as dao: dao.check_out_car( license_plate, space_id, check_out_time, new_discount ) self.table.removeRow(index) def show_overview_menu(self): self.btn_home.setStyleSheet( "width:200px;height:160px;font-size:20px;background:blue;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_add.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_manage.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.frame_2.hide() self.frame_3.hide() self.frame_1.show() self.refresh_overview_menu() def overview_menu(self): self.vertical_1.setContentsMargins(0, 0, 0, 0) vertical_layout = QVBoxLayout() vertical_layout.setContentsMargins(0, 0, 0, 0) frame = QFrame() horizontal = QHBoxLayout() horizontal.setContentsMargins(0, 0, 0, 0) vertical_layout.addLayout(horizontal) self.gridLayout = QGridLayout() self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setHorizontalSpacing(0) self.gridLayout.setVerticalSpacing(0) vertical_layout.addLayout(self.gridLayout) self.refresh_overview_menu() frame.setLayout(vertical_layout) self.vertical_1.addWidget(frame) self.vertical_1.addStretch() def refresh_overview_menu(self): while self.gridLayout.count(): child = self.gridLayout.takeAt(0) if child.widget(): child.widget().deleteLater() data = None with DatabaseDAO("ticket_booth") as dao: data = dao.get_parking_spaces() if data is not None: row = 0 i = 0 for parking_space in data: label = QPushButton("Space\n" + str(parking_space[0])) if parking_space[1] == 0: # Not occupied. if str(parking_space[2]) == "non_charging": label.setStyleSheet( "background-color:green;color:white;padding:5px;width:100px;height:100px;border:1px solid white;text-align:center;font-weight:bold" ) else: label.setStyleSheet( "background-color:#a9c800;color:white;padding:5px;width:100px;height:100px;border:1px solid white;text-align:center;font-weight:bold" ) else: label.setStyleSheet( "background-color:red;color:white;padding:5px;width:100px;height:100px;border:1px solid white;text-align:center;font-weight:bold" ) if i % 5 == 0: i = 0 row = row + 1 self.gridLayout.addWidget(label, row, i) i = i + 1
class HomeScreen(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Home") self.dbOperation = DBOperation() widget = QWidget() widget.setStyleSheet("background:#000") layout_horizontal = QHBoxLayout() menu_vertical_layout = QVBoxLayout() self.btn_home = QPushButton("Home") self.btn_add = QPushButton("Add Vehicle") self.btn_manage = QPushButton("Manage Vehicle") self.btn_history = QPushButton("History") menu_vertical_layout.setContentsMargins(0, 0, 0, 0) menu_vertical_layout.setSpacing(0) self.btn_home.setStyleSheet( "width:200px;height:160px;font-size:20px;background:blue;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_add.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_manage.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_history.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_home.clicked.connect(self.showHome) self.btn_add.clicked.connect(self.showAdd) self.btn_manage.clicked.connect(self.showManage) self.btn_history.clicked.connect(self.showHistory) menu_frame = QFrame() menu_vertical_layout.addWidget(self.btn_home) menu_vertical_layout.addWidget(self.btn_add) menu_vertical_layout.addWidget(self.btn_manage) menu_vertical_layout.addWidget(self.btn_history) menu_vertical_layout.addStretch() menu_frame.setLayout(menu_vertical_layout) #menu_frame.setMinimumWidth(200) #menu_frame.setMaximumHeight(200) parent_vertical = QVBoxLayout() parent_vertical.setContentsMargins(0, 0, 0, 0) self.vertical_1 = QVBoxLayout() self.addHomePageData() self.vertical_2 = QVBoxLayout() self.vertical_2.setContentsMargins(0, 0, 0, 0) self.addAddStudentPage() self.vertical_3 = QVBoxLayout() self.vertical_3.setContentsMargins(0, 0, 0, 0) self.addManagePage() self.vertical_4 = QVBoxLayout() self.addHistoryPage() self.frame_1 = QFrame() self.frame_1.setMinimumWidth(self.width()) self.frame_1.setMaximumWidth(self.width()) self.frame_1.setMaximumHeight(self.width()) self.frame_1.setMaximumHeight(self.width()) self.frame_1.setLayout(self.vertical_1) self.frame_2 = QFrame() self.frame_2.setLayout(self.vertical_2) self.frame_3 = QFrame() self.frame_3.setLayout(self.vertical_3) self.frame_4 = QFrame() self.frame_4.setLayout(self.vertical_4) parent_vertical.addWidget(self.frame_1) parent_vertical.addWidget(self.frame_2) parent_vertical.addWidget(self.frame_3) parent_vertical.addWidget(self.frame_4) layout_horizontal.addWidget(menu_frame) layout_horizontal.addLayout(parent_vertical) layout_horizontal.setContentsMargins(0, 0, 0, 0) parent_vertical.setContentsMargins(0, 0, 0, 0) parent_vertical.addStretch() #menu_vertical_layout.addStretch() layout_horizontal.addStretch() widget.setLayout(layout_horizontal) self.frame_1.show() self.frame_2.hide() self.frame_3.hide() self.frame_4.hide() self.setCentralWidget(widget) def showHistory(self): self.btn_home.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_add.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_manage.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_history.setStyleSheet( "width:200px;height:160px;font-size:20px;background:blue;color:#fff;font-weight:bold;border:1px solid white" ) self.frame_1.hide() self.frame_2.hide() self.frame_3.hide() self.frame_4.show() def showManage(self): self.btn_home.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_add.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_manage.setStyleSheet( "width:200px;height:160px;font-size:20px;background:blue;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_history.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.frame_1.hide() self.frame_2.hide() self.frame_4.hide() self.frame_3.show() def showAdd(self): self.btn_home.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_add.setStyleSheet( "width:200px;height:160px;font-size:20px;background:blue;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_manage.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_history.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.frame_1.hide() self.frame_3.hide() self.frame_4.hide() self.frame_2.show() def showHome(self): self.btn_home.setStyleSheet( "width:200px;height:160px;font-size:20px;background:blue;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_add.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_manage.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.btn_history.setStyleSheet( "width:200px;height:160px;font-size:20px;background:orange;color:#fff;font-weight:bold;border:1px solid white" ) self.frame_2.hide() self.frame_3.hide() self.frame_4.hide() self.frame_1.show() def refreshHome(self): while self.gridLayout.count(): child = self.gridLayout.takeAt(0) if child.widget(): child.widget().deleteLater() row = 0 i = 0 alldata = self.dbOperation.getSlotSpace() for data in alldata: label = QPushButton("Slot " + str(data[0]) + " \n " + str(data[1])) if data[3] == 1: label.setStyleSheet( "background-color:green;color:white;padding:5px;width:100px;height:100px;border:1px solid white;text-align:center;font-weight:bold" ) else: label.setStyleSheet( "background-color:red;color:white;padding:5px;width:100px;height:100px;border:1px solid white;text-align:center;font-weight:bold" ) if i % 5 == 0: i = 0 row = row + 1 self.gridLayout.addWidget(label, row, i) i = i + 1 def addHomePageData(self): self.vertical_1.setContentsMargins(0, 0, 0, 0) button = QPushButton("Refresh") button.clicked.connect(self.refreshHome) vertical_layout = QVBoxLayout() vertical_layout.setContentsMargins(0, 0, 0, 0) frame = QFrame() horizontal = QHBoxLayout() horizontal.setContentsMargins(0, 0, 0, 0) vertical_layout.addLayout(horizontal) alldata = self.dbOperation.getSlotSpace() self.gridLayout = QGridLayout() self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setHorizontalSpacing(0) self.gridLayout.setVerticalSpacing(0) vertical_layout.addWidget(button) vertical_layout.addLayout(self.gridLayout) row = 0 i = 0 for data in alldata: label = QPushButton("Slot " + str(data[0]) + " \n " + str(data[1])) if data[3] == 1: label.setStyleSheet( "background-color:green;color:white;padding:5px;width:100px;height:100px;border:1px solid white;text-align:center;font-weight:bold" ) else: label.setStyleSheet( "background-color:red;color:white;padding:5px;width:100px;height:100px;border:1px solid white;text-align:center;font-weight:bold" ) if i % 5 == 0: i = 0 row = row + 1 self.gridLayout.addWidget(label, row, i) i = i + 1 frame.setLayout(vertical_layout) self.vertical_1.addWidget(frame) self.vertical_1.addStretch() def addAddStudentPage(self): layout = QVBoxLayout() frame = QFrame() name_label = QLabel("Name : ") name_label.setStyleSheet("color:#fff;padding:8px 0px;font-size:20px") mobile_label = QLabel("Mobile : ") mobile_label.setStyleSheet("color:#fff;padding:8px 0px;font-size:20px") vechicle_label = QLabel("Vehicle No : ") vechicle_label.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px") vechicle_type = QLabel("Vehicle Type : ") vechicle_type.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px") error_label = QLabel("") error_label.setStyleSheet("color:red;padding:8px 0px;font-size:20px") name_input = QLineEdit() name_input.setStyleSheet("color:#fff;padding:8px 0px;font-size:20px") mobile_input = QLineEdit() mobile_input.setStyleSheet("color:#fff;padding:8px 0px;font-size:20px") vehicle_input = QLineEdit() vehicle_input.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px") vtype = QComboBox() vtype.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px;border:1px solid white") vtype.addItem("2 Wheeler") vtype.addItem("4 Wheeler") button = QPushButton("Add Vehicle") button.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px;background:green;border:1px solid white" ) layout.addWidget(name_label) layout.addWidget(name_input) layout.addWidget(mobile_label) layout.addWidget(mobile_input) layout.addWidget(vechicle_label) layout.addWidget(vehicle_input) layout.addWidget(vechicle_type) layout.addWidget(vtype) layout.addWidget(button) layout.addWidget(error_label) layout.setContentsMargins(0, 0, 0, 0) frame.setMinimumHeight(self.height()) frame.setMinimumWidth(self.width()) frame.setMaximumHeight(self.width()) frame.setMaximumWidth(self.width()) layout.addStretch() frame.setLayout(layout) button.clicked.connect( lambda: self.addVehicles(name_input.text(), vehicle_input.text( ), mobile_input.text(), vtype.currentIndex(), error_label)) self.vertical_2.addWidget(frame) def addVehicles(self, name, vehicleno, mobile, index, error_label): vtp = 2 if index == 0: vtp = 2 else: vtp = 4 data = self.dbOperation.AddVehicles(name, vehicleno, mobile, str(vtp)) if data == True: error_label.setText("Added Successfully") elif data == False: error_label.setText("Failed to Add Vehicle") else: error_label.setText(str(data)) def addManagePage(self): data = self.dbOperation.getCurrentVehicle() self.table = QTableWidget() self.table.setStyleSheet("background:#fff") self.table.resize(self.width(), self.height()) self.table.setRowCount(len(data)) self.table.setColumnCount(7) self.table.horizontalHeader().setSectionResizeMode( QHeaderView.ResizeToContents) self.table.setHorizontalHeaderItem(0, QTableWidgetItem("ID")) self.table.setHorizontalHeaderItem(1, QTableWidgetItem("Name")) self.table.setHorizontalHeaderItem(2, QTableWidgetItem("VEHICLE No")) self.table.setHorizontalHeaderItem(3, QTableWidgetItem("MOBILE")) self.table.setHorizontalHeaderItem(4, QTableWidgetItem("VEHICLE TYPE")) self.table.setHorizontalHeaderItem(5, QTableWidgetItem("ENTRY TIME")) self.table.setHorizontalHeaderItem(6, QTableWidgetItem("ACTION")) loop = 0 for smalldata in data: self.table.setItem(loop, 0, QTableWidgetItem(str(smalldata[0]))) self.table.setItem(loop, 1, QTableWidgetItem(str(smalldata[1]))) self.table.setItem(loop, 2, QTableWidgetItem(str(smalldata[6]))) self.table.setItem(loop, 3, QTableWidgetItem(str(smalldata[2]))) self.table.setItem(loop, 4, QTableWidgetItem(str(smalldata[7]))) self.table.setItem(loop, 5, QTableWidgetItem(str(smalldata[3]))) self.button_exit = QPushButton("Exit") self.button_exit.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px;background:green;border:1px solid white" ) self.table.setCellWidget(loop, 6, self.button_exit) self.button_exit.clicked.connect(self.exitCall) loop = loop + 1 frame = QFrame() layout = QVBoxLayout() button = QPushButton("Refresh") button.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px;background:green;border:1px solid white" ) button.clicked.connect(self.refreshManage) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) layout.addWidget(button) layout.addWidget(self.table) frame.setLayout(layout) frame.setContentsMargins(0, 0, 0, 0) frame.setMaximumWidth(self.width()) frame.setMinimumWidth(self.width()) frame.setMaximumHeight(self.height()) frame.setMinimumHeight(self.height()) self.vertical_3.addWidget(frame) self.vertical_3.addStretch() def refreshManage(self): data = self.dbOperation.getCurrentVehicle() self.table.setRowCount(len(data)) self.table.setColumnCount(7) loop = 0 for smalldata in data: self.table.setItem(loop, 0, QTableWidgetItem(str(smalldata[0]))) self.table.setItem(loop, 1, QTableWidgetItem(str(smalldata[1]))) self.table.setItem(loop, 2, QTableWidgetItem(str(smalldata[6]))) self.table.setItem(loop, 3, QTableWidgetItem(str(smalldata[2]))) self.table.setItem(loop, 4, QTableWidgetItem(str(smalldata[7]))) self.table.setItem(loop, 5, QTableWidgetItem(str(smalldata[3]))) self.button_exit = QPushButton("Exit") self.table.setCellWidget(loop, 6, self.button_exit) self.button_exit.clicked.connect(self.exitCall) loop = loop + 1 def refreshHistory(self): self.table1.clearContents() data = self.dbOperation.getAllVehicle() loop = 0 self.table1.setRowCount(len(data)) self.table1.setColumnCount(7) for smalldata in data: self.table1.setItem(loop, 0, QTableWidgetItem(str(smalldata[0]))) self.table1.setItem(loop, 1, QTableWidgetItem(str(smalldata[1]))) self.table1.setItem(loop, 2, QTableWidgetItem(str(smalldata[6]))) self.table1.setItem(loop, 3, QTableWidgetItem(str(smalldata[2]))) self.table1.setItem(loop, 4, QTableWidgetItem(str(smalldata[7]))) self.table1.setItem(loop, 5, QTableWidgetItem(str(smalldata[3]))) self.table1.setItem(loop, 6, QTableWidgetItem(str(smalldata[4]))) loop = loop + 1 def addHistoryPage(self): data = self.dbOperation.getAllVehicle() self.table1 = QTableWidget() self.table1.resize(self.width(), self.height()) self.table1.setRowCount(len(data)) self.table1.setStyleSheet("background:#fff") self.table1.setColumnCount(7) button = QPushButton("Refresh") button.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px;background:green;border:1px solid white" ) button.clicked.connect(self.refreshHistory) self.table1.horizontalHeader().setSectionResizeMode( QHeaderView.ResizeToContents) self.table1.setHorizontalHeaderItem(0, QTableWidgetItem("ID")) self.table1.setHorizontalHeaderItem(1, QTableWidgetItem("Name")) self.table1.setHorizontalHeaderItem(2, QTableWidgetItem("VEHICLE No")) self.table1.setHorizontalHeaderItem(3, QTableWidgetItem("MOBILE")) self.table1.setHorizontalHeaderItem(4, QTableWidgetItem("VEHICLE TYPE")) self.table1.setHorizontalHeaderItem(5, QTableWidgetItem("ENTRY TIME")) self.table1.setHorizontalHeaderItem(6, QTableWidgetItem("EXIT TIME")) loop = 0 for smalldata in data: self.table1.setItem(loop, 0, QTableWidgetItem(str(smalldata[0]))) self.table1.setItem(loop, 1, QTableWidgetItem(str(smalldata[1]))) self.table1.setItem(loop, 2, QTableWidgetItem(str(smalldata[6]))) self.table1.setItem(loop, 3, QTableWidgetItem(str(smalldata[2]))) self.table1.setItem(loop, 4, QTableWidgetItem(str(smalldata[7]))) self.table1.setItem(loop, 5, QTableWidgetItem(str(smalldata[3]))) self.table1.setItem(loop, 6, QTableWidgetItem(str(smalldata[4]))) loop = loop + 1 self.frame5 = QFrame() self.layout1 = QVBoxLayout() self.layout1.setContentsMargins(0, 0, 0, 0) self.layout1.setSpacing(0) self.layout1.addWidget(button) self.layout1.addWidget(self.table1) self.frame5.setLayout(self.layout1) self.frame5.setContentsMargins(0, 0, 0, 0) self.frame5.setMaximumWidth(self.width()) self.frame5.setMinimumWidth(self.width()) self.frame5.setMaximumHeight(self.height()) self.frame5.setMinimumHeight(self.height()) self.vertical_4.addWidget(self.frame5) self.vertical_4.addStretch() def exitCall(self): btton = self.sender() if btton: row = self.table.indexAt(btton.pos()).row() id = str(self.table.item(row, 0).text()) self.dbOperation.exitVehicle(id) self.table.removeRow(row)
class WindowFrame(QDialog): def __init__(self): super(WindowFrame, self).__init__() self.closed = False self.maxNormal = False self.resize(840, 480) self.setMouseTracking(True) self.base_path = os.path.dirname(__file__) QDir.setCurrent(os.path.dirname(self.base_path)) #self.setWindowFlags(Qt.FramelessWindowHint) self.setWindowFlags(Qt.SplashScreen) #self.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint) #self.setStyleSheet("border : none; background-color : rgba(250,100,100,0)") #self.setAutoFillBackground(True) #self.setAttribute(Qt.WA_TranslucentBackground) self.mainLayout = QVBoxLayout() self.mainLayout.setContentsMargins(0, 0, 0, 0) self.mainLayout.setSpacing(0) #Title Bar self.area = ComboBox() self.area.setSizePolicy( QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.area.setMaximumWidth(32) #self.area.setMinimumWidth(32) #self.area.setMinimumHeight(28) self.area.addItem(QIcon(icon_path("ICON_ACTION")), "Prefs") self.area.addItem(QIcon(icon_path("ICON_GROUP")), "Library") self.area.addItem(QIcon(icon_path("ICON_MATERIAL")), "Assets") self.titleBarArea = QFrame() #self.titleBarArea.setCursor(Qt.OpenHandCursor) self.titleBarLayout = QHBoxLayout() self.titleBarLayout.setContentsMargins(4, 2, 4, 2) self.titleBarArea.setStyleSheet(""" border : none; background-color : rgb(100,100,100); border-top-left-radius: 5px;border-top-right-radius: 5px; border-style: solid; border-color: rgb(50, 50, 50); border-bottom-width: 1px;""") self.titleBarArea.setMinimumHeight(30) self.titleBarArea.setMaximumHeight(30) self.title = Label('Lib Manager') self.toolBox = QFrame() self.toolBox.setStyleSheet(""" border : none; background-color : rgb(120,120,120); border-top-left-radius: 0px;border-top-right-radius: 0px; border-bottom-left-radius: 5px;border-bottom-right-radius: 5px;""" ) self.toolBoxLayout = QHBoxLayout() self.toolBoxLayout.setContentsMargins(12, 0, 4, 0) self.toolBox.setLayout(self.toolBoxLayout) self.btn_add_asset = PushButton(icon=icon_path("ICON_ZOOMIN"), size=[22, 22]) self.btn_settings = PushButton(icon=icon_path("ICON_SETTINGS"), size=[22, 22]) self.toolBoxLayout.addWidget(self.btn_add_asset) self.toolBoxLayout.addWidget(self.btn_settings) self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.hSpacer = QSpacerItem(30, 20, QSizePolicy.Maximum, QSizePolicy.Minimum) self.btn_minimize = PushButton(icon=icon_path("ICON_MINIMIZE"), size=[22, 22]) self.btn_minimize.clicked.connect(self.showSmall) self.btn_maximize = PushButton(icon=icon_path("ICON_MAXIMIZE"), size=[22, 22]) self.btn_maximize.clicked.connect(self.showMaxRestore) self.btn_close = PushButton(icon=icon_path("ICON_CLOSE"), size=[22, 22]) self.btn_close.clicked.connect(self.close) self.titleBarLayout.addWidget(self.area) self.titleBarLayout.addWidget(self.title) self.titleBarLayout.addItem(self.horizontalSpacer) self.titleBarLayout.addWidget(self.toolBox) self.titleBarLayout.addItem(self.hSpacer) self.titleBarLayout.addWidget(self.btn_minimize) self.titleBarLayout.addWidget(self.btn_maximize) self.titleBarLayout.addWidget(self.btn_close) self.titleBarArea.setLayout(self.titleBarLayout) self.middleLayout = QHBoxLayout() self.handleList = [self.titleBarArea] #Left Bar self.leftBarLayout = QVBoxLayout() self.leftHandle = QFrame() self.leftHandle.setStyleSheet( "border : none; background-color : rgb(110,110,110);") self.leftHandle.setMaximumWidth(5) self.leftHandle.setMinimumWidth(5) self.leftHandle.setCursor(Qt.SizeHorCursor) self.leftBottomHandle = QFrame() self.leftBottomHandle.setStyleSheet( "border : none; background-color : rgb(110,110,110);") self.leftBottomHandle.setMaximumSize(5, 16) self.leftBottomHandle.setCursor(Qt.SizeBDiagCursor) #Add handle to a list self.handleList += [self.leftHandle, self.leftBottomHandle] self.leftBarLayout.addWidget(self.leftHandle) self.leftBarLayout.addWidget(self.leftBottomHandle) #Content #self.content = QFrame() self.contentLayout = QVBoxLayout() self.contentLayout.setContentsMargins(0, 0, 0, 0) self.contentLayout.setSpacing(0) #self.content.setLayout(self.contentLayout) #Right Bar self.rightBarLayout = QVBoxLayout() self.rightHandle = QFrame() self.rightHandle.setStyleSheet( "border : none; background-color : rgb(110,110,110);") self.rightHandle.setMaximumWidth(5) self.rightHandle.setMinimumWidth(5) self.rightHandle.setCursor(Qt.SizeHorCursor) self.rightBottomHandle = QFrame() self.rightBottomHandle.setStyleSheet( "border : none; background-color : rgb(110,110,110);") self.rightBottomHandle.setMaximumSize(5, 16) self.rightBottomHandle.setCursor(Qt.SizeFDiagCursor) self.rightBarLayout.addWidget(self.rightHandle) self.rightBarLayout.addWidget(self.rightBottomHandle) #Add handle to a list self.handleList += [self.rightHandle, self.rightBottomHandle] self.middleLayout.addLayout(self.leftBarLayout) self.middleLayout.addLayout(self.contentLayout) self.middleLayout.addLayout(self.rightBarLayout) self.bottomLayout = QHBoxLayout() self.bottomLeftHandle = QFrame() self.bottomLeftHandle.setStyleSheet( "border : none; background-color : rgb(110,110,110);") self.bottomLeftHandle.setMaximumSize(16, 5) self.bottomLeftHandle.setCursor(Qt.SizeBDiagCursor) self.bottomHandle = QFrame() self.bottomHandle.setStyleSheet( "border : none; background-color : rgb(110,110,110);") self.bottomHandle.setMaximumHeight(5) self.bottomHandle.setMinimumHeight(5) self.bottomHandle.setCursor(Qt.SizeVerCursor) self.bottomRightHandle = QFrame() self.bottomRightHandle.setStyleSheet( "border : none; background-color : rgb(110,110,110);") self.bottomRightHandle.setMaximumSize(16, 5) self.bottomRightHandle.setCursor(Qt.SizeFDiagCursor) self.bottomLayout.addWidget(self.bottomLeftHandle) self.bottomLayout.addWidget(self.bottomHandle) self.bottomLayout.addWidget(self.bottomRightHandle) #Add handle to a list self.handleList += [ self.bottomHandle, self.bottomLeftHandle, self.bottomRightHandle ] self.lowLayout = QVBoxLayout() self.lowLayout.addLayout(self.middleLayout) self.lowLayout.addLayout(self.bottomLayout) self.mainLayout.addWidget(self.titleBarArea) self.mainLayout.addLayout(self.lowLayout) ##Shadow self.shadow = QGraphicsDropShadowEffect() self.shadow.setColor(QColor(50, 50, 50, 200)) self.shadow.setXOffset(5) self.shadow.setYOffset(5) self.shadow.setBlurRadius(8) self.setGraphicsEffect(self.shadow) #self.shadow.setEnabled(False) self.setLayout(self.mainLayout) def setContent(self, content): self.contentLayout.addWidget(content) def showSmall(self): self.showMinimized() def showMaxRestore(self): if (self.maxNormal): self.showNormal() self.maxNormal = False self.btn_maximize.setIcon(QIcon(icon_path("ICON_MAXIMIZE"))) else: self.showMaximized() self.maxNormal = True self.btn_maximize.setIcon(QIcon(icon_path("ICON_MAXIMIZE_2"))) def mousePressEvent(self, event): if event.button() == Qt.LeftButton and QApplication.widgetAt( event.globalPos()) in self.handleList: #print(QApplication.widgetAt(event.globalPos())) self.moving = True self.pos_x = event.pos().x() self.pos_y = event.pos().y() self.pos = event.pos() def mouseMoveEvent(self, event): x_offset = event.pos().x() - self.pos_x y_offset = event.pos().y() - self.pos_y if self.moving: if self.rightHandle.underMouse(): self.resize(self.frameGeometry().width() + x_offset, self.frameGeometry().height()) self.pos_x += x_offset if self.leftHandle.underMouse(): self.move(event.globalPos().x() - self.pos_x, self.frameGeometry().y()) self.resize(self.frameGeometry().width() - x_offset, self.frameGeometry().height()) if self.bottomHandle.underMouse(): self.resize(self.frameGeometry().width(), self.frameGeometry().height() + y_offset) self.pos_y += y_offset if self.titleBarArea.underMouse(): self.move(event.globalPos() - self.pos) if self.rightBottomHandle.underMouse( ) or self.bottomRightHandle.underMouse(): self.resize(self.frameGeometry().width() + x_offset, self.frameGeometry().height() + y_offset) self.pos_x += x_offset self.pos_y += y_offset if self.leftBottomHandle.underMouse( ) or self.bottomLeftHandle.underMouse(): self.move(event.globalPos().x() - self.pos_x, self.frameGeometry().y()) self.resize(self.frameGeometry().width() - x_offset, self.frameGeometry().height() + y_offset) #self.pos_x += x_offset self.pos_y += y_offset def close(self): self.closed = True self.deleteLater()
def loadDesignItem(self, sku_code): self.lblSkuName.setText(sku_code) des = mysql_db.designInfo(self, sku_code) #self.vBox = QVBoxLayout() self.winGrid = QGridLayout() if not des: lblOpps = QLabel("""We could put a .png or something here, something better than text, to let the CSR's know that they searched an empty string or that the design they were looking for does not exist or that they mistyped what they were looking for.""", self) self.grid.addWidget(lblOpps) CSRWidgets.changeCentralWidget(self, self.vBox) self.currentInfo = {} for i in des: CSRWidgets.item = QListWidgetItem() CSRWidgets.item.setText(str(i[7])) self.currentInfo[i[7]] = (str(i[7]),str(i[8]),str(i[3]),str(i[9]),str(i[10]),str(i[11]),str(i[1])) smImage = self.currentInfo['T-Shirts'][3] hBox = QHBoxLayout() pix = QLabel() smImg = QPixmap("//wampserver/"+ smImage) myScaledPixmap = smImg.scaled(125,125, Qt.KeepAspectRatio) pix.setPixmap(myScaledPixmap) hBox.addWidget(pix) icons = {} for i in des: icons[(i)] = QToolButton(self) icons[(i)].setIcon(QIcon("//wampserver/" + str(i[10]))) icons[(i)].setIconSize(QSize(44, 44)) icons[(i)].setAutoRaise(True) icons[(i)].setToolButtonStyle(Qt.ToolButtonTextUnderIcon) #icons[(i)].setStyleSheet("background-color: rgb(255, 255, 255);") icons[(i)].setFont(QFont("Helvetica",8)) #icons[(i)].setObjectName(str(i[7])) icons[(i)].setText(str(i[7]) + '\n' + str(i[3])) icons[(i)].uniqueId = str(i[7]) icons[(i)].clicked.connect(self.itemClicked_Click) hBox.addWidget(icons[(i)]) hBox.addStretch(1) hFrame = QFrame() hFrame.setLayout(hBox) hFrame.setMaximumHeight(200) hFrame.setStyleSheet("background-color: rgb(255, 255, 255);") #Create table to hold and display details of order order as they are selected from the tree. CSRWidgets.tblOrderDetails = QTableWidget(7, 0) CSRWidgets.tblOrderDetails.hide() #CSRWidgets.tblOrderDetails.setMaximumHeight(250) self.winGrid.addWidget(hFrame, 0, 0, 2, 2) #self.vBox.addWidget(hFrame) #self.vBox.addWidget(CSRWidgets.tblOrderDetails) self.winGrid.addWidget(CSRWidgets.tblOrderDetails, 2, 0, 1, 1) #self.winGrid.addWidget(CSRWidgets.totalBox, 2, 1, 1, 1) #self.vBox.addStretch(1) CSRWidgets.changeCentralWidget(self, self.winGrid) CSRWidgets.updateOrderDetails(self) CSRWidgets.getCustomerName(self, sku_code)
class MainWindow(QWidget): def __init__(self): super(MainWindow, self).__init__() self.folder = settings.ROOT self.widget_close = None self.context = None self.base_path = os.path.dirname(__file__) #self.folder = folder QDir.setCurrent(self.base_path) #self.setWindowTitle('Data Library') #self.resize(840, 480) self.color_background = '#404040' self.color_text_field = '#A7A7A7' self.color_button = '#979797' self.color_panel_bright = '#727272' self.color_panel_dark = '#525252' self.color_border = '#2E2E2E' self.setUI() #self.style_button = "border-color: %s;background-color:%s;"%(self.color_border,self.color_button) def setUI(self): #QApplication.setStyle(QStyleFactory.create('Cleanlooks')) self.mainLayout = QVBoxLayout() self.mainLayout.setContentsMargins(0, 0, 0, 0) self.mainLayout.setSpacing(0) self.setStyleSheet(get_css("MainWindow")) #top Bar self.topBarArea = QFrame() self.topBarArea.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)) self.topBarArea.setMinimumHeight(32) self.topBarArea.setMaximumHeight(32) self.topBarLayout = QHBoxLayout() self.topBarLayout.setSpacing(2) self.topBarLayout.setContentsMargins(4, 1, 4, 1) self.topBarArea.setLayout(self.topBarLayout) self.topBarArea.setStyleSheet(get_css('Bar')) #Left Panel self.leftPanel = QFrame() #self.leftPanel.setMaximumWidth(132) self.leftPanel.setStyleSheet(get_css('PanelLeft')) self.leftPanelLayout = QVBoxLayout() self.leftPanelLayout.setContentsMargins(0, 0, 0, 0) self.leftPanel.setLayout(self.leftPanelLayout) self.outlinerLayout = QVBoxLayout() self.outlinerLayout.setContentsMargins(1, 5, 1, 1) self.assetChoiceLayout = QVBoxLayout() self.assetChoiceLayout.setContentsMargins(0, 0, 0, 0) self.treeWidget = TreeWidget() self.treeWidget.itemClicked.connect(self.onClickItem) # comboBox asset cbox_asset_choice self.cbox_asset_choice = ComboBox() self.cbox_asset_choice.setMinimumHeight(28) self.cbox_asset_choice.setStyleSheet(get_css("ComboBoxAsset")) #self.cbox_asset_choice.setStyleSheet("border-left : none; border-right : none; border-top : none") self.cbox_asset_choice.addItem(QIcon(icon_path("ICON_ACTION")), "Action") self.cbox_asset_choice.addItem(QIcon(icon_path("ICON_GROUP")), "Group") self.cbox_asset_choice.addItem(QIcon(icon_path("ICON_MATERIAL")), "Material") self.assetChoiceLayout.addWidget(self.cbox_asset_choice) self.outlinerLayout.addWidget(self.treeWidget) self.leftPanelLayout.addLayout(self.assetChoiceLayout) self.leftPanelLayout.addLayout(self.outlinerLayout) #Tool Box self.toolBoxPanel = QFrame() self.toolBoxPanel.setStyleSheet( "border : none; background-color : rgb(100,100,100)") self.toolBoxLayout = QVBoxLayout() self.toolBoxPanel.setLayout(self.toolBoxLayout) self.leftPanelLayout.addWidget(self.toolBoxPanel) #Middle self.middle = QFrame() self.middle.setStyleSheet(get_css('2DSpace')) self.middleLayout = QVBoxLayout() self.middleLayout.setContentsMargins(0, 0, 0, 0) self.thumbnailList = ThumbnailList(self.folder) self.thumbnailList.itemClicked.connect(self.onClickThumb) self.thumbnailList.itemDoubleClicked.connect(self.apply_pose) self.middleLayout.addWidget(self.topBarArea) self.middleLayout.addWidget(self.thumbnailList) self.middle.setLayout(self.middleLayout) #Right Panel self.rightPanel = QFrame() #self.rightPanel.setMaximumWidth(256) #self.rightPanel.setMinimumWidth(256) self.rightPanel.setStyleSheet(get_css('PanelRight')) self.rightLayout = QVBoxLayout() self.rightLayout.setContentsMargins(4, 4, 4, 4) self.rightPanel.setLayout(self.rightLayout) #Splitter self.splitter = QSplitter(Qt.Horizontal) self.splitter.setStyleSheet(get_css('Splitter')) #self.splitter.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) ## Dir button btn_parent_dir = PushButton(icon=icon_path('ICON_FILE_PARENT'), size=[22, 22]) ### add_asset button btn_add_asset = PushButton(icon=icon_path('ICON_ZOOMIN'), size=[22, 22]) btn_add_asset.clicked.connect(self.exportAnimPanel) btn_refresh = PushButton(icon=icon_path('ICON_FILE_FOLDER'), size=[22, 22]) btn_refresh.clicked.connect(self.refresh) #open folder button btn_open_folder = PushButton(icon=icon_path('OPEN_FOLDER'), size=[22, 22]) btn_open_folder.clicked.connect(self.open_folder) #search bar self.search_bar = LineEdit() self.search_bar.textChanged.connect(self.filterThumbnail) self.topBarLayout.addWidget(btn_parent_dir) self.topBarLayout.addWidget(self.search_bar) self.topBarLayout.addWidget(btn_refresh) self.topBarLayout.addWidget(btn_open_folder) # Adding Panel to splitter self.splitter.addWidget(self.leftPanel) self.splitter.addWidget(self.middle) self.splitter.addWidget(self.rightPanel) self.splitter.setSizes([132, 512, 256]) self.splitter.setStretchFactor(0, 0) self.splitter.setStretchFactor(1, 1) self.splitter.setStretchFactor(2, 0) #self.mainLayout.addWidget(self.topBarArea) self.mainLayout.addWidget(self.splitter) #shortcut self.shortcut_zoom_in = QShortcut(QKeySequence("+"), self) self.shortcut_zoom_out = QShortcut(QKeySequence("-"), self) self.shortcut_zoom_in.activated.connect(self.zoom_in) self.shortcut_zoom_out.activated.connect(self.zoom_out) self.setLayout(self.mainLayout) #self.show() def refresh(self): self.treeWidget.clear() TreeWidget().recursive_dir(self.folder, self.treeWidget, self.folder.count(os.sep)) def open_folder(self): try: os.startfile(self.folder) except: subprocess.Popen(['xdg-open', self.folder]) def exportAnimPanel(self): clear_layout(self.rightLayout) self.exportAnimPanel = ExportAnimPanel(self) self.rightLayout.addLayout(self.exportAnimPanel) def zoom_in(self): new_size = self.thumbnailList.iconSize().width() if not new_size > 512: new_size *= 1.25 self.thumbnailList.setIconSize(QSize(new_size, new_size)) #self.thumbnailList.setStyleSheet("QListView::item {height: %s;}"%(new_size+6)) def zoom_out(self): new_size = self.thumbnailList.iconSize().width() if not new_size < 64: new_size *= 0.75 self.thumbnailList.setIconSize(QSize(new_size, new_size)) #self.thumbnailList.setStyleSheet("QListView::item {height: %s;}"%(new_size+6)) # When selected of folder in the outliner def onClickItem(self, item): self.thumbnailList.clear() #a= TreeWidget(item.text(1)) #self.middle.addWidget(ThumbnailPanel.createWidget(item.text(1))) folder = item.text(1) for root, dirs, files in os.walk(folder): for filename in files: if os.path.splitext(filename)[1] in ['.png', '.jpg']: full_path = os.path.abspath(os.path.join(root, filename)) name = os.path.splitext(filename)[0].split('_')[0].replace( '-', ' ').capitalize() item = QListWidgetItem(name) item.setIcon(QIcon(full_path)) item.full_path = full_path self.thumbnailList.addItem(item) # display information when clicking on a thumbnail def onClickThumb(self, item): clear_layout(self.rightLayout) base_name = os.path.basename((item.full_path)) dir_name = os.path.dirname((item.full_path)) description_name = base_name.replace( base_name.split('_')[-1], 'description.txt') description_path = os.path.join(dir_name, description_name) infile = open(description_path).read() self.textPanel = QFrame() self.textPanel.setStyleSheet( "border : none; background-color : rgb(100,100,100)") #self.text self.textLayout = QVBoxLayout() self.textPanel.setLayout(self.textLayout) #Fill layout #Text description self.textWidget = QPlainTextEdit() self.textWidget.setPlainText(infile) self.textLayout.addWidget(self.textWidget) #Preview Image self.previewImage = QLabel() self.previewImage.setStyleSheet("border : none;") #sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) #sizePolicy.setHeightForWidth(True) self.previewImage.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) self.previewImage.setMinimumSize(256, 256) self.previewImage.setMaximumSize(256, 256) self.previewImage.setScaledContents(True) #self.previewImage.setWidgetResizable(True) thumb = QPixmap(item.full_path) self.previewImage.setPixmap(thumb) self.rightLayout.addWidget(self.previewImage) self.rightLayout.addWidget(self.textPanel) def apply_pose(self, item): ob = self.context.scene.objects.active clear_layout(self.toolBoxLayout) self.frame_current = bpy.context.scene.frame_current self.blend = QSlider() self.blend.setOrientation(Qt.Horizontal) self.blend.setValue(100) self.blend.setMaximum(100) self.action_left = CheckBox('Left') self.action_left.setChecked(True) self.action_right = CheckBox('Right') self.action_right.setChecked(True) self.selected_only = CheckBox('Selected only') self.selected_only.setChecked(True) self.mirror_pose = CheckBox('Mirror') self.mirror_pose.setChecked(False) self.toolBoxLayout.addWidget(self.blend) row_L_R = QHBoxLayout() row_L_R.addWidget(self.action_right) row_L_R.addWidget(self.action_left) self.toolBoxLayout.addLayout(row_L_R) self.toolBoxLayout.addWidget(self.selected_only) self.toolBoxLayout.addWidget(self.mirror_pose) self.action = {} item_basename = os.path.splitext(item.full_path)[0] action_txt = item_basename.replace('_thumbnail', '_action') + '.txt' self.blend.setValue(100) with open(action_txt) as poseLib: for line in poseLib: fcurve = line.split("=")[0] value = eval(line.split("=")[1].replace("\n", "")) self.action[fcurve] = value if ob: for fcurve, value in self.action.items(): for path, channel in value.items(): #print(channel.items()) for array_index, attributes in channel.items(): correct_path = find_fcurve_path( ob, fcurve, path, array_index) dstChannel = correct_path[0] for index, keypose in enumerate( self.action[fcurve][path][array_index]): #print(keypose) self.action[fcurve][path][array_index][index][ 1].append(dstChannel) #if find_mirror(fcurve) : self.blend.valueChanged.connect(lambda: self.refresh_pose(action_txt)) self.action_left.stateChanged.connect( lambda: self.refresh_pose(action_txt)) self.action_right.stateChanged.connect( lambda: self.refresh_pose(action_txt)) self.selected_only.stateChanged.connect( lambda: self.refresh_pose(action_txt)) self.mirror_pose.stateChanged.connect( lambda: self.refresh_pose(action_txt)) self.refresh_pose(action_txt) # Apply the pose or anim to the rig def refresh_pose(self, action): ob = self.context.scene.objects.active if ob.type == 'ARMATURE' and ob.mode == 'POSE': read_anim(self.action, self.blend.value() * 0.01, self.action_left.isChecked(), self.action_right.isChecked(), self.selected_only.isChecked(), self.mirror_pose.isChecked(), self.frame_current) # When taping in the search bar def filterThumbnail(self): items = (self.thumbnailList.item(i) for i in range(self.thumbnailList.count())) for w in items: if self.search_bar.text().lower() not in w.text().lower(): w.setHidden(True) else: w.setHidden(False) def closeEvent(self, event): self.widget_close = True self.deleteLater()
class Broswer_Img(QMainWindow): """ 选择图片文件并且预览,自动匹配多图的情况和背景图片 """ Close_Signal = pyqtSignal(list) def __init__(self, *args, **kwargs): QMainWindow.__init__(self, *args, **kwargs) self.Current_Dir = QDir.home().absolutePath() #self.Current_Dir = Wk_Dir self.setWindowTitle("Select Imags") self.setWindowModality(Qt.ApplicationModal) self.Left_Dock_Code() self.Central_Frame_Code() self.Right_Dock_Code() self.connect_Signals() self.wb_nav_left.setEnabled(False) self.wb_nav_right.setEnabled(False) self.bkgd_nav_left.setEnabled(False) self.bkgd_nav_right.setEnabled(False) #self.setGeometry(200, 200, 1000, 600) #self.setMaximumSize(QSize(1000, 600)) def Left_Dock_Code(self): self.Left_Frame = QFrame(self) self.Model = QFileSystemModel() self.Model.setNameFilterDisables(False) self.Model.setRootPath(self.Current_Dir) #self.Model.setSorting(QDir.DirsFirst | QDir.IgnoreCase | QDir.Name) self.Model.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs | QDir.AllEntries) self.Model.setNameFilters(['*.tif']) self.Tree = QTreeView(self.Left_Frame) self.Tree.setModel(self.Model) self.Tree.setRootIndex(self.Model.index(self.Current_Dir)) self.Tree.expandAll() self.Dir_Select = QPushButton("Select a Folder", self.Left_Frame) layout = QVBoxLayout() layout.addWidget(self.Tree) layout.addWidget(self.Dir_Select) self.Left_Frame.setLayout(layout) self.Left_Dock = QDockWidget('Broswer Images', self) self.Left_Dock.setWidget(self.Left_Frame) self.Left_Dock.setFeatures(QDockWidget.NoDockWidgetFeatures) self.Dir_Select.clicked.connect(self.dir_selection) self.addDockWidget(Qt.LeftDockWidgetArea, self.Left_Dock) def Central_Frame_Code(self): self.Central_Frame = QFrame(self) layout = QGridLayout() self.wb_label = QLabel(self.Central_Frame) self.bkgd_label = QLabel(self.Central_Frame) #self.wb_label.setMaximumHeight(30) self.wb_label.setWordWrap(True) self.wb = QLabel(self.Central_Frame) self.wb.setScaledContents(True) self.bkgd = QLabel(self.Central_Frame) self.bkgd.setScaledContents(True) self.wb.setMaximumSize(QSize(300, 300)) self.bkgd.setMaximumSize(QSize(300, 300)) self.wb_navigator = QFrame(self.Central_Frame) self.wb_nav_left = QPushButton('<--', self.wb_navigator) self.wb_nav_right = QPushButton('-->', self.wb_navigator) nav_layout = QHBoxLayout() nav_layout.addWidget(self.wb_nav_left) nav_layout.addWidget(self.wb_nav_right) self.wb_navigator.setLayout(nav_layout) self.wb_navigator.setMaximumHeight(60) self.bkgd_navigator = QFrame(self.Central_Frame) self.bkgd_nav_left = QPushButton('<--', self.bkgd_navigator) self.bkgd_nav_right = QPushButton('-->', self.bkgd_navigator) nav_layout2 = QHBoxLayout() nav_layout2.addWidget(self.bkgd_nav_left) nav_layout2.addWidget(self.bkgd_nav_right) self.bkgd_navigator.setLayout(nav_layout2) self.bkgd_navigator.setMaximumHeight(60) self.btns = QFrame(self.Central_Frame) self.btns.setMaximumHeight(60) self.Btn_Add = QPushButton('Add', self.btns) self.Btn_Close = QPushButton('Close', self.btns) btn_layout = QHBoxLayout() btn_layout.addWidget(self.Btn_Add) btn_layout.addWidget(self.Btn_Close) self.btns.setLayout(btn_layout) # 根据具体的传入参数构建不同的视图 layout.addWidget(self.wb_label, 0, 0) layout.addWidget(self.bkgd_label, 0, 1) layout.addWidget(self.wb, 1, 0) layout.addWidget(self.bkgd, 1, 1) layout.addWidget(self.wb_navigator, 2, 0) layout.addWidget(self.bkgd_navigator, 2, 1) layout.addWidget(self.btns, 3, 0, 2, 0) layouts = QVBoxLayout() layouts.addLayout(layout) self.Central_Frame.setLayout(layouts) self.setCentralWidget(self.Central_Frame) #self.setStyleSheet('border:1px solid red') def Right_Dock_Code(self): self.Added_Img_tree = Img_Tree([], self) self.Right_Dock = QDockWidget('Selected Images', self) self.Right_Dock.setWidget(self.Added_Img_tree) self.Right_Dock.setFeatures(QDockWidget.NoDockWidgetFeatures) self.addDockWidget(Qt.RightDockWidgetArea, self.Right_Dock) def connect_Signals(self): self.Tree.clicked.connect(self.Load_Img_to_Central_Frame) self.wb_nav_left.clicked.connect(self.change_img_index) self.wb_nav_right.clicked.connect(self.change_img_index) self.bkgd_nav_left.clicked.connect(self.change_img_index) self.bkgd_nav_right.clicked.connect(self.change_img_index) self.Btn_Add.clicked.connect(self.Add_Btn_Action) self.Btn_Close.clicked.connect(self.Close_Btn_Action) def Load_Img_to_Central_Frame(self, Index): select_file = self.Tree.model().filePath(Index) _, ext = os.path.splitext(select_file) if ext in ['.tif', '.jpeg', '.png', '.jpg']: self.Related_Imgs = BioRad_Imgs(select_file) self.set_Central_Frame() def set_Central_Frame(self): self.wb_nav_left.setEnabled(False) self.wb_nav_right.setEnabled(False) self.bkgd_nav_left.setEnabled(False) self.bkgd_nav_right.setEnabled(False) self.current_wb = self.Related_Imgs.WB_list[self.Related_Imgs.wb_index] self.current_bkgd = self.Related_Imgs.BKGD_list[ self.Related_Imgs.bkgd_index] self.wb_label.setText( self.current_wb.replace(self.Related_Imgs.Dir, '.')) self.bkgd_label.setText( self.current_bkgd.replace(self.Related_Imgs.Dir, '.')) wb, _ = CV_Img_to_QImage(cv2.imread(self.current_wb)) bkgd, _ = CV_Img_to_QImage(cv2.imread(self.current_bkgd)) self.wb.setPixmap(wb) self.wb.setScaledContents(True) self.bkgd.setPixmap(bkgd) wb_len = len(self.Related_Imgs.WB_list) bkgd_len = len(self.Related_Imgs.BKGD_list) if self.Related_Imgs.wb_index > 0: self.wb_nav_left.setEnabled(True) if wb_len - self.Related_Imgs.wb_index > 1: self.wb_nav_right.setEnabled(True) if self.Related_Imgs.bkgd_index > 0: self.bkgd_nav_left.setEnabled(True) if bkgd_len - self.Related_Imgs.bkgd_index > 1: self.bkgd_nav_right.setEnabled(True) def change_img_index(self): sender = self.sender() if sender == self.wb_nav_left: self.Related_Imgs.wb_index = self.Related_Imgs.wb_index - 1 if sender == self.wb_nav_right: self.Related_Imgs.wb_index = self.Related_Imgs.wb_index + 1 if sender == self.bkgd_nav_left: self.Related_Imgs.bkgd_index = self.Related_Imgs.bkgd_index - 1 if sender == self.bkgd_nav_right: self.Related_Imgs.bkgd_index = self.Related_Imgs.bkgd_index + 1 self.set_Central_Frame() def Add_Btn_Action(self): list = [{'wb': self.current_wb, 'bkgd': self.current_bkgd}] self.Added_Img_tree.Add_top_Level_Item(list) print(self.Added_Img_tree.imgs) def Close_Btn_Action(self): self.close() def closeEvent(self, event): self.Close_Signal.emit(self.Added_Img_tree.imgs) def dir_selection(self): global Wk_Dir dir = QFileDialog.getExistingDirectory(self, "Choose a Directory", Wk_Dir) self.Current_Dir = dir Wk_Dir = dir self.Tree.setRootIndex(self.Model.index(self.Current_Dir)) self.Left_Dock.setWindowTitle(dir)
def __init__(self, parent=None): super().__init__( parent, Qt.MSWindowsFixedSizeDialogHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint | Qt.WindowCloseButtonHint, ) self.setAttribute(Qt.WA_DeleteOnClose) self.setWindowModality(Qt.ApplicationModal) self.setWindowTitle(self.tr("About")) app = QApplication.instance() name = app.applicationName() domain = app.organizationDomain() iconLabel = QLabel(self) iconLabel.setAlignment(Qt.AlignCenter) iconLabel.setMaximumWidth(250) iconLabel.setMinimumSize(250, 210) icon = self.windowIcon() size = icon.actualSize(QSize(186, 186)) iconLabel.setPixmap(icon.pixmap(size)) titleLabel = QLabel(self) titleLabel.setText( self. tr("<p style='color: #353535; font-size: 24pt; font-weight: 250'>" "TruFont Font Editor</p>" "<p style='font-size: 13pt; font-weight: 400'>{} Pristine Wax</p>" ).format(__version__)) textLabel = QLabel(self) text = self.tr( "<p>{n} is a free and open source font editor and scripting " "environment made by the developers of the {n} community.</p>" "<p>{n} is built upon the " "<a href='http://ts-defcon.readthedocs.org/en/ufo3/' " "style='color: #356FDE'>defcon</a> UFO library and exposes a " "<a href='http://robofab.com/' style='color: #356FDE'>robofab</a>" "-like API for scripting purposes.</p>" "<p>Running on Qt {} (PyQt {}).</p>" "<p>Version {} {} – Python {}.").format( QT_VERSION_STR, PYQT_VERSION_STR, __version__, gitShortHash, platform.python_version(), n=name, ) if domain: text += self.tr( "<br>See <a href='http://{d}' style='color: #356FDE'>{d}</a> " "for more information.</p>").format(d=domain) else: text += "</p>" textLabel.setText(text) textLabel.setOpenExternalLinks(True) textLabel.setWordWrap(True) authorsLabel = QTextBrowser(self) authorsLabel.setText("\n".join(self.authors())) licenseLabel = QTextBrowser(self) licenseLabel.setText(licenseText) thanksLabel = QTextBrowser(self) thanksLabel.setText(thanksText) self.stackWidget = QStackedWidget(self) self.stackWidget.addWidget(textLabel) self.stackWidget.addWidget(authorsLabel) self.stackWidget.addWidget(licenseLabel) self.stackWidget.addWidget(thanksLabel) textLayout = QVBoxLayout() textLayout.setContentsMargins(0, 14, 16, 16) textLayout.addWidget(titleLabel) textLayout.addWidget(self.stackWidget) spacer = QWidget() spacer.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) textLayout.addWidget(spacer) mainLayout = QHBoxLayout() mainLayout.addWidget(iconLabel) mainLayout.addLayout(textLayout) frame = QFrame() frame.setMinimumHeight(54) frame.setMaximumHeight(54) frame.setStyleSheet("background: rgb(230, 230, 230)") buttonsLayout = QHBoxLayout(frame) for index, text in enumerate(("Authors", "License", "Credits")): label = QLabel(text, self) label.setAlignment(Qt.AlignCenter) label.setCursor(Qt.PointingHandCursor) label.setProperty("index", index + 1) label.setStyleSheet("color: #356FDE; text-decoration: underline") label.installEventFilter(self) buttonsLayout.addWidget(label) layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.addLayout(mainLayout) layout.addWidget(frame)
class MainWindow(QMainWindow): def __init__(self, parent: QWidget = None) -> None: super(MainWindow, self).__init__(parent) # Welcome - about message. self.show_about_message() # Data structures. self.list_of_video_IDs: list = [] self.log_texts: list = [] self.streams: list = [] self.yt: Optional[YouTube] = None self.yt_playlist: Optional[Playlist] = None self.yt_history: list = [] self.yt_folder: pathlib.Path = pathlib.Path("./") self.down_vids_counter: int = 0 # setup user interface self.create_main_window() self.create_menu_bar() self.btn_check.clicked.connect(self.check) self.btn_download.clicked.connect(self.download) self.btn_add_row.clicked.connect(self.add_row) self.btn_remove_row.clicked.connect(self.remove_row) self.btn_show_log.toggled.connect(self.log_frame.setVisible) self.tabs.currentChanged.connect(self.disable_btns) self.btn_open_CWD.clicked.connect(self.open_CWD) self.btn_cancel.clicked.connect(self.cancel) self.le_video_url.editingFinished.connect(self.clear_list) def create_main_window(self) -> None: """Creates main window: all buttons, layouts connections are kept outside this method. This method is called inside the init method """ self.setWindowTitle("RTV and YT video downloader") self.setWindowIcon(QIcon(":/main_window_icon.png")) self.resize(800, 700) header = ["Video ID", "Video info"] self.table = QTableWidget() self.table.setColumnCount(len(header)) self.table.setRowCount(len(TEST_TABLE) + 3) self.table.setHorizontalHeaderLabels(header) self.populate_table(TEST_TABLE) self.table.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) self.table.resizeColumnsToContents() vbox_table = QVBoxLayout() vbox_table.addWidget(self.table) self.log_frame = QFrame() self.log_frame.setMaximumHeight(600) self.log_frame.setMinimumHeight(200) log_label = QLabel("Log text:") self.le_log_text = QTextEdit() self.le_log_text.setReadOnly(True) log_vbox = QVBoxLayout() log_vbox.addWidget(log_label) log_vbox.addWidget(self.le_log_text) self.log_frame.setLayout(log_vbox) self.btn_check = QPushButton("Check") self.btn_download = QPushButton("Download") self.btn_add_row = QPushButton("Add row") self.btn_remove_row = QPushButton("Remove last row") self.btn_cancel = QPushButton("Cancel") self.btn_cancel.setEnabled(False) self.btn_show_log = QPushButton("Log text") self.btn_show_log.setCheckable(True) self.btn_show_log.setChecked(True) self.btn_open_CWD = QPushButton("Open") self.cb_convert_mp3 = QCheckBox("Convert to mp3") self.cb_convert_mp3.setChecked(True) label_WD = QLabel("Current directory:") label_WD_lyt = QHBoxLayout() label_WD_lyt.addWidget(self.btn_open_CWD) label_WD_lyt.addWidget(label_WD) label_WD_lyt.addStretch(1) self.le_CWD = QLineEdit(str(self.yt_folder)) self.le_CWD.setReadOnly(True) self.progress_bar = QProgressBar(self) # self.progress_bar.setGeometry(200, 80, 250, 20) vbox_WD = QVBoxLayout() vbox_WD.addLayout(label_WD_lyt) vbox_WD.addWidget(self.le_CWD) vbox_WD.addWidget(self.progress_bar) vbox1 = QVBoxLayout() vbox1.addWidget(self.btn_check) vbox1.addWidget(self.btn_download) vbox1.addWidget(self.btn_add_row) vbox1.addWidget(self.btn_remove_row) vbox1.addWidget(self.btn_cancel) vbox1.addSpacing(20) vbox1.addWidget(self.btn_show_log) vbox1.addStretch() self.rtv_download_tab = QWidget() self.rtv_download_tab.setLayout(vbox_table) label_url = QLabel("Video URL: ") self.le_video_url = QLineEdit(TEST_YT_VIDEO) hbox_le = QHBoxLayout() hbox_le.addWidget(label_url) hbox_le.addWidget(self.le_video_url) self.lw_streams = QListWidget() vbox_tube1 = QVBoxLayout() vbox_tube1.addLayout(hbox_le) vbox_tube1.addWidget(self.lw_streams) vbox_tube1.addWidget(self.cb_convert_mp3) self.youtube_download_tab = QWidget() self.youtube_download_tab.setLayout(vbox_tube1) # self.log_frame.hide() self.tabs = QTabWidget() self.tabs.addTab(self.rtv_download_tab, "RTV_radio_downloads") self.tabs.addTab(self.youtube_download_tab, "Youtube_downloads") hbox1 = QHBoxLayout() hbox1.addWidget(self.tabs) hbox1.addLayout(vbox1) vbox2 = QVBoxLayout() vbox2.addLayout(hbox1) vbox2.addLayout(vbox_WD) # vbox2.addWidget(self.progress_bar) vbox2.addWidget(self.log_frame) main_layout = QVBoxLayout() main_layout.addLayout(vbox2) self.main_window = QWidget() self.main_window.setLayout(main_layout) self.setCentralWidget(self.main_window) def create_menu_bar(self): """ this is not needed yet changed my mind: for importing list of IDs """ # file menu self.file_menu = self.menuBar().addMenu("&File") file_load_action = self.create_action( "&Load file", shortcut="Ctrl+L", slot=self.import_IDs, tip="Import text file with a column of IDs", icon="import-icon", ) file_quit_action = self.create_action("&Quit", shortcut="Ctrl+q", slot=self.close, tip="Close the application") self.add_actions(self.file_menu, [file_load_action, file_quit_action]) # Edit menu self.edit_menu = self.menuBar().addMenu("&Edit") set_filter_action = self.create_action( "Select &filter", shortcut="Ctrl+F", slot=self.refine_streams, tip="Select different filter to show streams in list", icon="filter-icon", ) self.add_actions(self.edit_menu, [set_filter_action]) # help menu self.help_menu = self.menuBar().addMenu("&Help") help_about_action = self.create_action( "&About", shortcut="Ctrl+Shift+A", slot=self.show_about_message, tip="Show info about the application.", icon="tv-icon", ) self.add_actions(self.help_menu, [help_about_action]) def show_about_message(self): QMessageBox.about( self, "This is the video downloader version: {0}".format(__version__), "Use <b>Video downloader</b> to download videos." "There are two options:<br>" '<a href="https://4d.rtvslo.si/arhiv/&sp=qs:raal">RTV SLO</a><br>' "or you should go to<br>" '<a href="https://www.youtube.com/?gl=SI&hl=sl">Youtube</a>.<br><br>' "Select one of two options and <b>click</b> one of above links to pop up " "appropriate web page from which you wish to select videos.<br><br>" "Have fun.", ) def refine_streams(self): raise NotImplementedError("Set filter action. To do.") def populate_table(self, list): """ Repopulates the table, with the items in list argument """ rows = len(list) # self.table.rowCount() self.table.setRowCount(rows) for i in range(len(list)): self.table.setItem(i, 0, QTableWidgetItem(list[i])) def add_row(self): row_position = self.table.rowCount() self.table.insertRow(row_position) def remove_row(self): row_position = self.table.currentRow() if row_position == -1: # ni vrstice row_position = self.table.rowCount() - 1 self.table.removeRow(row_position) def import_IDs(self): path = "." fname, f_type = QFileDialog.getOpenFileName( self, "Import IDs from text file", path, "Text files (*.txt)") if fname: fh = open(fname, "r") raw_text = fh.read() imported_IDs = raw_text.split("\n") self.populate_table(imported_IDs) def check(self): """Selects appropriate function of check button, according to the selected tab. """ if self.tabs.currentIndex() == 0: self.check_IDs() elif self.tabs.currentIndex() == 1: self.get_formats() def download_playlist(self): if self.yt_playlist is None: QMessageBox.warning(self, "Download error", "Link is not a playlist.") return for yt in self.yt_playlist: print(f"{yt=}") print(f"{yt.title()=}") print(f"{yt.streams=}") stream = yt.streams.first() print(f"{stream=}") def get_formats(self): """Creates youtube video object acquires all possible selected formats and populates the QListWidget (formats_list) user has to select which format to download. """ yt_url = self.le_video_url.text() self.yt = YouTube( yt_url) # , on_progress_callback = self.progress_check self.streams = self.yt.streams.filter(progressive=True) self.populate_list_youtube() return True, "Youtube streams info acquired" def progress_check(self, stream=None, chunk=None, file_handle=None, remaining=None): # Gets the percentage of the file that has been downloaded. # percent = (100*(stream.filesize-remaining))/stream.filesize # self.progress_bar.setValue(percent) self.progress_bar.setRange(0, 0) def update_CWD(self): """ syncs the line edit and actual CWD """ self.le_CWD.setText(str(self.yt_folder)) def browse_and_set_CWD(self): """ select current working directory (CWD) """ fname = QFileDialog.getExistingDirectory(self, "Where to save video?", str(self.yt_folder)) if fname: self.yt_folder = pathlib.Path(fname) self.update_CWD() return True else: return False def open_CWD(self): """opens CWD in windows explorer""" if platform.system() == "Windows": command = 'explorer "{0}"'.format(self.yt_folder) subprocess.run(command.replace("/", "\\")) else: command = "gnome-terminal -x cd {0}".format( self.yt_folder.as_posix()) subprocess.run("gnome-terminal") def check_IDs(self): """ Check which of the cells contain IDs of a videos that can be fetched, for each video some basic information is printed to the second column. if error, I still have to think what to do """ rows = self.table.rowCount() for i in range(rows): item = self.table.item(i, 0) if item: video_ID_number = item.text() get_info_api = rtv_videos_downloader.RTV_VIDEO_DOWNLOAD_LINK.format( video_ID_number) response = requests.get(get_info_api) if response.status_code != 200: return False, "Error at acquiring the info about the video." response_dict = response.json() # info about the file name if "response" in response_dict: file_name = response_dict["response"]["mediaFiles"][0][ "filename"] self.table.setItem(i, 1, QTableWidgetItem(file_name)) self.table.resizeColumnsToContents() return True, "info added" def download(self): """Selects appropriate function of download button according to the selected tab - youtube or rtv """ if self.tabs.currentIndex() == 0: self.download_videos_rtv() elif self.tabs.currentIndex() == 1: self.download_yt_video() def download_yt_video(self): """Downloads selected youtube video.""" # get video from the user selection in the list widget if self.lw_streams.currentItem() is None: QMessageBox.warning(self, "Warning", "Please select a stream from the list.") return idx = self.lw_streams.currentRow() stream = self.streams[idx] # show file size and ask user if it is realy sure he wants to download answer = QMessageBox.question( self, "File size", "Are you sure you want to download video:<br><br>" + "<b>" + self.yt.title + "</b>" + "<br><br><br>With file size: <b>{0:.1f} MB</b>".format( stream.filesize / 2**20), ) if answer == QMessageBox.No: return # where to save folder OK = self.browse_and_set_CWD() if not OK: return # set up progress bar self.progress_bar.setMaximum(100) self.progress_bar.setValue(0) # Create download worker and move it to new thread. self.download_thread = QThread() self.download_worker = yt_videos_downloader.DownloadYoutubeWorker( self.yt, stream, self.yt_folder, self.cb_convert_mp3.isChecked(), self) self.download_worker.moveToThread(self.download_thread) self.download_thread.started.connect(self.download_worker.run) self.download_worker.finished.connect(self.download_thread.quit) self.download_worker.finished.connect(self.download_worker.deleteLater) self.download_thread.finished.connect(self.download_thread.deleteLater) # Reporting progress: self.download_worker.preparation_started.connect(self.add_to_log) self.download_worker.preparation_started.connect(self.progress_check) self.download_worker.start_video_loading.connect(self.add_to_log) self.download_worker.video_downloaded.connect(self.add_to_log) self.download_worker.finished.connect(self.done) self.download_worker.converted_to_mp3.connect(self.add_to_log) # Start the worker thread. self.download_thread.start() # start download self.start_downloading() self.down_vids_counter = self.down_vids_counter + 1 def download_videos_rtv(self) -> None: """Create list of all videos. Subsequently, start the download thread and connect all the methods with the signals emitted inside the download thread. """ rows = self.table.rowCount() number_of_rows = range(rows) self.list_of_video_IDs = [] for i in number_of_rows: item = self.table.item(i, 0) if item: video_ID_number = item.text() self.list_of_video_IDs.append(video_ID_number) self.progress_bar.setMaximum(len(self.list_of_video_IDs)) self.progress_bar.setValue(0) self.download_thread = QThread() self.download_worker = rtv_videos_downloader.DownloadVideoWorker( self.list_of_video_IDs, self) self.download_worker.moveToThread(self.download_thread) self.download_thread.started.connect(self.download_worker.run) self.download_worker.finished.connect(self.download_thread.quit) self.download_worker.finished.connect(self.download_worker.deleteLater) self.download_thread.finished.connect(self.download_thread.deleteLater) # Reporting progress: self.download_worker.preparation_started.connect(self.add_to_log) self.download_worker.start_video_loading.connect(self.add_to_log) self.download_worker.video_downloaded.connect(self.update_progress_bar) self.download_worker.start_downloading.connect(self.start_downloading) self.download_worker.finished.connect(self.done) # Start the worker thread. self.download_thread.start() def update_progress_bar(self, msg): """ Update the progress bar, when downloading rtv videos First add to log text and then update the k and the progress bar """ k = self.progress_bar.value() self.le_log_text.insertPlainText( time.strftime("%H:%M:%S") + ": " + str(k) + " " + msg + "\n\n") self.log_texts.append(msg) k = self.progress_bar.value() + 1 self.progress_bar.setValue(k) self.down_vids_counter = self.down_vids_counter + 1 k = self.down_vids_counter def add_to_log(self, msg): """Adds message to the log file.""" k = self.down_vids_counter # self.progress_bar.value() + 1 self.log_texts.append(msg) self.le_log_text.insertPlainText( time.strftime("%H:%M:%S") + ": " + str(k) + " " + msg + "\n") def start_downloading(self): """start downloading, disable Download, Add row buttons Enable Cancel button """ self.btn_cancel.setEnabled(True) self.btn_download.setEnabled(False) self.btn_add_row.setEnabled(False) def disable_btns(self): """Properly enable, disable buttonsaccording to the selected tab.""" if self.tabs.currentIndex() == 1: self.btn_add_row.setEnabled(False) self.btn_remove_row.setEnabled(False) elif self.tabs.currentIndex() == 0: self.btn_add_row.setEnabled(True) self.btn_remove_row.setEnabled(True) def done(self): """ Show the message that fetching videos is done. Disable Cancel button, enable the Download, Add row buttons and reset progress bar to 0 """ self.btn_cancel.setEnabled(False) self.btn_download.setEnabled(True) self.btn_add_row.setEnabled(True) self.progress_bar.setRange(0, 100) self.progress_bar.setValue(0) QMessageBox.information(self, "Done!", "All desired videos downloaded!") self.disable_btns() self.download_thread = None def cancel(self): """Terminate download thread Enable Download button, Add row Disable Cancel button """ self.download_thread.terminate() self.btn_cancel.setEnabled(False) self.btn_download.setEnabled(True) self.btn_add_row.setEnabled(True) self.progress_bar.setValue(0) self.disable_btns() QMessageBox.warning( self, "Terminated!", "You have terminated the download thread\n\ see log text to see additional info !", ) def populate_list_youtube(self): self.lw_streams.clear() if len(self.streams) > 0: for stream in self.streams: item = QListWidgetItem(str(stream)) self.lw_streams.addItem(item) def clear_list(self): self.lw_streams.clear() self.streams = [] self.yt = None def closeEvent(self, event): folder = pathlib.Path("./history/") folder.mkdir(parents=True, exist_ok=True) time_string = time.strftime("%m-%d-%Y_%H-%M-%S") fname = "log_text_" + time_string + ".txt" with open(folder / fname, "w") as f: for text in self.log_texts: f.write(text + "\n") QApplication.quit() # ********************************************* HELPER FUNCTIONS def add_actions(self, target, actions): for action in actions: if action is None: target.addSeparator() else: target.addAction(action) def create_action( self, text, slot=None, shortcut=None, icon=None, tip=None, checkable=False, signal="triggered()", ): action = QAction(text, self) if icon is not None: action.setIcon(QIcon("./icons/{}.png".format(icon))) if shortcut is not None: action.setShortcut(shortcut) if tip is not None: action.setToolTip(tip) action.setStatusTip(tip) if slot is not None: action.triggered.connect(slot) if checkable: action.setCheckable(True) return action
class MainWindow(QWidget): def __init__(self): super(MainWindow, self).__init__() self.asset_type = get_asset_type() self.settings = settings self.working_dir = working_dir self.title = None self.treeWidget = None self.cbox_filter = None self.widget_close = None #self.view_mode = None self.context = None self.thumbnailList = None #self.folders = folder QDir.setCurrent(working_dir) self.setWindowTitle('Lib Manager') self.resize(840, 480) self.color_background = '#404040' self.color_text_field = '#A7A7A7' self.color_button = '#979797' self.color_panel_bright = '#727272' self.color_panel_dark = '#525252' self.color_border = '#2E2E2E' self.setUI() #self.style_button = "border-color: %s;background-color:%s;"%(self.color_border,self.color_button) def setUI(self): self.setWindowFlags(Qt.WindowStaysOnTopHint) self.mainLayout = QVBoxLayout() self.mainLayout.setContentsMargins(0, 0, 0, 0) self.mainLayout.setSpacing(0) self.setStyleSheet(get_css("MainWindow")) #Title Bar self.area = ComboBox() self.area.setStyleSheet(get_css("ComboBoxArea")) self.area.currentIndexChanged.connect(self.change_area) #self.area.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.area.setFixedWidth(32) #self.area.setMinimumWidth(32) #self.area.setMinimumHeight(28) #Populate the step_filter by the steps in settings self.area.addItem(QIcon(icon_path("ICON_GROUP")), "Library") self.area.addItem(QIcon(icon_path("ICON_MATERIAL")), "Assets") self.area.addItem(QIcon(icon_path("ICON_ARMATURE_DATA")), "Picker") self.area.addItem(QIcon(icon_path("ICON_SETTINGS")), "Prefs") self.titleBarArea = QFrame() self.titleBarLayout = QHBoxLayout() self.titleBarArea.setLayout(self.titleBarLayout) self.titleBarLayout.setContentsMargins(4, 0, 0, 0) self.titleBarArea.setStyleSheet(""" border : none; background-color : rgb(100,100,100); border-style: solid; border-color: rgb(50, 50, 50); border-bottom-width: 1px;""") self.titleBarArea.setMinimumHeight(28) self.titleBarArea.setMaximumHeight(28) self.title = Label(text='Library') #self.toolBox = QFrame() self.toolBoxLayout = QHBoxLayout() self.toolBoxLayout.setContentsMargins(12, 0, 12, 0) # Batch self.btn_batch = PushButton(icon=icon_path("ICON_CONSOLE"), size=[22, 22]) self.btn_batch.clicked.connect(self.batch) self.btn_batch.setToolTip('Batch') # Add asset self.btn_add_asset = PushButton(icon=icon_path("ICON_ZOOMIN"), size=[22, 22]) self.btn_add_asset.clicked.connect(self.add_asset) self.btn_add_asset.setToolTip('Add an asset') # Settings Button self.btn_settings = PushButton(icon=icon_path("ICON_SETTINGS"), size=[22, 22]) self.btn_settings.setToolTip('Settings') # Add button to layout self.toolBoxLayout.addWidget(self.btn_batch) self.toolBoxLayout.addWidget(self.btn_add_asset) self.toolBoxLayout.addWidget(self.btn_settings) self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.hSpacer = QSpacerItem(30, 20, QSizePolicy.Maximum, QSizePolicy.Minimum) self.titleBarLayout.addWidget(self.area) self.titleBarLayout.addWidget(self.title) self.titleBarLayout.addItem(self.horizontalSpacer) self.titleBarLayout.addLayout(self.toolBoxLayout) #self.titleBarLayout.addItem(self.hSpacer) #top Bar self.topBarArea = QFrame() self.topBarArea.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)) self.topBarArea.setMinimumHeight(32) self.topBarArea.setMaximumHeight(32) self.topBarLayout = QHBoxLayout() self.topBarLayout.setSpacing(2) self.topBarLayout.setContentsMargins(4, 1, 4, 1) self.topBarArea.setLayout(self.topBarLayout) self.topBarArea.setStyleSheet(get_css('Bar')) #Left Panel self.leftPanel = QFrame() #self.leftPanel.setMaximumWidth(132) self.leftPanel.setStyleSheet(get_css('PanelLeft')) self.leftPanelLayout = QVBoxLayout() self.leftPanelLayout.setContentsMargins(0, 0, 0, 0) self.leftPanel.setLayout(self.leftPanelLayout) self.outlinerLayout = QVBoxLayout() self.outlinerLayout.setContentsMargins(1, 5, 1, 1) self.outlinerTopBarLayout = QVBoxLayout() self.outlinerTopBarLayout.setContentsMargins(0, 0, 0, 0) self.treeWidget = TreeWidget() self.treeWidget.create_widget(settings['path']) self.treeWidget.itemClicked.connect(self.click_item) # comboBox asset cbox_asset_choice self.cbox_filter = ComboBox() self.cbox_filter.currentIndexChanged.connect(self.change_filter) self.cbox_filter.setFixedHeight(28) self.cbox_filter.setStyleSheet(get_css("ComboBoxAsset")) #self.cbox_asset_choice.setStyleSheet("border-left : none; border-right : none; border-top : none") self.cbox_filter.addItem(QIcon(icon_path("ICON_ACTION")), "All") for item, info in sorted(self.asset_type.items()): self.cbox_filter.addItem(QIcon(info['icon']), item.title(), info['image']) #filter_item.image_path = self.outlinerTopBarLayout.addWidget(self.cbox_filter) self.outlinerLayout.addWidget(self.treeWidget) self.leftPanelLayout.addLayout(self.outlinerTopBarLayout) self.leftPanelLayout.addLayout(self.outlinerLayout) #Tool Box self.toolBoxPanel = QFrame() self.toolBoxPanel.setStyleSheet( "border : none; background-color : rgb(100,100,100)") self.toolBoxLayout = QVBoxLayout() self.toolBoxPanel.setLayout(self.toolBoxLayout) self.leftPanelLayout.addWidget(self.toolBoxPanel) #Middle self.middle = QFrame() self.middle.setStyleSheet(get_css('2DSpace')) self.middleLayout = QVBoxLayout() self.middleLayout.setContentsMargins(0, 0, 0, 0) self.middleLayout.setSpacing(0) self.thumbnailList = ListWidget(self) self.assetLayout = QVBoxLayout() self.assetLayout.setContentsMargins(0, 0, 0, 0) self.assetLayout.addWidget(self.thumbnailList) #vSpacer = QSpacerItem(20, 10, QSizePolicy.Expanding, QSizePolicy.Expanding) #self.assetLayout.addItem(vSpacer) #self.change_view_mode() #self.thumbnailList.itemClicked.connect(self.click_thumb) #self.thumbnailList = TableWidget(self) self.middleLayout.addWidget(self.topBarArea) self.middleLayout.addLayout(self.assetLayout) self.middle.setLayout(self.middleLayout) #Right Panel self.rightPanel = QFrame() #self.rightPanel.setMaximumWidth(256) #self.rightPanel.setMinimumWidth(256) self.rightPanel.setStyleSheet(get_css('PanelRight')) self.rightLayout = QVBoxLayout() self.rightLayout.setContentsMargins(0, 0, 0, 0) self.rightLayout.setSpacing(0) self.rightPanel.setLayout(self.rightLayout) #Splitter self.splitter = QSplitter(Qt.Horizontal) self.splitter.setStyleSheet(get_css('Splitter')) #self.splitter.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) ## Dir button btn_parent_dir = PushButton(icon=icon_path('ICON_FILE_PARENT'), size=[22, 22]) #### add_asset button #btn_add_asset = PushButton(icon= icon_path('ICON_ZOOMIN'),size = [22,22]) #btn_add_asset.clicked.connect(self.add_asset) btn_refresh = PushButton(icon=icon_path('ICON_FILE_FOLDER'), size=[22, 22]) btn_refresh.clicked.connect(self.refresh) btn_refresh.setToolTip('Refresh tree') #open folder button btn_open_folder = PushButton(icon=icon_path('OPEN_FOLDER'), size=[22, 22]) btn_open_folder.clicked.connect(self.open_folder) btn_open_folder.setToolTip('Open Lib Folder') #list view spacer = QSpacerItem(5, 5, QSizePolicy.Maximum, QSizePolicy.Minimum) self.view_mode = CheckBox('List') self.view_mode.stateChanged.connect( lambda: self.click_item(self.treeWidget.currentItem())) #search bar self.search_bar = LineEdit() self.search_bar.textChanged.connect(self.filterThumbnail) #add widget to search bar self.topBarLayout.addWidget(btn_parent_dir) self.topBarLayout.addWidget(self.search_bar) self.topBarLayout.addWidget(btn_refresh) self.topBarLayout.addWidget(btn_open_folder) self.topBarLayout.addItem(spacer) self.topBarLayout.addWidget(self.view_mode) # Adding Panel to splitter self.splitter.addWidget(self.leftPanel) self.splitter.addWidget(self.middle) self.splitter.addWidget(self.rightPanel) self.splitter.setSizes([132, 512, 256]) self.splitter.setStretchFactor(0, 0) self.splitter.setStretchFactor(1, 1) self.splitter.setStretchFactor(2, 0) self.mainLayout.addWidget(self.titleBarArea) self.mainLayout.addWidget(self.splitter) #shortcut self.shortcut_zoom_in = QShortcut(QKeySequence("+"), self) self.shortcut_zoom_out = QShortcut(QKeySequence("-"), self) self.shortcut_zoom_in.activated.connect(self.zoom_in) self.shortcut_zoom_out.activated.connect(self.zoom_out) self.setLayout(self.mainLayout) self.show() def change_view_mode(self): self.click_item(self.treeWidget.currentItem) def batch(self): clear_layout(self.rightLayout) #self.addAssetPanel = Batch(self) self.rightLayout.addLayout(Batch(self)) #def batch_fill_lib(template,files,folder = None,category = None) : #self.click_item(self.treeWidget.currentItem) def change_filter(self, index): print(str(self.cbox_filter.currentText())) def change_area(self, index): #self.treeWidget.clear() print(str(self.area.currentText())) if self.title: self.title.setText(self.area.currentText()) #self.refresh() def refresh(self): area = str(self.area.currentText()) if self.treeWidget and self.area and self.cbox_filter: if self.treeWidget.search_json.isRunning: self.treeWidget.search_json.terminate() self.treeWidget.clear() #filter_items = str(self.cbox_filter.currentText()) self.treeWidget.create_widget(settings['path']) #self.treeWidget.create_tree(settings['path'],'Library','All') def open_folder(self): try: os.startfile(settings['path']) except: subprocess.Popen(['xdg-open', settings['path']]) def add_asset(self): clear_layout(self.rightLayout) self.addAssetPanel = AddAsset(self) self.rightLayout.addLayout(self.addAssetPanel) def zoom_in(self): new_size = self.thumbnailList.iconSize().width() if not new_size > 512: new_size *= 1.25 self.thumbnailList.setIconSize(QSize(new_size, new_size)) #self.thumbnailList.setStyleSheet("QListView::item {height: %s;}"%(new_size+6)) def zoom_out(self): new_size = self.thumbnailList.iconSize().width() if not new_size < 16: new_size *= 0.75 self.thumbnailList.setIconSize(QSize(new_size, new_size)) #self.thumbnailList.setStyleSheet("QListView::item {height: %s;}"%(new_size+6)) # When selected of folder in the outliner def click_item(self, item): #for row in range(self.thumbnailList.rowCount()) : #clear_layout(self.assetLayout) #self.thumbnailList.clear() #a= TreeWidget(item.text(1)) #self.thumbnailList.clear() #self.middle.addWidget(ThumbnailPanel.createWidget(item.text(1))) if hasattr(self, 'view_mode') and self.view_mode.isChecked(): self.thumbnailList = TableWidget(self) #self.thumbnailList.horizontalHeader().setSortIndicator(1,Qt.AscendingOrder) #self.thumbnailList.cellClicked.connect(self.click_thumb) #self.thumbnailList.setRowCount(0) else: if hasattr(self.thumbnailList, "search_asset" ) and self.thumbnailList.search_asset.isRunning: self.thumbnailList.search_asset.terminate() self.thumbnailList.clear() self.thumbnailList.search_images(item.full_path) #self.thumbnailList.itemClicked.connect(self.click_thumb) #self.thumbnailList.clear() #print(item.full_path) #self.asset_list.sort(key = lambda x : x['']) #self.assetLayout.addWidget(self.thumbnailList) if self.area.currentText() == 'Library': subFolder = [] # When taping in the search bar def filterThumbnail(self): if self.thumbnailList: items = (self.thumbnailList.item(i) for i in range(self.thumbnailList.count())) search = self.search_bar.text() for index, item in enumerate(items): info = item.info tags = [ t for t in info['tags'].split(',') if len(info['tags']) ] name = info['asset'] item_visibility = filtering_keyword(name, search, tags) if self.view_mode.isChecked(): self.thumbnailList.setRowHidden(index, item_visibility) else: self.thumbnailList.item(index).setHidden(item_visibility) def closeEvent(self, event): if self.treeWidget.search_json.isRunning: self.treeWidget.search_json.terminate() if hasattr( self.thumbnailList, "search_asset") and self.thumbnailList.search_asset.isRunning: self.thumbnailList.search_asset.terminate() self.widget_close = True self.deleteLater()
class _UIElement(QObject): """ Универсальный класс элемента интерфейса. Создан, потому что изначальные классы PyQt требуют значительной доработки и к тому же недостаточно интуитивны, легко запутаться в Qt-овском нагромождении из виджетов, лэйаутов, item объектов, прочей шелухи. Плюсы этого класса: позволяет отображать подпись над элементом, удобно включать/выключать функциональность, сразу ставит виджет в центр (а не в край, чтоб потом его ещё ровнять) убирает ненужные отступы между элементами все последующие элементы наследуются от него """ def __init__(self, widget: QWidget = None, layout: QLayout = None, description: str = None, disable: bool = False, stroked: bool = False): """ :param widget: класс Qt Widget, который будет отображаться как элемент интерфейса :param layout: класс слоя, который будет основанием, на котором будет лежать виджет :param description: описание или название, котороые при наличии будет отображаться над виджетом :param disable: опция отключения виджета при создании. По умолчанию False, т.е. виджет включён """ super().__init__() self._inner_widget = widget self._layout = QVBoxLayout() if layout is None else layout self._layout.setContentsMargins(2, 2, 2, 2) if description is not None or layout is not None: self._out_widget = QFrame() if stroked: self._out_widget.setFrameStyle(QFrame.Plain) if description is not None: self._layout.addWidget(QLabel(description), alignment=Qt.AlignCenter) if widget is not None: self._layout.addWidget(widget) self._out_widget.setLayout(self._layout) elif widget is not None: self._out_widget = widget widget.setDisabled(disable) def toggle_element(self, state=None): if self._inner_widget is not None: self._inner_widget.setDisabled(self._inner_widget.isEnabled() if state is None else not state) def set_max_width(self, width): self._out_widget.setMaximumWidth(width) def set_max_height(self, height): self._out_widget.setMaximumHeight(height) def set_fixed_width(self, width): self._out_widget.setFixedWidth(width) def set_fixed_height(self, height): self._out_widget.setFixedHeight(height) def set_min_width(self, width): self._out_widget.setMinimumWidth(width) def set_min_height(self, height): self._out_widget.setMinimumHeight(height) def __layout__(self) -> QLayout: return self._out_widget.layout() def __widget__(self) -> QWidget: return self._out_widget
class Ui_Form(object): def setupUi(self, Form): self.form = Form Form.setObjectName("Form") Form.resize(1000, 800) self.widget = QtWidgets.QWidget(Form) self.widget.setGeometry(QtCore.QRect(10, 10, 991, 30)) self.widget.setObjectName("widget") self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget) self.horizontalLayout.setContentsMargins(2, 0, 5, 0) self.horizontalLayout.setSpacing(2) self.horizontalLayout.setObjectName("horizontalLayout") self.label01 = QtWidgets.QLabel(self.widget) self.label01.setObjectName("label01") self.horizontalLayout.addWidget(self.label01) self.input_nodenums = QtWidgets.QLineEdit(self.widget) self.input_nodenums.setObjectName("input_nodenums") self.horizontalLayout.addWidget(self.input_nodenums) self.label02 = QtWidgets.QLabel(self.widget) self.label02.setObjectName("label02") self.horizontalLayout.addWidget(self.label02) self.input_filename = QtWidgets.QLineEdit(self.widget) self.input_filename.setObjectName("input_filename") self.horizontalLayout.addWidget(self.input_filename) self.label03 = QtWidgets.QLabel(self.widget) self.label03.setObjectName("label03") self.horizontalLayout.addWidget(self.label03) self.input_sheetname = QtWidgets.QLineEdit(self.widget) self.input_sheetname.setObjectName("input_sheetname") self.horizontalLayout.addWidget(self.input_sheetname) self.addnode_btn = QtWidgets.QPushButton(self.widget) self.addnode_btn.setObjectName("addnode_btn") self.horizontalLayout.addWidget(self.addnode_btn) self.start_btn = QtWidgets.QPushButton(self.widget) self.start_btn.setObjectName("start_btn") self.horizontalLayout.addWidget(self.start_btn) self.layout = QVBoxLayout(self.widget) self.frame = QFrame(self.form) self.frame.setMinimumHeight(400) self.frame.setMaximumWidth(800) self.frame.setMaximumWidth(1000) self.frame.setMaximumHeight(2000) self.frame.show() self.node_num = 0 self.addnode_btn.clicked.connect(self.add_node) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "自动画流程图工具")) self.label01.setText(_translate("Form", "节点个数:")) self.label02.setText(_translate("Form", "visio文件名:")) self.label03.setText(_translate("Form", "sheetname:")) self.addnode_btn.setText(_translate("Form", "添加节点")) self.start_btn.setText(_translate("Form", "开始画图")) def add_node(self): bt = NodeWidget( self.node_num,self.frame) bt.move(0,80+30*self.node_num) print("add node ",self.node_num ) self.node_num += 1
def getHLine(): devideLine = QFrame() devideLine.setFrameShape(QFrame.HLine) devideLine.setMaximumHeight(1) return devideLine
class MainWindow(QMainWindow): """ 主窗口界面 """ def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) # 初始化 self.init() # ui设计 self.setup_ui() # 创建右键菜单 self.create_context_menu() # 主框体设计 self.set_main_form() # 加载qss样式 self.load_qss() def init(self): self.setGeometry(Const.WIN_X, Const.WIN_Y, Const.WIN_WIDTH, Const.WIN_HEIGHT) self.setObjectName('mainWindow') self.setWindowIcon(QIcon("./image/Logo/logo.png")) self.setWindowTitle('IFR智能公式识别系统') # 加载图片缩放公共类 self.imageScale = ImageScale() def setup_ui(self): """ 创建状态栏、菜单栏、工具栏 """ # 状态栏 self.statusBar = QStatusBar() self.setStatusBar(self.statusBar) self.statusBar.showMessage('准备就绪', 5000) # self.statusBar().setStyleSheet('background-color:lightGray;') # 菜单栏 self.menubar = QMenuBar() self.setMenuBar(self.menubar) # self.menuBar().setStyleSheet('background-color:lightGray;') # 文件 self.fileMenu = self.menubar.addMenu('&文件(F)') # 调用自定义action self.openPimax = Action.action_b_2(self, 'openPimax', '&打开图片文件', 'Ctrl+P', '打开图片文件') self.openPimax.setIcon(QIcon('./image/openQpixmap.jpg')) self.openText = Action.action_b_2(self, 'openText', '&打开文本文件', 'Ctrl+T', '打开文本文件') self.openText.setIcon(QIcon('./image/openText.ico')) self.openFile = Action.action_b_3(self, 'openFile', '打开文件', '打开文件', self.fileMenu) self.openFile.addAction(self.openPimax) self.openFile.addAction(self.openText) self.openPimax.triggered.connect(lambda: self.get_image()) self.openText.triggered.connect(lambda: self.get_text()) self.openRecentFile = Action.action_a_2(self, 'openRecentFile', '&最近打开的文件', 'Ctrl+O', '最近打开的文件', self.fileMenu) # self.openRecentFile.triggered.connect(self.) self.save = Action.action_a_2(self, 'save', '&保存分析结果', 'Ctrl+S', '保存数据分析结果', self.fileMenu) # self.save.triggered.connect(self.) self.saveAs = Action.action_a_2(self, 'saveAs', '&另保存分析结果', 'Ctrl+Shift+S', '另保存数据分析结果', self.fileMenu) # self.saveAs.triggered.connect(self.) self.printf = Action.action_a_2(self, 'printef', '&打印分析结果', 'Ctrl+P', '打印数据分析结果', self.fileMenu) # self.printf.triggered.connect(self.) self.exitAction = Action.action_a_1(self, 'exitAction', './image/mainWindowIcon/toolBarIcon/exit.png', '&退出', 'Ctrl+Q', '退出应用程序', self.fileMenu) self.exitAction.triggered.connect(self.close) # 编辑 self.exitMenu = self.menubar.addMenu('&编辑(E)') # # ####################查找与替换####################开始 self.search = Action.action_b_2(self, 'search', '&快速查找', 'Ctrl+F', '快速查找') self.replace = Action.action_b_2(self, 'replace', '&快速替换', 'Ctrl+H', '快速替换') # 新增二级菜单 self.searchAndReplaceMenu = Action.action_b_3(self, 'searchAndReplaceMenu', '查找与替换', '查找与替换', self.exitMenu) self.searchAndReplaceMenu.addAction(self.search) self.searchAndReplaceMenu.addAction(self.replace) # self.search.triggered.connect(self.) # self.replace.triggered.connect(self.) # ####################查找与替换####################结束 self.cut = Action.action_a_2(self, 'cut', '&剪切', 'Ctrl+X', '剪切', self.exitMenu) # self.cut.triggered.connect(self.) self.copy = Action.action_a_2(self, 'copy', '&复制', 'Ctrl+C', '复制', self.exitMenu) # self.copy.triggered.connect(self.) self.paste = Action.action_a_2(self, 'paste', '&粘贴', 'Ctrl+V', '粘贴', self.exitMenu) # self.paste.triggered.connect(self.) self.delete = Action.action_a_2(self, 'delect', '&删除', 'Del', '删除', self.exitMenu) # self.delect.triggered.connect(self.) self.selectAll = Action.action_a_2(self, 'selectAll', '&全选', 'Ctrl+Alt', '全选', self.exitMenu) # self.selectAll.triggered.connect(self.) # 视图 self.viewMenu = self.menubar.addMenu('&视图(V)') self.notice = Action.action_a_2(self, 'notice', '&通知', 'Ctrl+Alt+X', '信息通知提醒', self.viewMenu) # self.notice.triggered.connect(self.) # ####################窗口管理####################开始 self.window = Action.action_b_3(self, 'window', '&窗口', '展示一些基本窗口', self.viewMenu) # ####################窗口管理####################结束 # # # # ####################工具栏####################开始 self.tool = Action.action_b_3(self, 'tool', '&工具栏', '基本工具', self.viewMenu) self.calculator = Action.action_a_1(self, 'calculator', './image/calculator.jpg', '&计算器', 'C', '计算器', self.viewMenu) self.calculator.triggered.connect(lambda: self.calculator_win()) # ####################工具####################结束 self.fullScreen = Action.action_a_2(self, 'fullScreen', '&全屏幕', 'Shift+Alt+Enter', '全屏', self.viewMenu) # self.fullScreen.triggered.connect(self.) self.propertyWindow = Action.action_a_2(self, 'propertyWindow', '&属性窗口', 'F4', '属性窗口', self.viewMenu) # self.propertyWindow.triggered.connect(self.) # # 分析 self.navigateMenu = self.menubar.addMenu('&分析(N)') # # 工具 self.toolMenu = self.menubar.addMenu('&工具(T)') # # 扩展 self.extendMenu = self.menubar.addMenu('&扩展(X)') # # 窗口 self.windowMenu = self.menubar.addMenu('&窗口(W)') # # 帮助 self.helpMenu = self.menubar.addMenu('&帮助(H)') self.help = Action.action_a_2(self, 'help ', '&查看帮助', 'Ctrl+F1', '查看帮助', self.helpMenu) # self.help.triggered.connect(self.) # ####################菜单####################结束 ################################################################################################################ # ####################工具栏####################开始 # 工具 self.pixmapToolbar = self.addToolBar('打开图形文件') self.textToolbar = self.addToolBar('打开文本文件') self.pixmapToolbar.addAction(self.openPimax) self.textToolbar.addAction(self.openText) self.exitToolbar = self.addToolBar('退出') self.exitToolbar.addAction(self.exitAction) self.calculatorTooolbar = self.addToolBar('计算器') self.calculatorTooolbar.addAction(self.calculator) # ####################工具栏####################结束 # 槽函数线程 # 创建右键菜单 def create_context_menu(self): """ 创建右键菜单 :return: """ self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.show_context_menu) # 创建QMenu self.contextMenu = QMenu(self) # ####################工具栏管理####################开始 self.toolBarManagementMenu = Action.action_b_4(self, 'toolBarManagementMenu', '&工具栏管理', self.contextMenu) # 未完成 # ####################工具栏管理####################结束 self.minAtion = Action.action_a_1(self, 'minAction', './image/min.png', '&最小化', 'Ctrl+M', '最小化窗口', self.contextMenu) self.contextMenu.addSeparator() # 添加分隔线 self.cutAction = Action.action_a_2(self, 'cutAction', '&剪切', 'Ctrl+X', '剪切', self.contextMenu) self.copyAction = Action.action_a_2(self, 'copyAction', '&复制', 'Ctrl+C', '复制', self.contextMenu) self.pasteAction = Action.action_a_2(self, 'pasteAction', '&粘贴', 'Ctrl+V', '粘贴', self.contextMenu) self.deleteAction = Action.action_a_2(self, 'delectAction', '&删除', 'Del', '删除', self.contextMenu) self.selectAllAction = Action.action_a_2(self, 'selectAllAction', '&全选', 'Ctrl+Alt', '全选', self.contextMenu) self.contextMenu.addSeparator() # 添加分隔线 self.closeAction = Action.action_a_1(self, 'closeAction', './image/Exit.png', '&退出', 'Ctrl+W', '退出', self.contextMenu) self.minAtion.triggered.connect(self.show_mininized_window) self.closeAction.triggered.connect(self.quit_window) # self.selectAllAction.triggered.connect(self.) # self.cutAction.triggered.connect(self.) # self.copyAction.triggered.connect(self.) # self.pasteAction.triggered.connect(self.) # self.delectAction.triggered.connect(self.) # ****************************** 业务逻辑 ********************************* def load_qss(self): """ 加载Qss样式表 :return: """ style_file = './Window/mainWindow/Qss/mainWindow.qss' qss_style = CommonhelperQss.read_qss(style_file) self.setStyleSheet(qss_style) def set_action_connect(self): """ 菜单栏、工具栏槽函数连接 :return: """ pass def calculator_win(self): """ 加载计算器窗口 :return: """ self.calculator_Win = Calculatormainwindow() self.calculator_Win.show() def set_main_form(self): """ 窗体布局以及主框体设计 :return: """ # 主框体 self.mainSpiltter = QSplitter(Qt.Vertical) self.mainSpiltter.setObjectName('mainSpiltter') self.mainSpiltterLayout = QVBoxLayout() # 设置主窗口中心窗体 self.setCentralWidget(self.mainSpiltter) # *******工作区间******* self.workWidget = QSplitter() self.workWidget.setObjectName('workWidget') self.mainSpiltter.addWidget(self.workWidget) self.workWidgetLayout = QHBoxLayout() self.workWidget.setLayout(self.workWidgetLayout) self.leftWidget = QFrame() self.leftWidget.setObjectName('leftWidget') self.leftWidget.setFrameShape(QFrame.StyledPanel) self.leftWidget.setMaximumWidth(230) self.leftWidgetLayout = QVBoxLayout() self.leftWidgetLayout.setContentsMargins(0, 0, 0, 0) self.leftWidget.setLayout(self.leftWidgetLayout) # self.hideBtn = QLabel() # self.hideBtn.setObjectName('hideBtn') # self.hideBtn.setPixmap(QPixmap('./image/mainWindowIcon/showAndHideIcon/hide0.ico')) # # self.showBtn = QLabel() # self.showBtn.setObjectName('showBtn') # self.showBtn.setPixmap(QPixmap('./image/mainWindowIcon/showAndHideIcon/show0.ico')) # 存放按钮 self.widget = QWidget() self.widget.setObjectName('widget') self.leftWidgetLayout.addWidget(self.widget) pixmap = self.imageScale.pixmap_scale('./image/Logo/logo0.png', 204, 80) self.logoIamgeLabel = QLabel(self.widget) self.logoIamgeLabel.setObjectName('logoImageLabel') self.logoIamgeLabel.setPixmap(pixmap) self.widgetLayout = QGridLayout() self.widget.setLayout(self.widgetLayout) self.widgetLayout.addWidget(self.logoIamgeLabel, 0, 1) # 多界面 # QListWidget + QStackedWidget实现 self.leftListWidget = QListWidget() # 左侧选项列表 self.leftListWidget.setObjectName('leftListWidget') self.rightWidget = QStackedWidget() # 右侧框体 self.rightWidget.setObjectName('rightWidget') self.leftWidgetLayout.addWidget(self.leftListWidget) self.workWidgetLayout.addWidget(self.leftWidget) self.workWidgetLayout.addWidget(self.rightWidget) # ********左侧选项列表布局以及设置****************************** # 设置左侧选项列表大小 self.leftListWidget.setMinimumWidth(Const.LEFTWIDGET_WIDTH) # 左侧选项列表与右侧框体的index对应绑定 self.leftListWidget.currentRowChanged.connect(self.rightWidget.setCurrentIndex) # 去掉边框 self.leftListWidget.setFrameShape(QListWidget.NoFrame) # 隐藏滚动条 self.leftListWidget.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.leftListWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) list_str = ['智能识别', '公式生成器', '学习资源区', '设置', '关于'] # 左侧选项添加 for i in range(5): self.item = QListWidgetItem(list_str[i], self.leftListWidget) self.item.setSizeHint(QSize(Const.ITEM_WIDTH, Const.ITEM_HEIGHT)) # 居中显示 self.item.setTextAlignment(Qt.AlignCenter) # 设置默认选中item[1] self.leftListWidget.setCurrentRow(0) # ********右侧主框体布局以及设置********************************** self.rightForm1 = RightForm1() self.rightForm2 = RightForm2() self.rightForm3 = RightForm3() self.rightForm4 = RightForm4() self.rightForm5 = RightForm5() self.rightWidget.addWidget(self.rightForm1) self.rightWidget.addWidget(self.rightForm2) self.rightWidget.addWidget(self.rightForm3) self.rightWidget.addWidget(self.rightForm4) self.rightWidget.addWidget(self.rightForm5) # ############################################################# # 消息通知框 self.messageInform = MesageFrame() self.messageInform.setObjectName('messageInform') # 消息通知框默认隐藏 self.messageInform.hide() self.mainSpiltter.addWidget(self.messageInform) # *****侧边栏***** # 右侧边栏 self.rightBar = QFrame() self.rightBar.setObjectName('rightBar') self.rightBar.setFixedWidth(35) self.rightBar.setFrameShape(QFrame.StyledPanel) self.rightBarLayout = QVBoxLayout() self.rightBar.setLayout(self.rightBarLayout) self.workWidgetLayout.addWidget(self.rightBar) # 右侧边栏控件 # 右侧边栏添加控件 # 下侧边栏 self.bottomBar = QFrame() self.bottomBar.setObjectName('bottomBar') self.bottomBar.setMaximumHeight(35) self.bottomBar.setFrameShape(QFrame.StyledPanel) self.bottomBarLayout = QHBoxLayout() self.bottomBarLayout.setAlignment(Qt.AlignRight) # 右对齐 self.bottomBar.setLayout(self.bottomBarLayout) self.mainSpiltter.addWidget(self.bottomBar) # 下侧边栏控件 # 留白控件 blank = QLabel(self.bottomBar) blank.setObjectName('blank') self.informText = QLabel(self.bottomBar) self.informText.setObjectName('informText') self.informText.setText('通知') self.informBtn = QPushButton(self.bottomBar) self.informBtn.setObjectName('informBtn') self.informBtn.resize(QSize(35, 35)) self.informBtn.setIcon(QIcon('./image/mainWindowIcon/messageBarBtnIcon/inform0.png')) self.informBtn.clicked.connect(lambda: self.open_inform_frame()) # 下侧边栏添加控件 self.bottomBarLayout.addWidget(self.informBtn) self.bottomBarLayout.addWidget(self.informText) self.bottomBarLayout.addWidget(blank) # ****************************业务逻辑****************************** # 右键菜单 def show_context_menu(self): """ 右键点击时调用的函数 :return: """ # 显示菜单前,将它移动到鼠标点击的位置 self.contextMenu.exec_(QCursor.pos()) # 最小化窗口 def show_mininized_window(self): """ :return: """ self.showMinimized() # 最大化窗口 def show_maximized_window(self): """ :return: """ self.showMaximized() # 复原窗口 def show_restore_window(self): """ :return: """ if self.isMaximized(): self.showNormal() else: self.showMaximized() # 关闭窗口 def quit_window(self): """ :return: """ self.close() # 打开文件 def get_image(self): """ getOpenFileName():返回用户所选择文件的名称,并打开该文件 第一个参数用于指定父组件 第二个参数指定对话框标题 第三个参数指定目录 第四个参数是文件扩展名过滤器 """ pass # fname, _ = QFileDialog.getOpenFileName(self, '选择图形文件', 'C:\\', "*.jpg *.gif *.png") # self.pixmapLabel.setPixmap(QPixmap(fname)) def get_text(self): """ :return: """ pass # # 初始化实例,并设置一些参数 # # textDialog = QFileDialog() # # textDialog.setFileMode(QFileDialog.AnyFile) # # textDialog.setFilter(QDir.Files) # textDialog = QFileDialog.getOpenFileName(self, '选择文本文件', 'C:\\', "*.txt *.doc *.docx") # # 当选择器关闭的时候 # if textDialog.exec_(): # # 拿到所选择的文本 # filenames = textDialog.selectedFiles() # # 读取文本内容设置到textEdit中 # f = open(filenames[0], 'r') # with f: # data = f.read() # self.textEdit.setText(data) def open_inform_frame(self): self.messageInform.show()
def __init__(self, parent, title="Title", width=500, height=180): self.parent = parent self.dragPosition = None self.width = width self.height = height super().__init__(parent) self.setWindowFlags(Qt.FramelessWindowHint) self.setAttribute(Qt.WA_TranslucentBackground) self.gap = 10 self.center(self.width + self.gap, self.height + self.gap) self.setAcceptDrops(True) layout = QVBoxLayout() layout.setSpacing(0) layout.setAlignment(Qt.AlignTop) layout.setContentsMargins(0, 0, 0, 0) # Title title = QLabel(title) title.setObjectName('title') def trigger_close(_): self.close() close_btn = Builder().text('x').name('close_btn').click( trigger_close).build() header = QHBoxLayout() header.addWidget(title) header.addStretch(1) header.addWidget(close_btn) self.close_btn = close_btn dlgHeader = QFrame() dlgHeader.setObjectName('header') dlgHeader.setMaximumWidth(width) dlgHeader.setLayout(header) layout.addWidget(dlgHeader) widget = QWidget(self) self.main = self.ui(widget) widget.setObjectName('main') widget.setLayout(self.main) widget.setMaximumWidth(width) layout.addWidget(widget) _main = QWidget() _main.setContentsMargins(0, 0, 0, 10) _main.setLayout(layout) _main.setStyleSheet(self.style()) _main.setWindowOpacity(0.5) _main_layout = QStackedLayout() _main_layout.setContentsMargins(20, 20, 20, 20) _main_layout.setAlignment(Qt.AlignCenter) _main_layout.setStackingMode(QStackedLayout.StackAll) _backgound = QFrame() _backgound.setMinimumWidth(width) _backgound.setMinimumHeight(height) _backgound.setMaximumWidth(width) _backgound.setMaximumHeight(height) _backgound.setStyleSheet("background: #fafafa; border-radius:5px;") if not app.is_windows(): _main_layout.addWidget(_backgound) _main_layout.addWidget(_main) self.setLayout(_main_layout) self.effect = QGraphicsDropShadowEffect(_backgound) self.effect.setOffset(0, 0) self.effect.setBlurRadius(30) # self.effect.setEnabled(False) _backgound.setGraphicsEffect(self.effect)
def prepare_gui(self): self.setWindowTitle('inzynierka') self.setBaseSize(1200, 800) left_panel = QVBoxLayout() left_panel.setAlignment(Qt.AlignTop) left_part = QVBoxLayout() left_part.addWidget(self.algorithmLabel) checkboxes = QVBoxLayout() checkboxes.addWidget(self.simpleCNN) checkboxes.addWidget(self.knn) checkboxes.addWidget(self.customCNN) left_part.addLayout(checkboxes) left_part.addWidget(self.parameterLabel) left_part.addWidget(self.parameter) left_part.addWidget(self.errorLabel) cnnParameters = QGridLayout() cnnParameters.addWidget(self.optimizerLabel, 0, 0) cnnParameters.addWidget(self.optimizer, 0, 1) cnnParametersFrame = QFrame() cnnParametersFrame.setLayout(cnnParameters) left_part.addWidget(cnnParametersFrame) left_panel.addLayout(left_part) right_panel = QGridLayout() label1 = QLabel('Graphs for your algoritm') right_panel.addWidget(label1, 0, 0) right_panel.addWidget(self.graphs, 1, 0) self.graphs.setTabEnabled(1, False) self.graphs.setTabEnabled(2, False) top_layout = QHBoxLayout() top_layout.addLayout(left_panel) top_layout.addLayout(right_panel) topFrame = QFrame() topFrame.setLayout(top_layout) topFrame.setMinimumHeight(600) bottom_layout = QHBoxLayout() buttons = QVBoxLayout() buttons.addWidget(self.createButton) buttons.addWidget(self.trainButton) buttons.addWidget(self.evaluateButton) buttons.addWidget(self.loadModelButton) buttons.addWidget(self.saveModelButton) bottom_layout.addLayout(buttons) bottom_layout.addWidget(self.consolePrint) bottomFrame = QFrame() bottomFrame.setLayout(bottom_layout) bottomFrame.setMaximumHeight(300) main_layout = QGridLayout() main_layout.addWidget(topFrame, 0, 0) main_layout.addWidget(bottomFrame, 1, 0) main_widget = QWidget() main_widget.setLayout(main_layout) self.setCentralWidget(main_widget)
class HeaderFrame(QFrame): """ Clickable frame with title. """ class AbstractHeaderFrameItem(QFrame): def __init__(self, parent): super(__class__, self).__init__(parent) self.setContentsMargins(0, 0, 0, 0) self.setLayout(QHBoxLayout()) self.layout().setContentsMargins(0, 0, 0, 0) self.layout().setSpacing(0) def clearLayout(self): while self.layout().count(): child = self.layout().takeAt(0) if child.widget(): child.widget().deleteLater() def setCentralWidget(self, widget: QWidget): self.clearLayout() self.layout().addWidget(widget) def refresh(self): pass class VSepItem(AbstractHeaderFrameItem): def __init__(self, parent): super(__class__, self).__init__(parent) self.setCentralWidget(VSep(self)) class HSpacerItem(AbstractHeaderFrameItem): def __init__(self, parent): super(__class__, self).__init__(parent) self.setCentralWidget(HSpacer(self)) arrowClicked = pyqtSignal() upButtonClicked = pyqtSignal() downButtonClicked = pyqtSignal() configButtonClicked = pyqtSignal() closeButtonClicked = pyqtSignal() def __init__(self, parent: 'ui.widget.CollapsibleFrame'): super(__class__, self).__init__(parent) self._parent = parent self.setMinimumHeight(26) self.setMaximumHeight(26) self.indicateError(False) self._hlayout = QHBoxLayout() self._hlayout.setContentsMargins(0, 0, 0, 0) self._hlayout.setSpacing(0) self._arrow = None self._hlayout.addWidget(self._init_header_frame(parent.isCollapsed())) self.setLayout(self._hlayout) def _init_header_frame(self, collapsed: bool): self._frm_header = QFrame(self) self._frm_header.setMinimumHeight(24) self._frm_header.setMaximumHeight(24) frm_header_layout = QHBoxLayout(self) frm_header_layout.setContentsMargins(0, 0, 0, 0) frm_header_layout.addWidget(self._init_arrow(collapsed)) background_color = self._frm_header.palette().color(self._frm_header.backgroundRole()) self._frm_header.setStyleSheet("QFrame { border:0px; background:" + background_color.darker(96).name() + "; }") self._frm_header.setLayout(frm_header_layout) return self._frm_header def _init_arrow(self, collapsed): self._arrow = CollapsibleFrame.Arrow(self, collapsed=collapsed) self._arrow.setMinimumWidth(24) self._arrow.setMaximumWidth(24) self._arrow.setStyleSheet("border:0px") return self._arrow def addWidget(self, header_item: AbstractHeaderFrameItem): self._frm_header.layout().addWidget(header_item) def refresh(self): """ Refreshes the header model (e.g. line-count, character-count, etc.). """ for i in range(self._frm_header.layout().count()): widget = self._frm_header.layout().itemAt(i).widget() if isinstance(widget, CollapsibleFrame.HeaderFrame.AbstractHeaderFrameItem): widget.refresh() def indicateError(self, status: bool): """ Indicates an error by painting the title-border red. Otherweise black. """ if status: self.setStyleSheet("QFrame { border:1px solid red; }") else: self.setStyleSheet("QFrame { border:1px solid rgb(41, 41, 41); }") def mouseReleaseEvent(self, event): if self.underMouse() and event.button() == QtCore.Qt.LeftButton: # The arrow (or something non-button like) was clicked self.arrowClicked.emit() return super(CollapsibleFrame.HeaderFrame, self).mousePressEvent(event)
def add_menu(self): layout = QVBoxLayout() frame = QFrame() license_plate_label = QLabel("License Plate: ") license_plate_label.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px" ) brand_name_label = QLabel("Brand: ") brand_name_label.setStyleSheet( "color:#fff;margin-top:32px;padding:8px 0px;font-size:20px" ) fuel_type_label = QLabel("Fuel: ") fuel_type_label.setStyleSheet( "color:#fff;margin-top:32px;padding:8px 0px;font-size:20px" ) license_plate_input = QLineEdit() license_plate_input.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px" ) brand_name_input = QLineEdit() brand_name_input.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px" ) fuel_type_input = QComboBox() fuel_type_input.setStyleSheet( "color:#fff;padding:8px 0px;font-size:20px;border:1px solid white" ) fuel_type_input.addItem("Gasoline") fuel_type_input.addItem("Diesel") fuel_type_input.addItem("Hydrogen") fuel_type_input.addItem("Electric") button = QPushButton("Check-in") button.setStyleSheet( "color:#fff;margin-top:32px;padding:8px 0px;font-size:20px;background:blue;border:1px solid white" ) layout.addWidget(license_plate_label) layout.addWidget(license_plate_input) layout.addWidget(brand_name_label) layout.addWidget(brand_name_input) layout.addWidget(fuel_type_label) layout.addWidget(fuel_type_input) layout.addWidget(button) layout.setContentsMargins(0, 0, 0, 0) frame.setMinimumHeight(self.height()) frame.setMinimumWidth(self.width()) frame.setMaximumHeight(self.width()) frame.setMaximumWidth(self.width()) layout.addStretch() frame.setLayout(layout) button.clicked.connect( lambda: self.add_car_db( license_plate_input.text(), brand_name_input.text(), fuel_type_input.currentText(), ) ) self.vertical_2.addWidget(frame)