def __init__(self, text="New Tag", parent=None): super(MNewTag, self).__init__(parent) self.setAttribute(Qt.WA_StyledBackground) self._add_button = MToolButton().text_beside_icon().small().svg( "add_line.svg") self._add_button.setText(text) self._add_button.clicked.connect(self._slot_show_edit) self._line_edit = MLineEdit().small() self._line_edit.returnPressed.connect(self._slot_return_pressed) self._line_edit.setVisible(False) self._line_edit.installEventFilter(self) self._main_lay = QGridLayout() self._main_lay.setContentsMargins(3, 3, 3, 3) self._main_lay.addWidget(self._add_button, 0, 0) self._main_lay.addWidget(self._line_edit, 0, 0) self.setLayout(self._main_lay) scale_x, _ = get_scale_factor() style = QssTemplate(""" MNewTag{ border: @border@unit dashed @border_color; } MNewTag MToolButton:hover{ border:none; } """) self.setStyleSheet( style.substitute( border_color=utils.fade_color(dayu_theme.secondary_text_color, "35%"), unit=dayu_theme.unit, border=1 * scale_x, ))
def __init__(self, text='New Tag', parent=None): super(MNewTag, self).__init__(parent) self.setAttribute(Qt.WA_StyledBackground) self._add_button = MToolButton().text_beside_icon().tiny().svg( 'add_line.svg') self._add_button.setText(text) self._add_button.clicked.connect(self._slot_show_edit) self._line_edit = MLineEdit().tiny() self._line_edit.returnPressed.connect(self._slot_return_pressed) self._line_edit.setVisible(False) self._line_edit.installEventFilter(self) self._main_lay = QGridLayout() self._main_lay.setContentsMargins(3, 3, 3, 3) self._main_lay.addWidget(self._add_button, 0, 0) self._main_lay.addWidget(self._line_edit, 0, 0) self.setLayout(self._main_lay) style = QssTemplate(''' MNewTag{ border: 1px dashed @border_color; } MNewTag MToolButton:hover{ border:none; } ''') self.setStyleSheet(style.substitute(vars(dayu_theme)))
def __init__(self, view_type=None, parent=None): super(MItemViewSet, self).__init__(parent) self.main_lay = QtWidgets.QVBoxLayout() self.main_lay.setSpacing(5) self.main_lay.setContentsMargins(0, 0, 0, 0) self.sort_filter_model = MSortFilterModel() self.source_model = MTableModel() self.sort_filter_model.setSourceModel(self.source_model) view_class = view_type or MItemViewSet.TableViewType self.item_view = view_class() self.item_view.doubleClicked.connect(self.sig_double_clicked) self.item_view.pressed.connect(self.slot_left_clicked) self.item_view.setModel(self.sort_filter_model) self._search_line_edit = MLineEdit().search().small() self._search_attr_button = ( MToolButton().icon_only().svg("down_fill.svg").small()) self._search_line_edit.set_prefix_widget(self._search_attr_button) self._search_line_edit.textChanged.connect( self.sort_filter_model.set_search_pattern) self._search_line_edit.setVisible(False) self._search_lay = QtWidgets.QHBoxLayout() self._search_lay.setContentsMargins(0, 0, 0, 0) self._search_lay.addStretch() self._search_lay.addWidget(self._search_line_edit) self.main_lay.addLayout(self._search_lay) self.main_lay.addWidget(self.item_view) self.setLayout(self.main_lay)
def __init__(self, size=None, parent=None): super(MSequenceFile, self).__init__(parent) self.sequence_obj = None size = size or dayu_theme.small self._file_label = MLineEdit() self._file_label.set_dayu_size(size) self._file_label.setReadOnly(True) self._is_sequence_check_box = MCheckBox(self.tr('Sequence')) self._is_sequence_check_box.toggled.connect( functools.partial(self.setProperty, 'sequence')) self._is_sequence_check_box.toggled.connect( self.sig_is_sequence_changed) self._info_label = MLabel().secondary() self._error_label = MLabel().secondary() self._error_label.setProperty('error', True) self._error_label.setMinimumWidth(100) self._error_label.set_elide_mode(Qt.ElideMiddle) seq_lay = QHBoxLayout() seq_lay.addWidget(self._is_sequence_check_box) seq_lay.addWidget(self._info_label) seq_lay.addWidget(self._error_label) seq_lay.setStretchFactor(self._is_sequence_check_box, 0) seq_lay.setStretchFactor(self._info_label, 0) seq_lay.setStretchFactor(self._error_label, 100) self._main_lay = QVBoxLayout() self._main_lay.setContentsMargins(0, 0, 0, 0) self._main_lay.addWidget(self._file_label) self._main_lay.addLayout(seq_lay) self.setLayout(self._main_lay) self.set_sequence(True)
def __init__(self): super(CenterWindow,self).__init__() self.setObjectName("CenterWindow") self.fileList = [] # 保存当前选择标签下的文件列表 self.tag = "" # 保存当前标签 self.tableWidget_show = True # tableWidget窗口是否显示 self.row = 0 # 定位添加标签 self.column = 0 self.setupUI() # 设置tablewidget self.tableWidget = self.ui.findChild(QTableWidget, "tableWidget") self.tableWidget.setMaximumHeight(Data.getWindowHeight()/5) self.setTableWidget() self.tableWidget.setStyleSheet(Data.getQSS()) self.tableWidget.setStyleSheet("background-color: #323232") self.searchWidget = self.ui.findChild(QWidget, "widget_2") self.search_engine_line_edit = MLineEdit().search_engine().large() dayu_theme.apply(self.search_engine_line_edit) self.searchWidget.setLayout(QHBoxLayout()) self.searchWidget.layout().addWidget(self.search_engine_line_edit) self.slider = MSlider(Qt.Horizontal) self.slider.setMaximumWidth(Data.getWindowWidth()/4) self.slider.setValue(50) self.slider.setRange(1, 100) dayu_theme.apply(self.slider) self.searchWidget.layout().addWidget(self.slider) self.button_tag = MToolButton().svg('detail_line.svg').icon_only() self.button_tag.setEnabled(True) self.button_del = MToolButton().svg('trash_line.svg').icon_only() self.button_del.setCheckable(True) dayu_theme.apply(self.button_del) dayu_theme.apply(self.button_tag) self.searchWidget.layout().addWidget(self.button_tag) self.searchWidget.layout().addWidget(self.button_del) self.slider.valueChanged.connect(self.changeBtnSize) self.button_tag.clicked.connect(self.showTableWidget) self.button_del.clicked.connect(self.deleteTag) self.search_engine_line_edit.returnPressed.connect(self.on_searchBtn_click) self.setThread()
def _init_ui(self): model_1 = MTableModel() model_1.set_header_list(mock.header_list) model_sort = MSortFilterModel() model_sort.setSourceModel(model_1) tree_view = MTreeView() tree_view.setModel(model_sort) model_sort.set_header_list(mock.header_list) tree_view.set_header_list(mock.header_list) model_1.set_data_list(mock.tree_data_list) line_edit = MLineEdit().search().small() line_edit.textChanged.connect(model_sort.set_search_pattern) expand_all_button = MPushButton('Expand All').small() expand_all_button.clicked.connect(tree_view.expandAll) collapse_all_button = MPushButton('Collapse All').small() collapse_all_button.clicked.connect(tree_view.collapseAll) button_lay = QHBoxLayout() button_lay.addWidget(expand_all_button) button_lay.addWidget(collapse_all_button) button_lay.addWidget(line_edit) button_lay.addStretch() main_lay = QVBoxLayout() main_lay.addLayout(button_lay) main_lay.addWidget(tree_view) main_lay.addStretch() self.setLayout(main_lay)
def __init__(self, text='New Tag', parent=None): super(MNewTag, self).__init__(parent) self.setAttribute(Qt.WA_StyledBackground) self._add_button = MToolButton().tiny().svg( 'add_line.svg').text_beside_icon() self._add_button.setText(text) self._add_button.clicked.connect(self._slot_show_edit) self._line_edit = MLineEdit().tiny() self._line_edit.returnPressed.connect(self._slot_return_pressed) self._line_edit.setVisible(False) self._main_lay = QGridLayout() self._main_lay.setContentsMargins(3, 3, 3, 3) self._main_lay.addWidget(self._add_button, 0, 0) self._main_lay.addWidget(self._line_edit, 0, 0) self.setLayout(self._main_lay)
def _init_ui(self): table_small = MListView(size=dayu_theme.small) table_default = MListView() table_large = MListView(size=dayu_theme.large) model_1 = MTableModel() model_1.set_header_list(mock.header_list) model_sort = MSortFilterModel() model_sort.setSourceModel(model_1) table_small.setModel(model_sort) table_default.setModel(model_sort) table_large.setModel(model_sort) model_sort.set_header_list(mock.header_list) table_small.set_header_list(mock.header_list) table_default.set_header_list(mock.header_list) table_large.set_header_list(mock.header_list) model_1.set_data_list(mock.data_list) line_edit = MLineEdit().search().small() line_edit.textChanged.connect(model_sort.set_search_pattern) main_lay = QVBoxLayout() main_lay.addWidget(line_edit) main_lay.addWidget(MDivider('Small Size')) main_lay.addWidget(table_small) main_lay.addWidget(MDivider('Default Size')) main_lay.addWidget(table_default) main_lay.addWidget(MDivider('Large Size')) main_lay.addWidget(table_large) main_lay.addStretch() self.setLayout(main_lay)
def _init_ui(self): form_lay = QtWidgets.QFormLayout() form_lay.setLabelAlignment(QtCore.Qt.AlignRight) gender_grp = MRadioButtonGroup() gender_grp.set_button_list([ { "text": "Female", "icon": MIcon("female.svg") }, { "text": "Male", "icon": MIcon("male.svg") }, ]) country_combo_box = MComboBox().small() country_combo_box.addItems(["China", "France", "Japan", "US"]) date_edit = MDateEdit().small() date_edit.setCalendarPopup(True) form_lay.addRow("Name:", MLineEdit().small()) form_lay.addRow("Gender:", gender_grp) form_lay.addRow("Age:", MSpinBox().small()) form_lay.addRow("Password:"******"Country:", country_combo_box) form_lay.addRow("Birthday:", date_edit) switch = MSwitch() switch.setChecked(True) form_lay.addRow("Switch:", switch) slider = MSlider() slider.setValue(30) form_lay.addRow("Slider:", slider) button_lay = QtWidgets.QHBoxLayout() button_lay.addStretch() button_lay.addWidget(MPushButton(text="Submit").primary()) button_lay.addWidget(MPushButton(text="Cancel")) main_lay = QtWidgets.QVBoxLayout() main_lay.addLayout(form_lay) main_lay.addWidget(MCheckBox("I accept the terms and conditions")) main_lay.addStretch() main_lay.addWidget(MDivider()) main_lay.addLayout(button_lay) self.setLayout(main_lay)
def setupUI(self): self.setMinimumSize(Data.getWindowWidth() / 4.7, Data.getWindowHeight() / 2) self.setMaximumSize(Data.getWindowWidth() / 4.7, Data.getWindowHeight() / 2) self.setWindowModality(Qt.ApplicationModal) Data.setWindowCenter(self) self.setLayout(QVBoxLayout()) btn = MPushButton("SIGNAL IN") btn.setIcon(QIcon(file_path + r"\res\ZeusDesign\a.png")) self.layout().addWidget(btn) self.layout().addWidget(MDivider()) self.line_edit_name = MLineEdit() self.line_edit_name.setPlaceholderText('username') self.line_edit_name.set_prefix_widget( MToolButton().svg('user_line.svg').icon_only()) self.line_edit_password = MLineEdit() self.line_edit_password.setPlaceholderText('password') self.line_edit_password.setEchoMode(QLineEdit.Password) self.line_edit_password.set_prefix_widget( MToolButton().svg('confirm_line.svg').icon_only()) self.layout().addWidget(self.line_edit_name) self.layout().addWidget(self.line_edit_password) self.layout().addWidget(MDivider()) self.btn_sign_in = MPushButton(u'登录').large().primary() self.layout().addWidget(self.btn_sign_in) self.btn_sign_up = MPushButton(u'注册').large().primary() self.layout().addWidget(self.btn_sign_up) dayu_theme.background_color = "#262626" dayu_theme.apply(self) self.layout().setContentsMargins(20, 40, 20, 40) self.btn_sign_up.clicked.connect(self.on_sigin_up_click) self.btn_sign_in.clicked.connect(self.on_sigin_in_click) self.setWindowTitle(u"登录界面")
def _init_ui(self): model_1 = MTableModel() model_1.set_header_list(mock.header_list) model_sort = MSortFilterModel() model_sort.setSourceModel(model_1) table_small = MTableView(size=dayu_theme.small, show_row_count=True) table_grid = MTableView(size=dayu_theme.small, show_row_count=True) table_grid.setShowGrid(True) table_default = MTableView(size=dayu_theme.medium, show_row_count=True) thread = MFetchDataThread(self) self.loading_wrapper = MLoadingWrapper(widget=table_default, loading=False) thread.started.connect( functools.partial(self.loading_wrapper.set_dayu_loading, True)) thread.finished.connect( functools.partial(self.loading_wrapper.set_dayu_loading, False)) thread.finished.connect( functools.partial(table_default.setModel, model_sort)) button = MPushButton(text="Get Data: 4s") button.clicked.connect(thread.start) switch_lay = QtWidgets.QHBoxLayout() switch_lay.addWidget(button) switch_lay.addStretch() table_large = MTableView(size=dayu_theme.large, show_row_count=False) table_small.setModel(model_sort) table_grid.setModel(model_sort) table_large.setModel(model_sort) model_sort.set_header_list(mock.header_list) table_small.set_header_list(mock.header_list) table_grid.set_header_list(mock.header_list) table_default.set_header_list(mock.header_list) table_large.set_header_list(mock.header_list) model_1.set_data_list(mock.data_list) line_edit = MLineEdit().search().small() line_edit.textChanged.connect(model_sort.set_search_pattern) main_lay = QtWidgets.QVBoxLayout() main_lay.addWidget(line_edit) main_lay.addWidget(MDivider("Small Size")) main_lay.addWidget(table_small) main_lay.addWidget(MDivider("Default Size")) main_lay.addLayout(switch_lay) main_lay.addWidget(self.loading_wrapper) main_lay.addWidget(MDivider("Large Size (Hide Row Count)")) main_lay.addWidget(table_large) main_lay.addWidget(MDivider("With Grid")) main_lay.addWidget(table_grid) main_lay.addStretch() main_lay.addWidget( MAlert('Simply use "MItemViewSet" or "MItemViewFullSet"')) self.setLayout(main_lay)
def _init_ui(self): # header_list = [Column.load(c) for c in mock.header_list] header_list = mock.column_list model_1 = MTableModel() model_1.set_header_list(header_list) model_sort = MSortFilterModel() model_sort.setSourceModel(model_1) table_small = MTableView(size=dayu_theme.small, show_row_count=True) table_grid = MTableView(size=dayu_theme.small, show_row_count=True) table_grid.setShowGrid(True) table_default = MTableView(size=dayu_theme.medium, show_row_count=True) thread = MFetchDataThread(self) self.loading_wrapper = MLoadingWrapper(widget=table_default, loading=False) thread.started.connect( functools.partial(self.loading_wrapper.set_dayu_loading, True)) thread.finished.connect( functools.partial(self.loading_wrapper.set_dayu_loading, False)) thread.finished.connect( functools.partial(table_default.setModel, model_sort)) button = MPushButton(text='Get Data: 4s') button.clicked.connect(thread.start) switch_lay = QHBoxLayout() switch_lay.addWidget(button) switch_lay.addStretch() table_large = MTableView(size=dayu_theme.large, show_row_count=False) table_small.setModel(model_sort) table_grid.setModel(model_sort) table_large.setModel(model_sort) model_sort.set_header_list(header_list) table_small.set_header_list(header_list) table_grid.set_header_list(header_list) table_default.set_header_list(header_list) table_large.set_header_list(header_list) model_1.set_data_list(mock.data_list) line_edit = MLineEdit().search().small() line_edit.textChanged.connect(model_sort.set_search_pattern) main_lay = QVBoxLayout() main_lay.addWidget(line_edit) main_lay.addWidget(MDivider('Small Size')) main_lay.addWidget(table_small) main_lay.addWidget(MDivider('Default Size')) main_lay.addLayout(switch_lay) main_lay.addWidget(self.loading_wrapper) main_lay.addWidget(MDivider('Large Size (Hide Row Count)')) main_lay.addWidget(table_large) main_lay.addWidget(MDivider('With Grid')) main_lay.addWidget(table_grid) main_lay.addStretch() self.setLayout(main_lay)
def _init_ui(self): form_lay = QFormLayout() form_lay.setLabelAlignment(Qt.AlignRight) gender_grp = MRadioButtonGroup() gender_grp.set_button_list([{ 'text': 'Female', 'icon': MIcon('female.svg') }, { 'text': 'Male', 'icon': MIcon('male.svg') }]) country_combo_box = MComboBox().small() country_combo_box.addItems(['China', 'France', 'Japan', 'US']) date_edit = MDateEdit().small() date_edit.setCalendarPopup(True) form_lay.addRow('Name:', MLineEdit().small()) form_lay.addRow('Gender:', gender_grp) form_lay.addRow('Age:', MSpinBox().small()) form_lay.addRow('Password:'******'Country:', country_combo_box) form_lay.addRow('Birthday:', date_edit) switch = MSwitch() switch.setChecked(True) form_lay.addRow('Switch:', switch) slider = MSlider() slider.setValue(30) form_lay.addRow('Slider:', slider) button_lay = QHBoxLayout() button_lay.addStretch() button_lay.addWidget(MPushButton(text='Submit').primary()) button_lay.addWidget(MPushButton(text='Cancel')) main_lay = QVBoxLayout() main_lay.addLayout(form_lay) main_lay.addWidget(MCheckBox('I accept the terms and conditions')) main_lay.addStretch() main_lay.addWidget(MDivider()) main_lay.addLayout(button_lay) self.setLayout(main_lay)
def signUpManager(self): if (self.WM): self.WM = False # self.custom_widget.layout().deleteLater(self.custom_widget.layout().itemAt(1)) # self.custom_widget.layout().removeWidget(self.line_edit_key) # self.custom_widget.layout().removeWidget(self.key_label) # .deleteLater() self.key_label.deleteLater() self.line_edit_key.deleteLater() # self.key_widget.close() else: self.WM = True self.key_label = MLabel(u"管理密钥:") self.line_edit_key = MLineEdit() # self.key_widget = QWidget() # self.key_widget.setLayout(QHBoxLayout()) # self.key_widget.layout().addWidget(self.key_label) # self.key_widget.layout().addWidget(self.line_edit_key) self.custom_widget.layout().addRow(self.key_label, self.line_edit_key)
def __init__(self, *args, **kwargs): super(SearchableMenuBase, self).__init__(*args, **kwargs) self.search_popup = MPopup(self) self.search_popup.setVisible(False) self.search_bar = MLineEdit(self) self.search_label = QtWidgets.QLabel() self.search_bar.textChanged.connect(self.slot_search_change) self.search_bar.keyPressEvent = partial( self.search_key_event, self.search_bar.keyPressEvent ) self.aboutToHide.connect(lambda: self.search_bar.setText("")) layout = QtWidgets.QVBoxLayout() layout.addWidget(self.search_label) layout.addWidget(self.search_bar) self.search_popup.setLayout(layout) self.setProperty("search_placeholder", self.tr("Search Action...")) self.setProperty("search_label", self.tr("Search Action...")) self.setProperty("searchable", True) self.setProperty("search_re", "I")
def slot_new_account(self): custom_widget = QtWidgets.QWidget() custom_lay = QtWidgets.QFormLayout() custom_lay.addRow("Name", MLineEdit()) custom_lay.addRow("Age", MSpinBox()) custom_lay.addRow("Birth", MDateEdit()) custom_widget.setLayout(custom_lay) drawer = MDrawer("New account", parent=self) submit_button = MPushButton("Submit").primary() submit_button.clicked.connect(drawer.close) drawer.add_widget_to_bottom(MPushButton("Cancel")) drawer.add_widget_to_bottom(submit_button) scale_x, _ = get_scale_factor() drawer.setFixedWidth(300 * scale_x) drawer.set_widget(custom_widget) drawer.show()
def slot_new_account(self): custom_widget = QWidget() custom_lay = QFormLayout() custom_lay.addRow('Name', MLineEdit()) custom_lay.addRow('Age', MSpinBox()) custom_lay.addRow('Birth', MDateEdit()) custom_widget.setLayout(custom_lay) drawer = MDrawer('New account', parent=self) submit_button = MPushButton('Submit').primary() submit_button.clicked.connect(drawer.close) drawer.add_button(MPushButton('Cancel')) drawer.add_button(submit_button) drawer.setFixedWidth(200) drawer.set_widget(custom_widget) drawer.show()
def __init__(self, parent=None): super(FieldMixinExample, self).__init__(parent) self.register_field("my_name", "xiaoming") self.register_field("thumbnail_path", "") self.register_field("is_enable", True) self.register_field("status", "waiting") self.register_field("str_enable", self.computed_str_enable) self.register_field("thumbnail_pix_map", self.computed_thumbnail_pix_map) self.register_field("email", self.computed_email) name2_label = MLabel() email_label = MLabel() thumbnail_label = MLabel() enable_button = MPushButton().primary() self.bind("my_name", name2_label, "dayu_text") self.bind("email", email_label, "dayu_text") self.bind("is_enable", enable_button, "enabled") self.bind("thumbnail_pix_map", thumbnail_label, "pixmap") self.bind("str_enable", enable_button, "text") button = MPushButton(text="Change Data").primary() button.clicked.connect(self.slot_change_data) main_lay = QtWidgets.QGridLayout() main_lay.addWidget(MLabel("Avatar:"), 0, 0) main_lay.addWidget(thumbnail_label, 0, 1) main_lay.addWidget(MLabel("Name:"), 1, 0) main_lay.addWidget( self.bind("my_name", MLineEdit(), "text", signal="textEdited"), 1, 1) main_lay.addWidget(MLabel("Email:"), 2, 0) main_lay.addWidget(email_label, 2, 1) main_lay.addWidget(MLabel("Enabled:"), 3, 0) main_lay.addWidget(enable_button, 3, 1) # for index, i in enumerate(self.field('my_name')): # main_lay.addRow('name{}:'.format(index), self.bind('my_name', QLabel(), 'text', index=index)) main_lay.addWidget(button, 4, 1) temp_lay = QtWidgets.QVBoxLayout() temp_lay.addLayout(main_lay) temp_lay.addStretch() self.setLayout(temp_lay)
def __init__(self, parent=None): super(FieldMixinExample, self).__init__(parent) self.register_field('my_name', 'xiaoming') self.register_field('thumbnail_path', '') self.register_field('is_enable', True) self.register_field('status', 'waiting') self.register_field('str_enable', self.computed_str_enable) self.register_field('thumbnail_pix_map', self.computed_thumbnail_pix_map) self.register_field('email', self.computed_email) name2_label = MLabel() email_label = MLabel() thumbnail_label = MLabel() enable_button = MPushButton().primary() self.bind('my_name', name2_label, 'dayu_text') self.bind('email', email_label, 'dayu_text') self.bind('is_enable', enable_button, 'enabled') self.bind('thumbnail_pix_map', thumbnail_label, 'pixmap') self.bind('str_enable', enable_button, 'text') button = MPushButton(text='Change Data').primary() button.clicked.connect(self.slot_change_data) main_lay = QGridLayout() main_lay.addWidget(MLabel('Avatar:'), 0, 0) main_lay.addWidget(thumbnail_label, 0, 1) main_lay.addWidget(MLabel('Name:'), 1, 0) main_lay.addWidget(self.bind('my_name', MLineEdit(), 'text', signal='textEdited'), 1, 1) main_lay.addWidget(MLabel('Email:'), 2, 0) main_lay.addWidget(email_label, 2, 1) main_lay.addWidget(MLabel('Enabled:'), 3, 0) main_lay.addWidget(enable_button, 3, 1) # for index, i in enumerate(self.field('my_name')): # main_lay.addRow('name{}:'.format(index), self.bind('my_name', QLabel(), 'text', index=index)) main_lay.addWidget(button, 4, 1) temp_lay = QVBoxLayout() temp_lay.addLayout(main_lay) temp_lay.addStretch() self.setLayout(temp_lay)
def __init__(self, parent=None, select_callback=None, label=u"文件路径", button_text=u"浏览"): super(IPathSelector, self).__init__(parent=parent) self.label = QtWidgets.QLabel(label) self.line = MLineEdit() self.button = MPushButton() self.button.setText(button_text) callback = select_callback if callable( select_callback) else self.browser_file self.button.clicked.connect(partial(callback, self.line)) layout = QtWidgets.QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) self.setLayout(layout) layout.addWidget(self.label) layout.addWidget(self.line) layout.addWidget(self.button)
def setRegeditWindow(self): self.custom_widget = QWidget() custom_lay = QFormLayout() self.custom_widget.setLayout(custom_lay) self.btn_regedit_image = MPushButton(u'选择文件') self.line_edit_regedit_name = MLineEdit() self.line_edit_regedit_password = MLineEdit() self.line_edit_regedit_password2 = MLineEdit() self.switch_identity = MSwitch().large() custom_lay.addRow(u' 选择头像: ', self.btn_regedit_image) custom_lay.addRow(u' 账号名称: ', self.line_edit_regedit_name) custom_lay.addRow(u' 账号密码: ', self.line_edit_regedit_password) custom_lay.addRow(u' 确认密码: ', self.line_edit_regedit_password2) custom_lay.addRow(u' 管理权限: ', self.switch_identity) # custom_lay.addRow(u'管理钥匙: ',self.line_edit_key) # self.custom_widget.layout().addRow(MLabel) self.drawer = MDrawer('Regedit', parent=self) submit_button = MPushButton(u'注册').primary() cancel_button = MPushButton(u'取消') self.drawer.add_button(cancel_button) self.drawer.add_button(submit_button) self.drawer.setFixedWidth(Data.getWindowWidth() / 5) self.drawer.set_widget(self.custom_widget) self.line_edit_regedit_name.setText(self.username) self.line_edit_regedit_password.setText(self.password) self.line_edit_regedit_password2.setText(self.rePassword) self.switch_identity.clicked.connect(self.signUpManager) self.btn_regedit_image.clicked.connect(self.setHeadPorfie) submit_button.clicked.connect(self.regedit) cancel_button.clicked.connect(self.drawer.close)
class SearchableMenuBase(ScrollableMenuBase): def __init__(self, *args, **kwargs): super(SearchableMenuBase, self).__init__(*args, **kwargs) self.search_popup = MPopup(self) self.search_popup.setVisible(False) self.search_bar = MLineEdit(self) self.search_label = QtWidgets.QLabel() self.search_bar.textChanged.connect(self.slot_search_change) self.search_bar.keyPressEvent = partial( self.search_key_event, self.search_bar.keyPressEvent ) self.aboutToHide.connect(lambda: self.search_bar.setText("")) layout = QtWidgets.QVBoxLayout() layout.addWidget(self.search_label) layout.addWidget(self.search_bar) self.search_popup.setLayout(layout) self.setProperty("search_placeholder", self.tr("Search Action...")) self.setProperty("search_label", self.tr("Search Action...")) self.setProperty("searchable", True) self.setProperty("search_re", "I") def search_key_event(self, call, event): key = event.key() # NOTES: support menu original key event on search bar if key in ( QtCore.Qt.Key_Up, QtCore.Qt.Key_Down, QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter, ): super(SearchableMenuBase, self).keyPressEvent(event) elif key == QtCore.Qt.Key_Tab: self.search_bar.setFocus() return call(event) def _set_search_label(self, value): self.search_label.setText(value) def _set_search_placeholder(self, value): self.search_bar.setPlaceholderText(value) def _set_search_re(self, value): if not isinstance(value, six.text_type): raise TypeError("`search_re` property should be a string type") def slot_search_change(self, text): flags = 0 for m in self.property("search_re") or "": flags |= getattr(re, m.upper(), 0) search_reg = re.compile(r".*%s.*" % text, flags) self._update_search(search_reg) def _update_search(self, search_reg, parent_menu=None): actions = parent_menu.actions() if parent_menu else self.actions() vis_list = [] for action in actions: menu = action.menu() if not menu: is_match = bool(re.match(search_reg, action.text())) action.setVisible(is_match) is_match and vis_list.append(action) else: is_match = bool(re.match(search_reg, menu.title())) self._update_search("" if is_match else search_reg, menu) if parent_menu: parent_menu.menuAction().setVisible(bool(vis_list) or not search_reg) def keyPressEvent(self, event): key = event.key() if self.property("searchable"): # NOTES(timmyliang): 26 character trigger search bar if 65 <= key <= 90: char = chr(key) self.search_bar.setText(char) self.search_bar.setFocus() self.search_bar.selectAll() width = self.sizeHint().width() width = width if width >= 50 else 50 offset = QtCore.QPoint(width, 0) self.search_popup.move(self.pos() + offset) self.search_popup.show() elif key == QtCore.Qt.Key_Escape: self.search_bar.setText("") self.search_popup.hide() return super(SearchableMenuBase, self).keyPressEvent(event)
class MNewTag(QWidget): """New Tag input component.""" sig_add_tag = Signal(str) def __init__(self, text="New Tag", parent=None): super(MNewTag, self).__init__(parent) self.setAttribute(Qt.WA_StyledBackground) self._add_button = MToolButton().text_beside_icon().small().svg( "add_line.svg") self._add_button.setText(text) self._add_button.clicked.connect(self._slot_show_edit) self._line_edit = MLineEdit().small() self._line_edit.returnPressed.connect(self._slot_return_pressed) self._line_edit.setVisible(False) self._line_edit.installEventFilter(self) self._main_lay = QGridLayout() self._main_lay.setContentsMargins(3, 3, 3, 3) self._main_lay.addWidget(self._add_button, 0, 0) self._main_lay.addWidget(self._line_edit, 0, 0) self.setLayout(self._main_lay) scale_x, _ = get_scale_factor() style = QssTemplate(""" MNewTag{ border: @border@unit dashed @border_color; } MNewTag MToolButton:hover{ border:none; } """) self.setStyleSheet( style.substitute( border_color=utils.fade_color(dayu_theme.secondary_text_color, "35%"), unit=dayu_theme.unit, border=1 * scale_x, )) def set_completer(self, completer): """Set the input completer""" self._line_edit.setCompleter(completer) def _slot_show_edit(self): self._line_edit.setVisible(True) self._add_button.setVisible(False) self._line_edit.setFocus(Qt.MouseFocusReason) def _slot_return_pressed(self): self._line_edit.setVisible(False) self._add_button.setVisible(True) if self._line_edit.text(): self.sig_add_tag.emit(self._line_edit.text()) self._line_edit.clear() self.update() def focusOutEvent(self, *args, **kwargs): """Override focusOutEvent to change the edit mode to button mode.""" self._line_edit.setVisible(False) self._add_button.setVisible(True) return super(MNewTag, self).focusOutEvent(*args, **kwargs) def eventFilter(self, widget, event): if widget is self._line_edit: if event.type() == QEvent.Type.KeyPress and event.key( ) == Qt.Key_Escape: self._line_edit.setVisible(False) self._add_button.setVisible(True) return super(MNewTag, self).eventFilter(widget, event)
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 ParmerPanel(QWidget): """参数面板类""" send_message_signal = Signal(str, str) def __init__(self, username): super(ParmerPanel, self).__init__() self.username = username self.id = None self.setObjectName("parmPanel") self.setupUI() dayu_theme.apply(self) # 设置UI界面 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) # 自适应 def setParam(self, type, name, path): self.type = type self.filename = name self.filepath = path # 根据图片类型设置图片 if (type == "jpg" or type == "jpeg" or type == "png"): self.setPic(path) elif (type == "obj" or type == "fbx"): self.setObjPic() filepath = os.path.dirname(path) filename = filepath.split("/")[-1] self.let_filename.setText(filename) self.let_path.setText(filepath) tags = "" assetdb = client[type] assetcol = assetdb[name] for tagdic in assetcol.find({}, {"Tag": 1}): if "Tag" in tagdic: tag = tagdic["Tag"] tags += tag + "," self.let_tag.setText(tags) #设置资产操作记录表: assetdb = client[type] assetcol = assetdb[name] assetlist = assetcol.find({}, { "UserName": 1, "Operation": 1, "Time": 1 }) #rowcount = len(assetlist) #assetlist并不是列表类型 i = 0 # for x in assetlist: # i += 1 #求得行数减一 for xdir in assetlist: if "UserName" in xdir: str1 = xdir["UserName"] newItem1 = QTableWidgetItem(str1) self.tableWidget_operationNote.setItem(i, 0, newItem1) if "Time" in xdir: str3 = xdir["Time"] newItem3 = QTableWidgetItem(str3) self.tableWidget_operationNote.setItem(i, 2, newItem3) if "Operation" in xdir: str2 = xdir["Operation"] newItem2 = QTableWidgetItem(str2) self.tableWidget_operationNote.setItem(i, 1, newItem2) i += 1 self.saveBrowseNode(self.username, name, type) #保存浏览信息到库 # 链接信号与槽函数 self.btn_export.clicked.connect( lambda: self.exportModelToHoudini(name, type, path)) self.btn_exportToMaya.clicked.connect( lambda: self.exportModelToMaya(name, type, path)) # self.saveBrowseNode(self.username, name, type) # 进度条 def slot_run(self): self.timer.start() self.auto_color_progress.setValue(0) def slot_timeout(self): if self.auto_color_progress.value() > 99: self.timer.stop() else: self.auto_color_progress.setValue( self.auto_color_progress.value() + 1) def setPic(self, path): pixmap = QPixmap(path) self.label_filePic.setPixmap(pixmap) self.label_filePic.setScaledContents(True) def setObjPic(self): """加载的是obj模型,设置obj的图片""" pixmap = QPixmap(file_path + r"\res\image\objimg.jpg") self.label_filePic.setPixmap(pixmap) self.label_filePic.setScaledContents(True) def saveBrowseNode(self, username, filename, type): RTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) #将浏览信息存入用户数据库 col = userdb[username] dict = {"Operation": "Browse", "Time": RTime, "FileName": filename} col.insert_one(dict) #将浏览信息存入资产数据库 assetdb = client[type] assetcol = assetdb[filename] adict = {"UserName": username, "Time": RTime, "Operation": "Browse"} assetcol.insert_one(adict) def exportModelToHoudini(self, filename, type, path): try: import hrpyc connection, hou = hrpyc.import_remote_module() name = filename.split(".")[0] if (type == "obj" or type == "fbx"): print("exportModelHoudiniOBJ") geo = hou.node('/obj').createNode('geo', name) fileNode = geo.createNode('file', name) fileNode.parm('file').set(path) prinShaderNode = hou.node('/mat').createNode( 'principledshader', name) prinShaderNode.parm('basecolor_useTexture').set(1) materialNode = geo.createNode('material', name + "_material") materialNode.parm('shop_materialpath1').set("/mat/" + name) materialNode.setInput(0, fileNode) materialNode.moveToGoodPosition() materialNode.setDisplayFlag(1) if (type == "jpg" or type == "jpeg"): try: print("exportModelHoudiniJPG") # 路径不能有中文 imgNode = hou.node('/img').createNode('img', "comp1") imgNode = hou.node('/img/comp1').createNode('file', name) # fileNode = imgNode.createNode('file', name) imgNode.parm('filename1').set(path) except: print("ExportPictureFail") #保存导出记录到资产数据库 RTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) assetdb = client[type] assetcol = assetdb[filename] adict = { "UserName": self.username, "Time": RTime, "Operation": "Export" } assetcol.insert_one(adict) # 保存导出记录到用户数据库 usercol = userdb[self.username] adict = { "FileName": filename, "Time": RTime, "Operation": "Export" } usercol.insert_one(adict) except: self.slot_show_message(MMessage.info, (u'导出失败!请确认Houdini是否配置成功或启动。')) print(path) print(type) def exportModelToMaya(self, filename, type, path): if type == "obj" or type == "fbx": print("ExportModelToMaya") import socket try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1', 7001)) #s.send('print("HelloWord!!!!!!!!!!!!");') name = filename.split(".")[0] command0 = "import maya.cmds as mc;" command1 = "imported_objects = mc.file(r'" + path + "\', ns='ns', i=True, rnn=True);" command2 = "transforms = mc.ls(imported_objects, type='transform');" command = command0 + command1 + command2 s.send(command) except: self.slot_show_message(MMessage.info, (u'导出失败!请确认Maya是否配置成功或启动。')) print(path) print(type) else: print("This can't export to Maya") def saveExportModelNode(self, username, filename, type): RTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) # 将浏览信息存入用户数据库 col = userdb[username] dict = {"Operation": "Export", "Time": RTime, "FileName": filename} col.insert_one(dict) # 将浏览信息存入资产数据库 assetdb = client[type] assetcol = assetdb[filename] adict = {"UserName": username, "Time": RTime, "Operation": "Export"} assetcol.insert_one(adict) def reviseTag(self): if self.username != None: usercol = userdb[self.username] idlist = usercol.find({"_id": "UserID"}, {"UserID": 1}) for iddir in idlist: self.id = iddir["UserID"] if self.id != "管理员": self.send_message_signal.emit("warnning", u"只有管理员才可以修改标签") return 0 self.let_tag.setReadOnly(False) #可写入 self.btn_reviseTag.setText(u"确认修改") self.btn_reviseTag.clicked.disconnect() self.btn_reviseTag.clicked.connect(lambda: self.confirmReviseTag()) def confirmReviseTag(self): self.let_tag.setReadOnly(True) # 只读 #连接数据库 assetdb = client[self.type] assetcol = assetdb[self.filename] assetdb = client[self.type] assetcol = assetdb[self.filename] newTags = self.let_tag.text().split(",") self.oldTags = [] taglist = assetcol.find({}, {"Tag": 1}) for tag in taglist: if "Tag" in tag: self.oldTags.append(tag["Tag"]) #是否有删除标签 for oldTag in self.oldTags: delTag = True for newTag in newTags: if newTag == oldTag: delTag = False if delTag: #存在 # 删除资产库里的标签 deldir = {"Tag": oldTag} assetcol.delete_one(deldir) #删除标签文件库里对应的文件 tagfilecol = tagfiledb[oldTag] deldir = {"FileName": self.filename} tagfilecol.delete_one(deldir) #是否有新标签 for newTag in newTags: if newTag == "": continue # 是否为从未有过的标签 new = True for x in tagcol.find({}, {"Tag": 1}): # 把数据库里的标签取出 if newTag == x["Tag"]: new = False if new: newTagdir = {"Tag": newTag} tagcol.insert_one(newTagdir) # 添加到标签数据库 addTag = True for oldTag in self.oldTags: if newTag == oldTag: addTag = False if addTag: #资产库里添加新标签 adict = {"Tag": newTag} assetcol.insert_one(adict) # 标签文件库里添加对应的文件 tagfilecol = tagfiledb[newTag] deldir = {"FileName": self.filename} tagfilecol.insert_one(deldir) self.btn_reviseTag.setText(u"修改") self.send_message_signal.emit("info", u"已成功修改标签") #保存操作记录到用户数据库 RTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) usercol = userdb[self.username] adict = { "FileName": self.filename, "Time": RTime, "Operation": "EditTag" } usercol.insert_one(adict) #保存操作记录到资产数据库 RTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) adict = { "UserName": self.username, "Time": RTime, "Operation": "EditTag" } assetcol.insert_one(adict) self.btn_reviseTag.clicked.disconnect() self.btn_reviseTag.clicked.connect(lambda: self.reviseTag()) # Todo: 传入预览图路径,加载3d视口资源到3d视口 def setModelWidget(self, path): file = os.path.dirname(path) tex_type = [ 'albedo', 'bump', 'roughness', 'specular', 'opacity', 'normal', 'displacement' ] data = {} #存储贴图数据 for name in os.listdir(file): if name.split(".")[-1] == "obj" or name.split(".")[-1] == "fbx": modelpath = os.path.join(file, name).replace("\\", "/") data["model"] = modelpath elif name.split(".")[-1] == "jpg": for typ in tex_type: _typ = "_%s." % typ if _typ in name.lower(): data[typ] = os.path.join(file, name).replace("\\", "/") break import json # self.model_widget.layout().addWidget(MLabel(modelpath)) data = json.dumps(data) print data self.model_widget.loadAsset(data) # 弹出信息提示窗口 def slot_show_message(self, func, config): func(config, parent=self.parent())
class EditWidget(QWidget): send_message_signal = Signal(str, str) def __init__(self, paths, parent=None): super(EditWidget, self).__init__(parent) self.setWindowTitle(u'资产编辑器') self.paths = paths self.isLoadPic = True #导出的是图片 self._init_ui() self.setConnect() 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 setConnect(self): self.btn_ok.clicked.connect(self.on_btn_ok_click) self.btn_cancel.clicked.connect(self.on_btn_cancel_click) self.tab.tool_button_group.sig_checked_changed.connect( self.on_tab_change) def on_btn_ok_click(self): if (self.paths == []): self.send_message_signal.emit("warnning", u"请选择操作资产") self.close return if (self.lineEdit.text()) == "filepath": self.send_message_signal.emit("warnning", u"请选择导出的位置") return output = self.lineEdit.text() if self.isLoadPic == True: width = int(self.lineEdit_width.text()) height = int(self.lineEdit_height.text()) level = int(self.lineEdit_level.text()) for path in self.paths: for name in os.listdir(path): if name.split(".")[-1] == "jpg": picpath = path + "/" + name self.make_thumb(picpath, output, width, height, level) self.send_message_signal.emit("success", u"图片生成成功") else: level = int(self.MlineEdit_level.text()) for path in self.paths: for name in os.listdir(path): if name.split(".")[-1] == "obj" or name.split( ".")[-1] == "fbx": modelpath = path + "/" + name self.genteralLOD(modelpath, output, level) self.close() def on_btn_cancel_click(self): self.close() def on_tab_change(self): if self.isLoadPic == True: self.isLoadPic = False else: self.isLoadPic = True def make_thumb(self, path, output, size1=1080, size2=720, level=50): """ 缩略图生成程序 size 参数传递要生成的尺寸 返回缩略图地址 """ try: # 尝试打开文件 im = Image.open(path) except IOError: return mode = im.mode if mode not in ('L', 'RGB'): if mode == 'RGBA': # 透明图片需要加白色底 alpha = im.split()[3] bgmask = alpha.point(lambda x: 255 - x) im = im.convert('RGB') im.paste((255, 255, 255), None, bgmask) else: im = im.convert('RGB') width, height = im.size if width == height: region = im else: if width > height: delta = (width - height) / 2 box = (delta, 0, delta + height, height) else: delta = (height - width) / 2 box = (0, delta, width, delta + width) region = im.crop(box) filename = (path.split("/"))[-1] savePath = output + "//" + os.path.splitext(filename)[0] + "_thumb.jpg" # savePath = file_path + r"\res\images\thumbnail" + "_" + "%sx%s" % (str(size), str(size)) + ".jpg" thumb = region.resize((size1, size2), Image.ANTIALIAS) if (level < 0): level = 0 elif (level > 100): level = 100 thumb.save(savePath, quality=level) # 默认 JPEG 保存质量是 75, 可选值(0~100) # 生成低精度模型 def genteralLOD(self, input, output, level=50): try: import hou name = (input.split("/"))[-1] name = (name.split("."))[0] output = output + "//" + name + "_" + str(level) + ".obj" obj = hou.node("obj") geo = obj.createNode("geo") fileImport = geo.createNode("file") fileImport.parm("file").set(input) polyreduce = geo.createNode("polyreduce") polyreduce.setFirstInput(fileImport) polyreduce.parm("percentage").set(level) fileExport = geo.createNode("file") fileExport.setFirstInput(polyreduce) fileExport.parm("filemode").set(2) fileExport.parm("file").set(output) fileExport.setDisplayFlag(1) fileExport.parm("reload").pressButton() self.send_message_signal.emit("success", u"模型生成成功") except: self.send_message_signal.emit("warnning", u"该功能仅在houdini内部可以调用")
class MSequenceFile(QWidget, MFieldMixin): ''' 这个类必须依赖 DayuPath props: path: six.string_types sequence: bool ''' sig_is_sequence_changed = Signal(bool) def __init__(self, size=None, parent=None): super(MSequenceFile, self).__init__(parent) self.sequence_obj = None size = size or dayu_theme.small self._file_label = MLineEdit() self._file_label.set_dayu_size(size) self._file_label.setReadOnly(True) self._is_sequence_check_box = MCheckBox(self.tr('Sequence')) self._is_sequence_check_box.toggled.connect( functools.partial(self.setProperty, 'sequence')) self._is_sequence_check_box.toggled.connect( self.sig_is_sequence_changed) self._info_label = MLabel().secondary() self._error_label = MLabel().secondary() self._error_label.setProperty('error', True) self._error_label.setMinimumWidth(100) self._error_label.set_elide_mode(Qt.ElideMiddle) seq_lay = QHBoxLayout() seq_lay.addWidget(self._is_sequence_check_box) seq_lay.addWidget(self._info_label) seq_lay.addWidget(self._error_label) seq_lay.setStretchFactor(self._is_sequence_check_box, 0) seq_lay.setStretchFactor(self._info_label, 0) seq_lay.setStretchFactor(self._error_label, 100) self._main_lay = QVBoxLayout() self._main_lay.setContentsMargins(0, 0, 0, 0) self._main_lay.addWidget(self._file_label) self._main_lay.addLayout(seq_lay) self.setLayout(self._main_lay) self.set_sequence(True) def _set_path(self, value): path = DayuPath(value) for seq_obj in path.scan(): self.sequence_obj = seq_obj self._update_info() def set_path(self, value): self.setProperty('path', value) def set_sequence(self, value): assert isinstance(value, bool) self.setProperty('sequence', value) def _set_sequence(self, value): if value != self._is_sequence_check_box.isChecked(): # 更新来自代码 self._is_sequence_check_box.setChecked(value) self.sig_is_sequence_changed.emit(value) self._update_info() def _update_info(self): self._file_label.setProperty( 'text', self.sequence_obj if self.property('sequence') else self.property('path')) if self.sequence_obj: self._info_label.setText(u'Format: {ext} ' u'Total: {count} ' u'Range: {start}-{end}'.format( ext=self.sequence_obj.ext, count=len(self.sequence_obj.frames), start=self.sequence_obj.frames[0] if self.sequence_obj.frames else '/', end=self.sequence_obj.frames[-1] if self.sequence_obj.frames else '/')) error_info = u'Missing: {}'.format( self.sequence_obj.missing) if self.sequence_obj.missing else '' self._error_label.setText(error_info) self._error_label.setToolTip(error_info) self._info_label.setVisible(self.property('sequence')) self._error_label.setVisible(self.property('sequence'))
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)
class MItemViewSet(QtWidgets.QWidget): sig_double_clicked = QtCore.Signal(QtCore.QModelIndex) sig_left_clicked = QtCore.Signal(QtCore.QModelIndex) TableViewType = MTableView BigViewType = MBigView TreeViewType = MTreeView ListViewType = MListView def __init__(self, view_type=None, parent=None): super(MItemViewSet, self).__init__(parent) self.main_lay = QtWidgets.QVBoxLayout() self.main_lay.setSpacing(5) self.main_lay.setContentsMargins(0, 0, 0, 0) self.sort_filter_model = MSortFilterModel() self.source_model = MTableModel() self.sort_filter_model.setSourceModel(self.source_model) view_class = view_type or MItemViewSet.TableViewType self.item_view = view_class() self.item_view.doubleClicked.connect(self.sig_double_clicked) self.item_view.pressed.connect(self.slot_left_clicked) self.item_view.setModel(self.sort_filter_model) self._search_line_edit = MLineEdit().search().small() self._search_attr_button = ( MToolButton().icon_only().svg("down_fill.svg").small()) self._search_line_edit.set_prefix_widget(self._search_attr_button) self._search_line_edit.textChanged.connect( self.sort_filter_model.set_search_pattern) self._search_line_edit.setVisible(False) self._search_lay = QtWidgets.QHBoxLayout() self._search_lay.setContentsMargins(0, 0, 0, 0) self._search_lay.addStretch() self._search_lay.addWidget(self._search_line_edit) self.main_lay.addLayout(self._search_lay) self.main_lay.addWidget(self.item_view) self.setLayout(self.main_lay) @QtCore.Slot(QtCore.QModelIndex) def slot_left_clicked(self, start_index): button = QtWidgets.QApplication.mouseButtons() if button == QtCore.Qt.LeftButton: real_index = self.sort_filter_model.mapToSource(start_index) self.sig_left_clicked.emit(real_index) def set_header_list(self, header_list): self.source_model.set_header_list(header_list) self.sort_filter_model.set_header_list(header_list) self.sort_filter_model.setSourceModel(self.source_model) self.item_view.set_header_list(header_list) @QtCore.Slot() def setup_data(self, data_list): self.source_model.clear() if data_list: self.source_model.set_data_list(data_list) self.item_view.set_header_list(self.source_model.header_list) def get_data(self): return self.source_model.get_data_list() def searchable(self): """Enable search line edit visible.""" self._search_line_edit.setVisible(True) return self def insert_widget(self, widget): """Use can insert extra widget into search layout.""" self._search_lay.insertWidget(0, widget)
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)