def _init_ui(self): self.setWindowModality(Qt.ApplicationModal) meta_card_lay = QHBoxLayout() meta_card_lay.setSpacing(20) for setting in [ { 'title': u'ZEUS', 'cover': MPixmap( r'C:\Users\huangPeiXin\Documents\houdini17.5\python2.7libs\Zeus_Lin\res\ZeusDesign\zeus.png' ) }, { 'title': u'IDO', 'cover': MPixmap( r'C:\Users\huangPeiXin\Documents\houdini17.5\python2.7libs\Zeus_Lin\res\ZeusDesign\ido.png' ) }, ]: meta_card = MMeta() meta_card.setup_data(setting) meta_card_lay.addWidget(meta_card) left_lay = QVBoxLayout() left_lay.addWidget(MDivider('About Zeus')) left_lay.addLayout(meta_card_lay) left_lay.addWidget(MDivider('')) left_lay.setSpacing(20) label_1 = MLabel(u"Zues是由一灯工作室开发的一个软件") label_1.setAlignment(Qt.AlignHCenter) label_2 = MLabel(u"用于管理CG开发的相关资源") label_2.setAlignment(Qt.AlignHCenter) left_lay.addWidget(label_1) left_lay.addWidget(label_2) btn = MPushButton(u"确定") btn.clicked.connect(self.close) left_lay.addWidget(btn) left_lay.addStretch() self.setLayout(left_lay) dayu_theme.background_color = "#262626" dayu_theme.apply(self)
def _init_ui(self): main_lay = QVBoxLayout() self.setLayout(main_lay) main_lay.addWidget(MDivider('circle')) lay1 = QHBoxLayout() circle_1 = MProgressCircle(parent=self) circle_1.setFormat(u'%p Days') circle_1.setValue(80) circle_2 = MProgressCircle(parent=self) circle_2.set_dayu_color(dayu_theme.success_color) circle_2.setValue(100) circle_3 = MProgressCircle(parent=self) circle_3.set_dayu_color(dayu_theme.error_color) circle_3.setValue(40) dashboard_1 = MProgressCircle.dashboard(parent=self) dashboard_1.setFormat(u'%p Days') dashboard_1.setValue(80) dashboard_2 = MProgressCircle.dashboard(parent=self) dashboard_2.set_dayu_color(dayu_theme.success_color) dashboard_2.setValue(100) dashboard_3 = MProgressCircle.dashboard(parent=self) dashboard_3.set_dayu_color(dayu_theme.error_color) dashboard_3.setValue(40) lay1.addWidget(circle_1) lay1.addWidget(circle_2) lay1.addWidget(circle_3) dashboard_lay = QHBoxLayout() dashboard_lay.addWidget(dashboard_1) dashboard_lay.addWidget(dashboard_2) dashboard_lay.addWidget(dashboard_3) main_lay.addLayout(lay1) main_lay.addWidget(MDivider('dashboard')) main_lay.addLayout(dashboard_lay) main_lay.addWidget(MDivider('different radius')) circle_4 = MProgressCircle(parent=self) circle_4.set_dayu_width(100) circle_4.setValue(40) circle_5 = MProgressCircle(parent=self) circle_5.setValue(40) circle_6 = MProgressCircle(parent=self) circle_6.set_dayu_width(160) circle_6.setValue(40) lay2 = QHBoxLayout() lay2.addWidget(circle_4) lay2.addWidget(circle_5) lay2.addWidget(circle_6) main_lay.addLayout(lay2) main_lay.addWidget(MDivider('data bind')) self.register_field('percent', 0) self.register_field('color', self.get_color) self.register_field('format', self.get_format) circle = MProgressCircle(parent=self) self.bind('percent', circle, 'value') self.bind('color', circle, 'dayu_color') self.bind('format', circle, 'format') lay3 = QHBoxLayout() button_grp = MPushButtonGroup() button_grp.set_dayu_type(MPushButton.DefaultType) button_grp.set_button_list([ {'text': '+', 'clicked': functools.partial(self.slot_change_percent, 10)}, {'text': '-', 'clicked': functools.partial(self.slot_change_percent, -10)}, ]) lay3.addWidget(circle) lay3.addWidget(button_grp) lay3.addStretch() main_lay.addLayout(lay3) custom_widget = QWidget() custom_layout = QVBoxLayout() custom_layout.setContentsMargins(20, 20, 20, 20) custom_layout.addStretch() custom_widget.setLayout(custom_layout) lab1 = MLabel(text='42,001,776').h3() lab2 = MLabel(text=u'消费人群规模').secondary() lab3 = MLabel(text=u'总占人数 75%').secondary() lab1.setAlignment(Qt.AlignCenter) lab2.setAlignment(Qt.AlignCenter) lab3.setAlignment(Qt.AlignCenter) custom_layout.addWidget(lab1) custom_layout.addWidget(lab2) custom_layout.addWidget(MDivider()) custom_layout.addWidget(lab3) custom_layout.addStretch() custom_circle = MProgressCircle() custom_circle.set_dayu_width(180) custom_circle.setValue(75) custom_circle.set_widget(custom_widget) main_lay.addWidget(MDivider('custom circle')) main_lay.addWidget(custom_circle) main_lay.addStretch()
class MProgressCircle(QProgressBar): """ MProgressCircle: Display the current progress of an operation flow. When you need to display the completion percentage of an operation. Property: dayu_width: int dayu_color: str """ def __init__(self, dashboard=False, parent=None): super(MProgressCircle, self).__init__(parent) self._main_lay = QHBoxLayout() self._default_label = MLabel().h3() self._default_label.setAlignment(Qt.AlignCenter) self._main_lay.addWidget(self._default_label) self.setLayout(self._main_lay) self._color = None self._width = None self._start_angle = 90 * 16 self._max_delta_angle = 360 * 16 self._height_factor = 1.0 self._width_factor = 1.0 if dashboard: self._start_angle = 225 * 16 self._max_delta_angle = 270 * 16 self._height_factor = (2 + pow(2, 0.5)) / 4 + 0.03 self.set_dayu_width(120) self.set_dayu_color(dayu_theme.primary_color) def set_widget(self, widget): """ Set a custom widget to show on the circle's inner center and replace the default percent label :param widget: QWidget :return: None """ self.setTextVisible(False) self._main_lay.addWidget(widget) def get_dayu_width(self): """ Get current circle fixed width :return: int """ return self._width def set_dayu_width(self, value): """ Set current circle fixed width :param value: int :return: None """ self._width = value self.setFixedSize(QSize(self._width * self._width_factor, self._width * self._height_factor)) def get_dayu_color(self): """ Get current circle foreground color :return: str """ return self._color def set_dayu_color(self, value): """ Set current circle's foreground color :param value: str :return: """ self._color = value self.update() dayu_color = Property(str, get_dayu_color, set_dayu_color) dayu_width = Property(int, get_dayu_width, set_dayu_width) def paintEvent(self, event): """Override QProgressBar's paintEvent.""" if self.text() != self._default_label.text(): self._default_label.setText(self.text()) if self.isTextVisible() != self._default_label.isVisible(): self._default_label.setVisible(self.isTextVisible()) percent = utils.get_percent(self.value(), self.minimum(), self.maximum()) total_width = self.get_dayu_width() pen_width = int(3 * total_width / 50.0) radius = total_width - pen_width - 1 painter = QPainter(self) painter.setRenderHints(QPainter.Antialiasing) # draw background circle pen_background = QPen() pen_background.setWidth(pen_width) pen_background.setColor(dayu_theme.background_selected_color) pen_background.setCapStyle(Qt.RoundCap) painter.setPen(pen_background) painter.drawArc(pen_width / 2.0 + 1, pen_width / 2.0 + 1, radius, radius, self._start_angle, -self._max_delta_angle) # draw foreground circle pen_foreground = QPen() pen_foreground.setWidth(pen_width) pen_foreground.setColor(self._color) pen_foreground.setCapStyle(Qt.RoundCap) painter.setPen(pen_foreground) painter.drawArc(pen_width / 2.0 + 1, pen_width / 2.0 + 1, radius, radius, self._start_angle, -percent * 0.01 * self._max_delta_angle) painter.end() @classmethod def dashboard(cls, parent=None): """Create a dashboard style MCircle""" return MProgressCircle(dashboard=True, parent=parent)
def __init__(self, text, duration=None, dayu_type=None, parent=None): super(MToast, self).__init__(parent) self.setWindowFlags(Qt.FramelessWindowHint | Qt.Dialog | Qt.WA_TranslucentBackground | Qt.WA_DeleteOnClose) self.setAttribute(Qt.WA_StyledBackground) _icon_lay = QHBoxLayout() _icon_lay.addStretch() if dayu_type == MToast.LoadingType: _icon_lay.addWidget( MLoading(size=dayu_theme.huge, color=dayu_theme.text_color_inverse)) else: _icon_label = MAvatar() _icon_label.set_dayu_size(60) _icon_label.set_dayu_image( MPixmap('{}_line.svg'.format(dayu_type or MToast.InfoType), dayu_theme.text_color_inverse)) _icon_lay.addWidget(_icon_label) _icon_lay.addStretch() _content_label = MLabel() _content_label.setText(text) _content_label.setAlignment(Qt.AlignCenter) _main_lay = QVBoxLayout() _main_lay.setContentsMargins(0, 0, 0, 0) _main_lay.addStretch() _main_lay.addLayout(_icon_lay) _main_lay.addSpacing(10) _main_lay.addWidget(_content_label) _main_lay.addStretch() self.setLayout(_main_lay) self.setFixedSize(QSize(120, 120)) _close_timer = QTimer(self) _close_timer.setSingleShot(True) _close_timer.timeout.connect(self.close) _close_timer.timeout.connect(self.sig_closed) _close_timer.setInterval( (duration or self.default_config.get('duration')) * 1000) _ani_timer = QTimer(self) _ani_timer.timeout.connect(self._fade_out) _ani_timer.setInterval( (duration or self.default_config.get('duration')) * 1000 - 300) _close_timer.start() _ani_timer.start() self._opacity_ani = QPropertyAnimation() self._opacity_ani.setTargetObject(self) self._opacity_ani.setDuration(300) self._opacity_ani.setEasingCurve(QEasingCurve.OutCubic) self._opacity_ani.setPropertyName(b'windowOpacity') self._opacity_ani.setStartValue(0.0) self._opacity_ani.setEndValue(0.9) self._get_center_position(parent) self._fade_int()
def setupUI(self): self.setMaximumWidth(Data.getWindowWidth() / 3) self.ui = loadUi(file_path + "\\res\\UI\\ParameterWindow.ui") self.ui.setParent(self) self.setLayout(QVBoxLayout()) self.layout().addWidget(self.ui) self.widget_1 = self.ui.findChild(QWidget, "widget") self.widget_2 = self.ui.findChild(QWidget, "widget_2") self.widget_3 = self.ui.findChild(QWidget, "widget_3") self.widget_4 = self.ui.findChild(QWidget, "widget_4") self.widget_1.setLayout(QVBoxLayout()) self.widget_2.setLayout(QVBoxLayout()) self.widget_4.setLayout(QVBoxLayout()) self.widget_2.layout().setSpacing(8) #设置布局 tab_card = MTabWidget() self.label_filePic = MLabel("") self.widget_1.setMinimumSize(Data.getWindowHeight() / 2.8, Data.getWindowHeight() / 2.8) tab_card.addTab(self.label_filePic, u'预览图') # Todo 加载3d视口 # self.model_widget = QWidget() self.model_widget = CefBrowser(self, url="editor") # self.model_widget.setLayout(QVBoxLayout()) tab_card.addTab(self.model_widget, u'3D视口') self.widget_1.layout().addWidget(tab_card) self.widget_1.layout().setContentsMargins(0, 0, 0, 0) self.widget_2.layout().addWidget(MDivider(u'操作面板')) self.let_filename = MLineEdit(text='filename') tool_button = MLabel(text=u'文件名').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.let_filename.set_prefix_widget(tool_button) self.widget_2.layout().addWidget(self.let_filename) self.let_path = MLineEdit(text='filepath') tool_button_2 = MLabel(text=u'文件地址').mark().secondary() tool_button_2.setAlignment(Qt.AlignCenter) tool_button_2.setFixedWidth(80) self.let_path.set_prefix_widget(tool_button_2) self.widget_2.layout().addWidget(self.let_path) self.widget_2.layout().addWidget(MLabel(u'标签')) self.let_tag = MLineEdit(text='tag') self.btn_reviseTag = MPushButton(text=u'修改').primary() self.btn_reviseTag.setFixedWidth(80) self.let_tag.set_suffix_widget(self.btn_reviseTag) self.widget_2.layout().addWidget(self.let_tag) self.btn_export = MPushButton(u'导出到houdini').primary() self.widget_2.layout().addWidget(self.btn_export) self.btn_exportToMaya = MPushButton(u'导出到Maya').primary() self.widget_2.layout().addWidget(self.btn_exportToMaya) self.timer = QTimer() self.timer.setInterval(0.1) self.timer.timeout.connect(self.slot_timeout) self.auto_color_progress = MProgressBar().auto_color() self.widget_2.layout().addWidget(self.auto_color_progress) self.widget_4.layout().addWidget(MDivider(u'操作记录')) self.setWindowTitle(u"参数面板") # #获取控件 self.tableWidget_operationNote = self.ui.findChild( QTableWidget, "tableWidget_operationNote") self.tableWidget_operationNote.setStyleSheet(Data.getQSS()) #设置默认值 self.let_filename.setReadOnly(True) #只读 self.let_path.setReadOnly(True) #只读 self.let_tag.setReadOnly(True) #只读 self.tableWidget_operationNote.setHorizontalHeaderLabels( [u'用户', u'操作', u'时间']) # #连接信号与槽 self.btn_export.clicked.connect(self.slot_run) self.btn_reviseTag.clicked.connect(lambda: self.reviseTag()) # self.tableWidget_operationNote.setColumnCount(3) setSectionResizeMode(self.tableWidget_operationNote.horizontalHeader(), QHeaderView.Stretch) # 自适应
class MPage(QWidget, MFieldMixin): """ MPage A long list can be divided into several pages by MPage, and only one page will be loaded at a time. """ sig_page_changed = Signal(int, int) def __init__(self, parent=None): super(MPage, self).__init__(parent) self.register_field('page_size_selected', 25) self.register_field('page_size_list', [{'label': '25 - Fastest', 'value': 25}, {'label': '50 - Fast', 'value': 50}, {'label': '75 - Medium', 'value': 75}, {'label': '100 - Slow', 'value': 100}]) self.register_field('total', 0) self.register_field('current_page', 0) self.register_field('total_page', lambda: utils.get_total_page(self.field('total'), self.field('page_size_selected'))) self.register_field('total_page_text', lambda: str(self.field('total_page'))) self.register_field('display_text', lambda: utils.get_page_display_string(self.field('current_page'), self.field('page_size_selected'), self.field('total'))) self.register_field('can_pre', lambda: self.field('current_page') > 1) self.register_field('can_next', lambda: self.field('current_page') < self.field('total_page')) page_setting_menu = MMenu(parent=self) self._display_label = MLabel() self._display_label.setAlignment(Qt.AlignCenter) self._change_page_size_button = MComboBox().small() self._change_page_size_button.setFixedWidth(110) self._change_page_size_button.set_menu(page_setting_menu) self._change_page_size_button.set_formatter(lambda x: u'{} per page'.format(x)) self._change_page_size_button.sig_value_changed.connect(self._emit_page_changed) self._pre_button = MToolButton().icon_only().svg('left_fill.svg').small() self._pre_button.clicked.connect(functools.partial(self._slot_change_current_page, -1)) self._next_button = MToolButton().small().icon_only().svg('right_fill.svg') self._next_button.clicked.connect(functools.partial(self._slot_change_current_page, 1)) self._current_page_spin_box = MSpinBox() self._current_page_spin_box.setMinimum(1) self._current_page_spin_box.set_dayu_size(dayu_theme.small) self._current_page_spin_box.valueChanged.connect(self._emit_page_changed) self._total_page_label = MLabel() self.bind('page_size_list', page_setting_menu, 'data') self.bind('page_size_selected', page_setting_menu, 'value', signal='sig_value_changed') self.bind('page_size_selected', self._change_page_size_button, 'value', signal='sig_value_changed') self.bind('current_page', self._current_page_spin_box, 'value', signal='valueChanged') self.bind('total_page', self._current_page_spin_box, 'maximum') self.bind('total_page_text', self._total_page_label, 'dayu_text') self.bind('display_text', self._display_label, 'dayu_text') self.bind('can_pre', self._pre_button, 'enabled') self.bind('can_next', self._next_button, 'enabled') main_lay = QHBoxLayout() main_lay.setContentsMargins(0, 0, 0, 0) main_lay.setSpacing(2) main_lay.addStretch() main_lay.addWidget(self._display_label) main_lay.addStretch() main_lay.addWidget(MLabel('|').secondary()) main_lay.addWidget(self._change_page_size_button) main_lay.addWidget(MLabel('|').secondary()) main_lay.addWidget(self._pre_button) main_lay.addWidget(MLabel('Page')) main_lay.addWidget(self._current_page_spin_box) main_lay.addWidget(MLabel('/')) main_lay.addWidget(self._total_page_label) main_lay.addWidget(self._next_button) self.setLayout(main_lay) def set_total(self, value): """Set page component total count.""" self.set_field('total', value) self.set_field('current_page', 1) def _slot_change_current_page(self, offset): self.set_field('current_page', self.field('current_page') + offset) self._emit_page_changed() def set_page_config(self, data_list): """Set page component per page settings.""" self.set_field('page_size_list', [{'label': str(data), 'value': data} if isinstance(data, int) else data for data in data_list]) def _emit_page_changed(self): self.sig_page_changed.emit(self.field('page_size_selected'), self.field('current_page'))
def _init_ui(self): size_lay = QtWidgets.QHBoxLayout() line_edit_l = MLineEdit().large() line_edit_l.setPlaceholderText("large size") line_edit_m = MLineEdit().medium() line_edit_m.setPlaceholderText("default size") line_edit_s = MLineEdit().small() line_edit_s.setPlaceholderText("small size") size_lay.addWidget(line_edit_l) size_lay.addWidget(line_edit_m) size_lay.addWidget(line_edit_s) line_edit_tool_button = MLineEdit(text="MToolButton") line_edit_tool_button.set_prefix_widget( MToolButton().svg("user_line.svg").icon_only() ) line_edit_label = MLineEdit(text="MLabel") tool_button = MLabel(text="User").mark().secondary() tool_button.setAlignment(QtCore.Qt.AlignCenter) tool_button.setFixedWidth(80) line_edit_label.set_prefix_widget(tool_button) line_edit_push_button = MLineEdit(text="MPushButton") push_button = MPushButton(text="Go").primary() push_button.setFixedWidth(40) line_edit_push_button.set_suffix_widget(push_button) search_engine_line_edit = MLineEdit().search_engine().large() search_engine_line_edit.returnPressed.connect(self.slot_search) line_edit_options = MLineEdit() combobox = MComboBox() option_menu = MMenu() option_menu.set_separator("|") option_menu.set_data([r"http://", r"https://"]) combobox.set_menu(option_menu) combobox.set_value("http://") combobox.setFixedWidth(100) line_edit_options.set_prefix_widget(combobox) main_lay = QtWidgets.QVBoxLayout() main_lay.addWidget(MDivider("different size")) main_lay.addLayout(size_lay) main_lay.addWidget(MDivider("custom prefix and suffix widget")) main_lay.addWidget(line_edit_tool_button) main_lay.addWidget(line_edit_label) main_lay.addWidget(line_edit_push_button) main_lay.addWidget(MDivider("preset")) main_lay.addWidget(MLabel("error")) main_lay.addWidget( MLineEdit(text="waring: file d:/ddd/ccc.jpg not exists.").error() ) main_lay.addWidget(MLabel("search")) main_lay.addWidget(MLineEdit().search().small()) main_lay.addWidget(MLabel("search_engine")) main_lay.addWidget(search_engine_line_edit) main_lay.addWidget(MLabel("file")) main_lay.addWidget(MLineEdit().file().small()) main_lay.addWidget(MLabel("folder")) main_lay.addWidget(MLineEdit().folder().small()) main_lay.addWidget(MLabel("MLineEdit.options()")) main_lay.addWidget(line_edit_options) main_lay.addStretch() self.setLayout(main_lay)
def _init_ui(self): main_lay = QtWidgets.QVBoxLayout() self.setLayout(main_lay) main_lay.addWidget(MDivider("circle")) lay1 = QtWidgets.QHBoxLayout() circle_1 = MProgressCircle(parent=self) circle_1.setFormat("%p Days") circle_1.setValue(80) circle_2 = MProgressCircle(parent=self) circle_2.set_dayu_color(dayu_theme.success_color) circle_2.setValue(100) circle_3 = MProgressCircle(parent=self) circle_3.set_dayu_color(dayu_theme.error_color) circle_3.setValue(40) dashboard_1 = MProgressCircle.dashboard(parent=self) dashboard_1.setFormat("%p Days") dashboard_1.setValue(80) dashboard_2 = MProgressCircle.dashboard(parent=self) dashboard_2.set_dayu_color(dayu_theme.success_color) dashboard_2.setValue(100) dashboard_3 = MProgressCircle.dashboard(parent=self) dashboard_3.set_dayu_color(dayu_theme.error_color) dashboard_3.setValue(40) lay1.addWidget(circle_1) lay1.addWidget(circle_2) lay1.addWidget(circle_3) dashboard_lay = QtWidgets.QHBoxLayout() dashboard_lay.addWidget(dashboard_1) dashboard_lay.addWidget(dashboard_2) dashboard_lay.addWidget(dashboard_3) main_lay.addLayout(lay1) main_lay.addWidget(MDivider("dashboard")) main_lay.addLayout(dashboard_lay) main_lay.addWidget(MDivider("different radius")) scale_x, _ = get_scale_factor() circle_4 = MProgressCircle(parent=self) circle_4.set_dayu_width(100 * scale_x) circle_4.setValue(40) circle_5 = MProgressCircle(parent=self) circle_5.setValue(40) circle_6 = MProgressCircle(parent=self) circle_6.set_dayu_width(160 * scale_x) circle_6.setValue(40) lay2 = QtWidgets.QHBoxLayout() lay2.addWidget(circle_4) lay2.addWidget(circle_5) lay2.addWidget(circle_6) main_lay.addLayout(lay2) main_lay.addWidget(MDivider("data bind")) self.register_field("percent", 0) self.register_field("color", self.get_color) self.register_field("format", self.get_format) circle = MProgressCircle(parent=self) self.bind("percent", circle, "value") self.bind("color", circle, "dayu_color") self.bind("format", circle, "format") lay3 = QtWidgets.QHBoxLayout() button_grp = MPushButtonGroup() button_grp.set_dayu_type(MPushButton.DefaultType) button_grp.set_button_list([ { "text": "+", "clicked": functools.partial(self.slot_change_percent, 10), }, { "text": "-", "clicked": functools.partial(self.slot_change_percent, -10), }, ]) lay3.addWidget(circle) lay3.addWidget(button_grp) lay3.addStretch() main_lay.addLayout(lay3) custom_widget = QtWidgets.QWidget() custom_layout = QtWidgets.QVBoxLayout() custom_layout.setContentsMargins(20, 20, 20, 20) custom_layout.addStretch() custom_widget.setLayout(custom_layout) lab1 = MLabel(text="42,001,776").h3() lab2 = MLabel(text="消费人群规模").secondary() lab3 = MLabel(text="总占人数 75%").secondary() lab1.setAlignment(QtCore.Qt.AlignCenter) lab2.setAlignment(QtCore.Qt.AlignCenter) lab3.setAlignment(QtCore.Qt.AlignCenter) custom_layout.addWidget(lab1) custom_layout.addWidget(lab2) custom_layout.addWidget(MDivider()) custom_layout.addWidget(lab3) custom_layout.addStretch() custom_circle = MProgressCircle() custom_circle.set_dayu_width(180 * scale_x) custom_circle.setValue(75) custom_circle.set_widget(custom_widget) main_lay.addWidget(MDivider("custom circle")) main_lay.addWidget(custom_circle) main_lay.addStretch()
def _init_ui(self): self.setWindowModality(Qt.ApplicationModal) self.setMinimumSize(Data.getWindowWidth() / 4.5, Data.getWindowHeight() / 1.6) self.setMaximumSize(Data.getWindowWidth() / 4.5, Data.getWindowHeight() / 1.6) browser_4 = MClickBrowserFolderToolButton().huge() self.lineEdit = MLineEdit(text='filepath') self.lineEdit.setReadOnly(True) browser_4.sig_folder_changed.connect(self.lineEdit.setText) lay_1 = QHBoxLayout() lay_1.addWidget(self.lineEdit) lay_1.addWidget(browser_4) self.tab = MLineTabWidget() widget = QWidget() widget.setLayout(QVBoxLayout()) self.lineEdit_width = MLineEdit() tool_button = MLabel(text=u'宽度').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.lineEdit_width.set_prefix_widget(tool_button) self.lineEdit_width.setText("1080") self.lineEdit_width.setValidator(QIntValidator()) self.lineEdit_height = MLineEdit() tool_button = MLabel(text=u'高度').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.lineEdit_height.set_prefix_widget(tool_button) self.lineEdit_height.setText("720") self.lineEdit_height.setValidator(QIntValidator()) self.lineEdit_level = MLineEdit() tool_button = MLabel(text=u'精度').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.lineEdit_level.set_prefix_widget(tool_button) self.lineEdit_level.setText("50") self.lineEdit_level.setValidator(QIntValidator()) widget.layout().addWidget(MLabel(u'贴图大小')) widget.layout().addWidget(self.lineEdit_width) widget.layout().addWidget(self.lineEdit_height) widget.layout().addSpacing(10) widget.layout().addWidget(MLabel(u'贴图精度')) widget.layout().addWidget(self.lineEdit_level) self.tab.add_tab(widget, u'低精度图片') widget2 = QWidget() widget2.setLayout(QVBoxLayout()) self.MlineEdit_level = MLineEdit() tool_button = MLabel(text=u'精度').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.MlineEdit_level.set_prefix_widget(tool_button) self.MlineEdit_level.setText("50") self.MlineEdit_level.setValidator(QIntValidator()) widget2.layout().addWidget(MLabel(u'模型精度')) widget2.layout().addWidget(self.MlineEdit_level) widget2.layout().addSpacing(100) self.tab.add_tab(widget2, u'低精度模型') btn_layout = QHBoxLayout() self.btn_ok = MPushButton(text=u'导出').primary() self.btn_ok.setFixedWidth(80) self.btn_cancel = MPushButton(text=u'取消').primary() self.btn_cancel.setFixedWidth(80) btn_layout.addWidget(self.btn_ok) btn_layout.addWidget(self.btn_cancel) main_lay = QVBoxLayout() main_lay.addSpacing(20) main_lay.addWidget(MDivider(u'路径选择')) main_lay.addLayout(lay_1) main_lay.addWidget(MDivider(u'操作选择')) main_lay.addWidget(self.tab) main_lay.addWidget(MDivider(u'')) main_lay.addLayout(btn_layout) main_lay.addSpacing(20) self.setLayout(main_lay) dayu_theme.background_color = "#262626" dayu_theme.apply(self)
def _init_ui(self): size_lay = QHBoxLayout() line_edit_l = MLineEdit().large() line_edit_l.setPlaceholderText('large size') line_edit_m = MLineEdit().medium() line_edit_m.setPlaceholderText('default size') line_edit_s = MLineEdit().small() line_edit_s.setPlaceholderText('small size') size_lay.addWidget(line_edit_l) size_lay.addWidget(line_edit_m) size_lay.addWidget(line_edit_s) line_edit_tool_button = MLineEdit(text='MToolButton') line_edit_tool_button.set_prefix_widget( MToolButton().svg('user_line.svg').icon_only()) line_edit_label = MLineEdit(text='MLabel') tool_button = MLabel(text='User').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) line_edit_label.set_prefix_widget(tool_button) line_edit_push_button = MLineEdit(text='MPushButton') push_button = MPushButton(text='Go').primary() push_button.setFixedWidth(40) line_edit_push_button.set_suffix_widget(push_button) search_engine_line_edit = MLineEdit().search_engine().large() search_engine_line_edit.returnPressed.connect(self.slot_search) line_edit_options = MLineEdit() combobox = MComboBox() option_menu = MMenu() option_menu.set_separator('|') option_menu.set_data([r'http://', r'https://']) combobox.set_menu(option_menu) combobox.set_value('http://') combobox.setFixedWidth(90) line_edit_options.set_prefix_widget(combobox) main_lay = QVBoxLayout() main_lay.addWidget(MDivider('different size')) main_lay.addLayout(size_lay) main_lay.addWidget(MDivider('custom prefix and suffix widget')) main_lay.addWidget(line_edit_tool_button) main_lay.addWidget(line_edit_label) main_lay.addWidget(line_edit_push_button) main_lay.addWidget(MDivider('preset')) main_lay.addWidget(MLabel('error')) main_lay.addWidget( MLineEdit(text='waring: file d:/ddd/ccc.jpg not exists.').error()) main_lay.addWidget(MLabel('search')) main_lay.addWidget(MLineEdit().search().small()) main_lay.addWidget(MLabel('search_engine')) main_lay.addWidget(search_engine_line_edit) main_lay.addWidget(MLabel('file')) main_lay.addWidget(MLineEdit().file().small()) main_lay.addWidget(MLabel('folder')) main_lay.addWidget(MLineEdit().folder().small()) main_lay.addWidget(MLabel('MLineEdit.options()')) main_lay.addWidget(line_edit_options) main_lay.addStretch() self.setLayout(main_lay)
def __init__(self, username): super(editUserWinodw, self).__init__() self.setWindowModality(Qt.ApplicationModal) self.setMinimumSize(Data.getWindowHeight() / 1.5, Data.getWindowHeight() / 3) # self.setMinimumSize(Data.getWindowWidth() / 3, Data.getWindowHeight() / 3) # self.setMaximumSize(Data.getWindowWidth() / 3, Data.getWindowHeight() / 3) self.username = username self.key = None self.wchp = False self.wcun = False self.wcpw = False self.wcid = False # 设置窗口名称 self.setWindowTitle(u"用户窗口") self.tab = MLineTabWidget() widget = QWidget() widget_child = QWidget() widget_child_2 = QWidget() widget.setLayout(QHBoxLayout()) widget_child.setLayout(QVBoxLayout()) widget_child_2.setLayout(QVBoxLayout()) self.label_headProfile = MLabel() self.label_headProfile.setAlignment(Qt.AlignHCenter) self.btn_changeHead = MPushButton(u'选择新头像') widget_child.layout().addWidget(self.label_headProfile) widget_child.layout().addWidget(self.btn_changeHead) # widget_child.layout().addStretch() self.let_username = MLineEdit(text='username') tool_button = MLabel(text=u'用户名').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.let_username.set_prefix_widget(tool_button) widget_child_2.layout().addWidget(self.let_username) self.let_ID = MLineEdit(text='identity') self.btn_changeID = MPushButton(text=u'修改身份').primary() self.btn_changeID.setFixedWidth(80) self.let_ID.set_suffix_widget(self.btn_changeID) widget_child_2.layout().addWidget(self.let_ID) self.let_key = MLineEdit(text='') tool_button = MLabel(text=u'密钥').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.let_key.set_prefix_widget(tool_button) widget_child_2.layout().addWidget(self.let_key) self.let_password = MLineEdit(text='***********') self.btn_changePassword = MPushButton(text=u'修改密码').primary() self.btn_changePassword.setFixedWidth(80) self.let_password.set_suffix_widget(self.btn_changePassword) widget_child_2.layout().addWidget(self.let_password) self.btn_ok = MPushButton(u'确定').large().primary() self.btn_cancel = MPushButton(u'取消').large().primary() layout = QHBoxLayout() layout.addWidget(self.btn_ok) layout.addWidget(self.btn_cancel) widget_child_2.layout().addLayout(layout) widget.layout().addWidget(widget_child) widget.layout().addWidget(widget_child_2) self.tab.add_tab(widget, u'用户信息') widget2 = QWidget() self.ui = loadUi(file_path + r"\res\UI\EditUserWindow.ui") self.ui.setParent(widget2) widget2.setLayout(QVBoxLayout()) widget2.layout().addWidget(self.ui) self.tableWidget_operationNode = self.ui.findChild( QTableWidget, "tableWidget_operationNode") self.tableWidget_operationNode.setStyleSheet(Data.getQSS()) setSectionResizeMode(self.tableWidget_operationNode.horizontalHeader(), QHeaderView.Stretch) # 自适应 # widget2.layout().addSpacing(100) self.tab.add_tab(widget2, u'操作记录') btn_layout = QHBoxLayout() main_lay = QVBoxLayout() main_lay.addSpacing(20) main_lay.addWidget(self.tab) main_lay.addWidget(MDivider(u'')) main_lay.addLayout(btn_layout) main_lay.addSpacing(20) self.setLayout(main_lay) dayu_theme.background_color = "#262626" dayu_theme.apply(self) # 设置默认值 self.tableWidget_operationNode.setHorizontalHeaderLabels( [u'操作', u'文件名', u'时间']) # 设置资产操作记录表: colUser = userdb[self.username] userlist = colUser.find({}, {"FileName": 1, "Operation": 1, "Time": 1}) i = 0 for xdir in userlist: if "Operation" in xdir: str1 = xdir["Operation"] newItem1 = QTableWidgetItem(str1) self.tableWidget_operationNode.setItem(i, 0, newItem1) if "FileName" in xdir: str2 = xdir["FileName"] newItem2 = QTableWidgetItem(str2) self.tableWidget_operationNode.setItem(i, 1, newItem2) if "Time" in xdir: str3 = xdir["Time"] newItem3 = QTableWidgetItem(str3) self.tableWidget_operationNode.setItem(i, 2, newItem3) i += 1 #设置默认值 pixmap = QtGui.QPixmap(hpPath + "\\" + self.username + ".jpg") self.label_headProfile.setPixmap(pixmap) self.let_username.setText(self.username) self.let_username.setReadOnly(True) #只读 self.let_ID.setReadOnly(True) # 只读 self.let_password.setReadOnly(True) # 只读 self.let_password.setEchoMode(QLineEdit.Password) #输入密码形式 # 从数据库提取ID for x in colUser.find({"_id": "UserID"}, {"UserID": 1}): ID = x["UserID"] self.let_ID.setText(ID) # 显示身份 self.let_password.setText("**********") #链接信号与槽 self.btn_changeHead.clicked.connect(lambda: self.editHeadProfile()) self.btn_ok.clicked.connect(lambda: self.ok()) self.btn_cancel.clicked.connect(lambda: self.cancel()) self.btn_changePassword.clicked.connect(lambda: self.changePassword()) self.btn_changeID.clicked.connect(lambda: self.setID())
class editUserWinodw(QWidget): """ 编辑用户信息窗口类 """ editUser_signal = QtCore.Signal() #确认头像信号 def __init__(self, username): super(editUserWinodw, self).__init__() self.setWindowModality(Qt.ApplicationModal) self.setMinimumSize(Data.getWindowHeight() / 1.5, Data.getWindowHeight() / 3) # self.setMinimumSize(Data.getWindowWidth() / 3, Data.getWindowHeight() / 3) # self.setMaximumSize(Data.getWindowWidth() / 3, Data.getWindowHeight() / 3) self.username = username self.key = None self.wchp = False self.wcun = False self.wcpw = False self.wcid = False # 设置窗口名称 self.setWindowTitle(u"用户窗口") self.tab = MLineTabWidget() widget = QWidget() widget_child = QWidget() widget_child_2 = QWidget() widget.setLayout(QHBoxLayout()) widget_child.setLayout(QVBoxLayout()) widget_child_2.setLayout(QVBoxLayout()) self.label_headProfile = MLabel() self.label_headProfile.setAlignment(Qt.AlignHCenter) self.btn_changeHead = MPushButton(u'选择新头像') widget_child.layout().addWidget(self.label_headProfile) widget_child.layout().addWidget(self.btn_changeHead) # widget_child.layout().addStretch() self.let_username = MLineEdit(text='username') tool_button = MLabel(text=u'用户名').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.let_username.set_prefix_widget(tool_button) widget_child_2.layout().addWidget(self.let_username) self.let_ID = MLineEdit(text='identity') self.btn_changeID = MPushButton(text=u'修改身份').primary() self.btn_changeID.setFixedWidth(80) self.let_ID.set_suffix_widget(self.btn_changeID) widget_child_2.layout().addWidget(self.let_ID) self.let_key = MLineEdit(text='') tool_button = MLabel(text=u'密钥').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.let_key.set_prefix_widget(tool_button) widget_child_2.layout().addWidget(self.let_key) self.let_password = MLineEdit(text='***********') self.btn_changePassword = MPushButton(text=u'修改密码').primary() self.btn_changePassword.setFixedWidth(80) self.let_password.set_suffix_widget(self.btn_changePassword) widget_child_2.layout().addWidget(self.let_password) self.btn_ok = MPushButton(u'确定').large().primary() self.btn_cancel = MPushButton(u'取消').large().primary() layout = QHBoxLayout() layout.addWidget(self.btn_ok) layout.addWidget(self.btn_cancel) widget_child_2.layout().addLayout(layout) widget.layout().addWidget(widget_child) widget.layout().addWidget(widget_child_2) self.tab.add_tab(widget, u'用户信息') widget2 = QWidget() self.ui = loadUi(file_path + r"\res\UI\EditUserWindow.ui") self.ui.setParent(widget2) widget2.setLayout(QVBoxLayout()) widget2.layout().addWidget(self.ui) self.tableWidget_operationNode = self.ui.findChild( QTableWidget, "tableWidget_operationNode") self.tableWidget_operationNode.setStyleSheet(Data.getQSS()) setSectionResizeMode(self.tableWidget_operationNode.horizontalHeader(), QHeaderView.Stretch) # 自适应 # widget2.layout().addSpacing(100) self.tab.add_tab(widget2, u'操作记录') btn_layout = QHBoxLayout() main_lay = QVBoxLayout() main_lay.addSpacing(20) main_lay.addWidget(self.tab) main_lay.addWidget(MDivider(u'')) main_lay.addLayout(btn_layout) main_lay.addSpacing(20) self.setLayout(main_lay) dayu_theme.background_color = "#262626" dayu_theme.apply(self) # 设置默认值 self.tableWidget_operationNode.setHorizontalHeaderLabels( [u'操作', u'文件名', u'时间']) # 设置资产操作记录表: colUser = userdb[self.username] userlist = colUser.find({}, {"FileName": 1, "Operation": 1, "Time": 1}) i = 0 for xdir in userlist: if "Operation" in xdir: str1 = xdir["Operation"] newItem1 = QTableWidgetItem(str1) self.tableWidget_operationNode.setItem(i, 0, newItem1) if "FileName" in xdir: str2 = xdir["FileName"] newItem2 = QTableWidgetItem(str2) self.tableWidget_operationNode.setItem(i, 1, newItem2) if "Time" in xdir: str3 = xdir["Time"] newItem3 = QTableWidgetItem(str3) self.tableWidget_operationNode.setItem(i, 2, newItem3) i += 1 #设置默认值 pixmap = QtGui.QPixmap(hpPath + "\\" + self.username + ".jpg") self.label_headProfile.setPixmap(pixmap) self.let_username.setText(self.username) self.let_username.setReadOnly(True) #只读 self.let_ID.setReadOnly(True) # 只读 self.let_password.setReadOnly(True) # 只读 self.let_password.setEchoMode(QLineEdit.Password) #输入密码形式 # 从数据库提取ID for x in colUser.find({"_id": "UserID"}, {"UserID": 1}): ID = x["UserID"] self.let_ID.setText(ID) # 显示身份 self.let_password.setText("**********") #链接信号与槽 self.btn_changeHead.clicked.connect(lambda: self.editHeadProfile()) self.btn_ok.clicked.connect(lambda: self.ok()) self.btn_cancel.clicked.connect(lambda: self.cancel()) self.btn_changePassword.clicked.connect(lambda: self.changePassword()) self.btn_changeID.clicked.connect(lambda: self.setID()) #修改头像 def editHeadProfile(self): dialog = QFileDialog() dialog.setStyleSheet(Data.getQSS()) #根据当前所在文件目录,设置默认打开文件格式 dialog.setNameFilter(u"图片文件(*.jpg *.png *.jpeg);;") #加载对应的文件 dialog.setFileMode(QFileDialog.ExistingFiles) dialog.setViewMode(QFileDialog.Detail) if dialog.exec_(): imgPaths = dialog.selectedFiles() imgPath = imgPaths[0] self.editHeadProfileWin = headProfieWindow(imgPath) self.editHeadProfileWin.show() self.editHeadProfileWin.hPOK_signal.connect( lambda: self.setPicture()) #选中图片,更新头像 self.editHeadProfileWin.hPOK_signal.connect(lambda: self.setWCHP()) #设置头像图片 def setPicture(self): pixmap = QtGui.QPixmap(file_path + r"\res\headPortrial\buffer.jpg") self.label_headProfile.setPixmap(pixmap) def ok(self): # 保存头像 if self.wchp: saveHeadPorfile(self.username, file_path + r"\res\headPortrial\buffer.jpg") if self.wcpw: self.setPassword() self.saveChangePasswordNode(self.username) if self.wcid: colUser = userdb[self.username] # 从数据库提取ID for x in colUser.find({"_id": "UserID"}, {"UserID": 1}): ID = x["UserID"] oldD = {"UserID": ID} newD = {"$set": {"UserID": self.let_ID.text()}} x = colUser.update_many(oldD, newD) self.editUser_signal.emit() #发射确认修改信号 self.slot_show_message(MMessage.success, (u'成功修改用户信息')) self.close() def cancel(self): self.close() def setWCHP(self): self.wchp = True def changePassword(self): self.let_password.setReadOnly(False) self.wcpw = True def setPassword(self): newPassword = self.let_password.text() if not newPassword: msgBox = QMessageBox() msgBox.setText(u'请输入密码!') msgBox.exec_() return 0 colUser = userdb[self.username] # 从数据库提取密码 for x in colUser.find({"_id": "Password"}, {"Password": 1}): if "Password" in x: DBpassword = x["Password"] oldD = {"Password": DBpassword} newD = {"$set": {"Password": newPassword}} x = colUser.update_many(oldD, newD) def setID(self): self.key = self.let_key.text() if self.key == "IDO": if self.let_ID.text() == u"普通用户": self.let_ID.setText(u"管理员") elif self.let_ID.text() == u"管理员": self.let_ID.setText(u"普通用户") self.wcid = True def saveChangePasswordNode(self, username): RTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) # 将浏览信息存入用户数据库 col = userdb[username] dict = {"Operation": "ChangePassword", "Time": RTime} col.insert_one(dict) # def changeUsername(self): # self.let_username.setReadOnly(False) # self.wcun = True # def setUsername(self): # newname = self.let_username.text() # collist = userdb.list_collection_names() # if newname in collist: # print("The username already exists") # return 0 # 弹出信息提示窗口 def slot_show_message(self, func, config): func(config, parent=self)
class headProfieWindow(QWidget): """ 头像编辑窗口 """ hPOK_signal = QtCore.Signal() #确认头像信号 def __init__(self, imgPath): super(headProfieWindow, self).__init__() # 加载ui,并设置ui界面 #self.ui = loadUi(file_path + r"\res\UI\HeadProfileWindow.ui") self.setWindowModality(Qt.ApplicationModal) self.setWindowTitle(u"头像编辑器") # self.ui = loadUi(file_path + r"\res\UI\HeadProfileWindow.ui") # self.ui.setParent(self) self.imgPath = imgPath self.setLayout(QVBoxLayout()) self.label_view = MLabel() self.label_view.setAlignment(Qt.AlignCenter) self.layout().addWidget(self.label_view) self.layout().addWidget(MDivider(u'缩放')) self.hSlider_scale = MSlider(Qt.Horizontal) self.layout().addWidget(self.hSlider_scale) self.layout().addWidget(MDivider(u'垂直位移')) self.hSlider_moveH = MSlider(Qt.Horizontal) self.layout().addWidget(self.hSlider_moveH) self.layout().addWidget(MDivider(u'水平位移')) self.hSlider_moveV = MSlider(Qt.Horizontal) self.layout().addWidget(self.hSlider_moveV) self.layout().addStretch() self.btn_save_image = MPushButton(u'保存图片').large().primary() self.layout().addWidget(self.btn_save_image) dayu_theme.apply(self) self.setMinimumSize(Data.getWindowWidth() / 4.5, Data.getWindowHeight() / 1.7) self.setMaximumSize(Data.getWindowWidth() / 4.5, Data.getWindowHeight() / 1.7) self.layout().setContentsMargins(20, 40, 20, 40) Data.setWindowCenter(self) self.hSlider_scale.setRange(0, 100) self.hSlider_moveH.setRange(0, 100) self.hSlider_moveV.setRange(0, 100) self.hSlider_scale.setValue(0) #初始值 self.hSlider_moveH.setValue(50) self.hSlider_moveV.setValue(50) #原图大小 img = cv2.imread(self.imgPath) self.oiX = img.shape[0] self.oiY = img.shape[1] #获取初始值 self.scale = self.hSlider_scale.value() self.mh = self.hSlider_moveH.value() self.mv = self.hSlider_moveV.value() #设置初始头像 self.editPicture(self.scale, self.mh, self.mv) self.setPicteruView() # #链接信号与槽 self.hSlider_scale.valueChanged.connect(lambda: self.scaleEdit()) self.hSlider_moveH.valueChanged.connect(lambda: self.moveHEdit()) self.hSlider_moveV.valueChanged.connect(lambda: self.moveVEdit()) self.btn_save_image.clicked.connect(lambda: self.ok()) def editPicture(self, sn, mhn, mvn): img = cv2.imread(self.imgPath) #每一次都是用原图编辑 flag = min(img.shape[0], img.shape[1]) sx = (flag - 150) * 0.01 * sn #缩放的变化量 hn = (img.shape[0] - 150) * 0.01 * (mhn - 50) * 0.01 * sn #水平移动变化量 vn = (img.shape[1] - 150) * 0.01 * (mvn - 50) * 0.01 * sn #垂直移动变化量 if (((img.shape[0] - flag) + sx + hn) // 2) < 0 or (( (img.shape[1] - flag) + sx) // 2) < 0: newimg = img[(int((img.shape[0] - flag) + sx) // 2):(int((img.shape[0] + flag) - sx) // 2), (int((img.shape[1] - flag) + sx) // 2):(int((img.shape[1] + flag) - sx) // 2)] else: newimg = img[(int((img.shape[0] - flag) + sx + hn) // 2):(int((img.shape[0] + flag) - sx + hn) // 2), (int((img.shape[1] - flag) + sx + vn) // 2):(int((img.shape[1] + flag) - sx + vn) // 2)] # newimg = img[(int((img.shape[0] - flag) + sx) // 2): (int((img.shape[0] + flag) - sx) // 2), # (int((img.shape[1] - flag) + sx) // 2):(int((img.shape[1] + flag) - sx) // 2)] newimg = cv2.resize(newimg, (150, 150), interpolation=cv2.INTER_AREA) cv2.imwrite(hpPath + "\\" + "buffer.jpg", newimg) # 将图片作为缓存存入指定文件内 def setPicteruView(self): imgPath = hpPath + "\\" + "buffer.jpg" pixmap = QtGui.QPixmap(imgPath) self.label_view.setPixmap(pixmap) def scaleEdit(self): self.scale = self.hSlider_scale.value() self.editPicture(self.scale, self.mh, self.mv) self.setPicteruView() def moveHEdit(self): self.mh = self.hSlider_moveH.value() self.editPicture(self.scale, self.mh, self.mv) self.setPicteruView() def moveVEdit(self): self.mv = self.hSlider_moveV.value() self.editPicture(self.scale, self.mh, self.mv) self.setPicteruView() def ok(self): self.hPOK_signal.emit() self.close()
class MPage(QtWidgets.QWidget, MFieldMixin): """ MPage A long list can be divided into several pages by MPage, and only one page will be loaded at a time. """ sig_page_changed = QtCore.Signal(int, int) def __init__(self, parent=None): super(MPage, self).__init__(parent) self.register_field("page_size_selected", 25) self.register_field( "page_size_list", [ { "label": "25 - Fastest", "value": 25 }, { "label": "50 - Fast", "value": 50 }, { "label": "75 - Medium", "value": 75 }, { "label": "100 - Slow", "value": 100 }, ], ) self.register_field("total", 0) self.register_field("current_page", 0) self.register_field( "total_page", lambda: utils.get_total_page(self.field("total"), self.field("page_size_selected")), ) self.register_field("total_page_text", lambda: str(self.field("total_page"))) self.register_field( "display_text", lambda: utils.get_page_display_string( self.field("current_page"), self.field("page_size_selected"), self.field("total"), ), ) self.register_field("can_pre", lambda: self.field("current_page") > 1) self.register_field( "can_next", lambda: self.field("current_page") < self.field("total_page")) page_setting_menu = MMenu(parent=self) self._display_label = MLabel() self._display_label.setAlignment(QtCore.Qt.AlignCenter) self._change_page_size_button = MComboBox().small() self._change_page_size_button.set_menu(page_setting_menu) self._change_page_size_button.set_formatter( lambda x: "{} per page".format(x)) self._change_page_size_button.sig_value_changed.connect( self._emit_page_changed) self._pre_button = MToolButton().icon_only().svg( "left_fill.svg").small() self._pre_button.clicked.connect( functools.partial(self._slot_change_current_page, -1)) self._next_button = MToolButton().small().icon_only().svg( "right_fill.svg") self._next_button.clicked.connect( functools.partial(self._slot_change_current_page, 1)) self._current_page_spin_box = MSpinBox() self._current_page_spin_box.setMinimum(1) self._current_page_spin_box.set_dayu_size(dayu_theme.small) self._current_page_spin_box.valueChanged.connect( self._emit_page_changed) self._total_page_label = MLabel() self.bind("page_size_list", page_setting_menu, "data") self.bind("page_size_selected", page_setting_menu, "value", signal="sig_value_changed") self.bind( "page_size_selected", self._change_page_size_button, "value", signal="sig_value_changed", ) self.bind("current_page", self._current_page_spin_box, "value", signal="valueChanged") self.bind("total_page", self._current_page_spin_box, "maximum") self.bind("total_page_text", self._total_page_label, "dayu_text") self.bind("display_text", self._display_label, "dayu_text") self.bind("can_pre", self._pre_button, "enabled") self.bind("can_next", self._next_button, "enabled") main_lay = QtWidgets.QHBoxLayout() main_lay.setContentsMargins(0, 0, 0, 0) main_lay.setSpacing(2) main_lay.addStretch() main_lay.addWidget(self._display_label) main_lay.addStretch() main_lay.addWidget(MLabel("|").secondary()) main_lay.addWidget(self._change_page_size_button) main_lay.addWidget(MLabel("|").secondary()) main_lay.addWidget(self._pre_button) main_lay.addWidget(MLabel("Page")) main_lay.addWidget(self._current_page_spin_box) main_lay.addWidget(MLabel("/")) main_lay.addWidget(self._total_page_label) main_lay.addWidget(self._next_button) self.setLayout(main_lay) def set_total(self, value): """Set page component total count.""" self.set_field("total", value) self.set_field("current_page", 1) def _slot_change_current_page(self, offset): self.set_field("current_page", self.field("current_page") + offset) self._emit_page_changed() def set_page_config(self, data_list): """Set page component per page settings.""" self.set_field( "page_size_list", [{ "label": str(data), "value": data } if isinstance(data, int) else data for data in data_list], ) def _emit_page_changed(self): self.sig_page_changed.emit(self.field("page_size_selected"), self.field("current_page"))