def test_label_elide_mode(qtbot, text, elide): """Test MLabel elide mode""" main_widget = QWidget() main_widget.setGeometry(0, 0, 30, 200) main_lay = QVBoxLayout() main_widget.setLayout(main_lay) label_left = MLabel() label_left.set_elide_mode(Qt.ElideLeft) label_left.setText(text) label_right = MLabel() label_right.set_elide_mode(Qt.ElideRight) label_right.setText(text) label_center = MLabel(text) label_center.set_elide_mode(Qt.ElideMiddle) label_center.setText(text) main_lay.addWidget(label_left) main_lay.addWidget(label_right) main_lay.addWidget(label_center) qtbot.addWidget(main_widget) main_widget.show() ellipsis = u'…' if elide: assert label_left.property('text').startswith(ellipsis) assert label_right.property('text').endswith(ellipsis) center_text = label_center.property('text') assert center_text.count(ellipsis) \ and not center_text.endswith(ellipsis) else: assert label_left.property('text') == label_left.text() assert label_right.property('text') == label_right.text() assert label_center.property('text') == label_center.text() assert label_left.get_elide_mode() == Qt.ElideLeft assert label_right.get_elide_mode() == Qt.ElideRight assert label_center.get_elide_mode() == Qt.ElideMiddle
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): title_lay = QtWidgets.QGridLayout() title_lay.addWidget(MLabel("一级标题").h1(), 0, 0) title_lay.addWidget(MLabel("二级标题").h2(), 1, 0) title_lay.addWidget(MLabel("三级标题").h3(), 2, 0) title_lay.addWidget(MLabel("四级标题").h4(), 3, 0) title_lay.addWidget(MLabel("h1 Level").h1(), 0, 1) title_lay.addWidget(MLabel("h2 Level").h2(), 1, 1) title_lay.addWidget(MLabel("h3 Level").h3(), 2, 1) title_lay.addWidget(MLabel("h4 Level").h4(), 3, 1) text_type_lay = QtWidgets.QHBoxLayout() text_type_lay.addWidget(MLabel("MLabel: Normal")) text_type_lay.addWidget(MLabel("MLabel: Secondary").secondary()) text_type_lay.addWidget(MLabel("MLabel: Warning").warning()) text_type_lay.addWidget(MLabel("MLabel: Danger").danger()) disable_text = MLabel("MLabel: Disabled") disable_text.setEnabled(False) text_type_lay.addWidget(disable_text) text_attr_lay = QtWidgets.QHBoxLayout() text_attr_lay.addWidget(MLabel("MLabel: Mark").mark()) text_attr_lay.addWidget(MLabel("MLabel: Code").code()) text_attr_lay.addWidget(MLabel("MLabel: Underline").underline()) text_attr_lay.addWidget(MLabel("MLabel: Delete").delete()) text_attr_lay.addWidget(MLabel("MLabel: Strong").strong()) text_mix_lay = QtWidgets.QHBoxLayout() text_mix_lay.addWidget( MLabel("MLabel: Strong & Underline").strong().underline() ) text_mix_lay.addWidget(MLabel("MLabel: Danger & Delete").danger().delete()) text_mix_lay.addWidget(MLabel("MLabel: Warning & Strong").warning().strong()) text_mix_lay.addWidget(MLabel("MLabel: H4 & Mark").h4().mark()) data_bind_lay = QtWidgets.QHBoxLayout() data_bind_label = MLabel() button = MPushButton(text="Random An Animal").primary() button.clicked.connect(self.slot_change_text) data_bind_lay.addWidget(data_bind_label) data_bind_lay.addWidget(button) data_bind_lay.addStretch() self.register_field("show_text", "Guess") self.bind("show_text", data_bind_label, "text") lay_elide = QtWidgets.QVBoxLayout() label_none = MLabel( "This is a elide NONE mode label. " "Ellipsis should NOT appear in the text." ) label_left = MLabel( "This is a elide LEFT mode label. " "The ellipsis should appear at the beginning of the text. " "xiao mao xiao gou xiao ci wei" ) label_left.set_elide_mode(QtCore.Qt.ElideLeft) label_middle = MLabel( "This is a elide MIDDLE mode label. " "The ellipsis should appear in the middle of the text. " "xiao mao xiao gou xiao ci wei" ) label_middle.set_elide_mode(QtCore.Qt.ElideMiddle) label_right = MLabel() label_right.setText( "This is a elide RIGHT mode label. " "The ellipsis should appear at the end of the text. " "Some text to fill the line bala bala bala." ) label_right.set_elide_mode(QtCore.Qt.ElideRight) lay_elide.addWidget(label_none) lay_elide.addWidget(label_left) lay_elide.addWidget(label_middle) lay_elide.addWidget(label_right) hyper_label_1 = MLabel() hyper_label_1.set_link("https://baidu.com", text="baidu") hyper_label_2 = MLabel() hyper_label_2.set_link("https://baidu.com") hyper_label_3 = MLabel() hyper_label_3.set_link( "https://github.com/phenom-films/dayu_widgets", text="Dayu Widgets" ) hyperlink_lay = QtWidgets.QVBoxLayout() hyperlink_lay.addWidget(hyper_label_1) hyperlink_lay.addWidget(hyper_label_2) hyperlink_lay.addWidget(hyper_label_3) # hyperlink_lay.addWidget() main_lay = QtWidgets.QVBoxLayout() main_lay.addWidget(MDivider("different level")) main_lay.addLayout(title_lay) main_lay.addWidget(MDivider("different type")) main_lay.addLayout(text_type_lay) main_lay.addWidget(MDivider("different property")) main_lay.addLayout(text_attr_lay) main_lay.addWidget(MDivider("mix")) main_lay.addLayout(text_mix_lay) # main_lay.addWidget(MDivider('data bind')) # main_lay.addLayout(data_bind_lay) main_lay.addWidget(MDivider("elide mode")) main_lay.addLayout(lay_elide) main_lay.addWidget(MDivider("hyperlink")) main_lay.addLayout(hyperlink_lay) main_lay.addStretch() self.setLayout(main_lay)
def _init_ui(self): browser_1 = MClickBrowserFilePushButton( text='Browser File PushButton').primary() browser_2 = MClickBrowserFolderPushButton( text='Browser Folder PushButton') browser_2.setIcon(MIcon('upload_line.svg')) browser_3 = MClickBrowserFilePushButton(text='Browser Multi Files', multiple=True).primary() lay_1 = QHBoxLayout() lay_1.addWidget(browser_1) lay_1.addWidget(browser_2) lay_1.addWidget(browser_3) browser_4 = MClickBrowserFileToolButton().huge() label_4 = MLabel() label_4.set_elide_mode(Qt.ElideMiddle) browser_4.sig_file_changed.connect(label_4.setText) browser_5 = MClickBrowserFolderToolButton().huge() label_5 = MLabel() label_5.set_elide_mode(Qt.ElideMiddle) browser_5.sig_folder_changed.connect(label_5.setText) lay_2 = QHBoxLayout() lay_2.addWidget(label_4) lay_2.addWidget(browser_4) lay_2.addWidget(label_5) lay_2.addWidget(browser_5) browser_6 = MDragFileButton(text='Click or drag file here') browser_6.set_dayu_svg('attachment_line.svg') label_6 = MLabel() label_6.set_elide_mode(Qt.ElideMiddle) browser_6.sig_file_changed.connect(label_6.setText) browser_7 = MDragFolderButton() label_7 = MLabel() label_7.set_elide_mode(Qt.ElideRight) browser_7.sig_folder_changed.connect(label_7.setText) lay_3 = QGridLayout() lay_3.addWidget(browser_6, 2, 0) lay_3.addWidget(browser_7, 2, 1) lay_3.addWidget(label_6, 3, 0) lay_3.addWidget(label_7, 3, 1) browser_8 = MDragFileButton(text='Click or drag media file here', multiple=False) browser_8.set_dayu_svg('media_line.svg') browser_8.set_dayu_filters(['.mov', '.mp4']) browser_8_label = MLabel() browser_8_label.set_elide_mode(Qt.ElideRight) self.register_field('current_file', '') self.bind('current_file', browser_8, 'dayu_path', signal='sig_file_changed') self.bind('current_file', browser_8_label, 'text') main_lay = QVBoxLayout() main_lay.addWidget(MDivider('MClickBrowser*PushButton')) main_lay.addLayout(lay_1) main_lay.addWidget(MDivider('MClickBrowser*ToolButton')) main_lay.addLayout(lay_2) main_lay.addWidget(MDivider('MDragBrowser*ToolButton')) main_lay.addLayout(lay_3) main_lay.addWidget(MDivider('data bind')) main_lay.addWidget(browser_8) main_lay.addWidget(browser_8_label) main_lay.addStretch() self.setLayout(main_lay)
def _init_ui(self): browser_1 = MClickBrowserFilePushButton( text="Browser File PushButton").primary() browser_2 = MClickBrowserFolderPushButton( text="Browser Folder PushButton") browser_2.setIcon(MIcon("upload_line.svg")) browser_3 = MClickBrowserFilePushButton(text="Browser Multi Files", multiple=True).primary() lay_1 = QtWidgets.QHBoxLayout() lay_1.addWidget(browser_1) lay_1.addWidget(browser_2) lay_1.addWidget(browser_3) browser_4 = MClickBrowserFileToolButton().huge() label_4 = MLabel() label_4.set_elide_mode(QtCore.Qt.ElideMiddle) browser_4.sig_file_changed.connect(label_4.setText) browser_5 = MClickBrowserFolderToolButton().huge() label_5 = MLabel() label_5.set_elide_mode(QtCore.Qt.ElideMiddle) browser_5.sig_folder_changed.connect(label_5.setText) lay_2 = QtWidgets.QHBoxLayout() lay_2.addWidget(label_4) lay_2.addWidget(browser_4) lay_2.addWidget(label_5) lay_2.addWidget(browser_5) browser_6 = MDragFileButton(text="Click or drag file here") browser_6.set_dayu_svg("attachment_line.svg") label_6 = MLabel() label_6.set_elide_mode(QtCore.Qt.ElideMiddle) browser_6.sig_file_changed.connect(label_6.setText) browser_7 = MDragFolderButton() label_7 = MLabel() label_7.set_elide_mode(QtCore.Qt.ElideRight) browser_7.sig_folder_changed.connect(label_7.setText) lay_3 = QtWidgets.QGridLayout() lay_3.addWidget(browser_6, 2, 0) lay_3.addWidget(browser_7, 2, 1) lay_3.addWidget(label_6, 3, 0) lay_3.addWidget(label_7, 3, 1) browser_8 = MDragFileButton(text="Click or drag media file here", multiple=False) browser_8.set_dayu_svg("media_line.svg") browser_8.set_dayu_filters([".mov", ".mp4"]) browser_8_label = MLabel() browser_8_label.set_elide_mode(QtCore.Qt.ElideRight) self.register_field("current_file", "") self.bind("current_file", browser_8, "dayu_path", signal="sig_file_changed") self.bind("current_file", browser_8_label, "text") main_lay = QtWidgets.QVBoxLayout() main_lay.addWidget(MDivider("MClickBrowser*PushButton")) main_lay.addLayout(lay_1) main_lay.addWidget(MDivider("MClickBrowser*ToolButton")) main_lay.addLayout(lay_2) main_lay.addWidget(MDivider("MDragBrowser*ToolButton")) main_lay.addLayout(lay_3) main_lay.addWidget(MDivider("data bind")) main_lay.addWidget(browser_8) main_lay.addWidget(browser_8_label) main_lay.addStretch() self.setLayout(main_lay)
class MMeta(QWidget): def __init__(self, cover=None, avatar=None, title=None, description=None, extra=False, parent=None): super(MMeta, self).__init__(parent) self.setAttribute(Qt.WA_StyledBackground) self._cover_label = QLabel() self._avatar = MAvatar() self._title_label = MLabel().h4() self._description_label = MLabel().secondary() self._description_label.setWordWrap(True) self._description_label.set_elide_mode(Qt.ElideRight) self._title_layout = QHBoxLayout() self._title_layout.addWidget(self._title_label) self._title_layout.addStretch() self._extra_button = MToolButton( parent=self).icon_only().svg('more.svg') self._title_layout.addWidget(self._extra_button) self._extra_button.setVisible(extra) content_lay = QFormLayout() content_lay.setContentsMargins(5, 5, 5, 5) content_lay.addRow(self._avatar, self._title_layout) content_lay.addRow(self._description_label) self._button_layout = QHBoxLayout() main_lay = QVBoxLayout() main_lay.setSpacing(0) main_lay.setContentsMargins(1, 1, 1, 1) main_lay.addWidget(self._cover_label) main_lay.addLayout(content_lay) main_lay.addLayout(self._button_layout) main_lay.addStretch() self.setLayout(main_lay) self._cover_label.setFixedSize(QSize(200, 200)) # self.setFixedWidth(200) def get_more_button(self): return self._extra_button def setup_data(self, data_dict): if data_dict.get('title'): self._title_label.setText(data_dict.get('title')) self._title_label.setVisible(True) else: self._title_label.setVisible(False) if data_dict.get('description'): self._description_label.setText(data_dict.get('description')) self._description_label.setVisible(True) else: self._description_label.setVisible(False) if data_dict.get('avatar'): self._avatar.set_dayu_image(data_dict.get('avatar')) self._avatar.setVisible(True) else: self._avatar.setVisible(False) if data_dict.get('cover'): fixed_height = self._cover_label.width() self._cover_label.setPixmap( data_dict.get('cover').scaledToWidth(fixed_height, Qt.SmoothTransformation)) self._cover_label.setVisible(True) else: self._cover_label.setVisible(False)
def _init_ui(self): title_lay = QGridLayout() title_lay.addWidget(MLabel(u'一级标题').h1(), 0, 0) title_lay.addWidget(MLabel(u'二级标题').h2(), 1, 0) title_lay.addWidget(MLabel(u'三级标题').h3(), 2, 0) title_lay.addWidget(MLabel(u'四级标题').h4(), 3, 0) title_lay.addWidget(MLabel('h1 Level').h1(), 0, 1) title_lay.addWidget(MLabel('h2 Level').h2(), 1, 1) title_lay.addWidget(MLabel('h3 Level').h3(), 2, 1) title_lay.addWidget(MLabel('h4 Level').h4(), 3, 1) text_type_lay = QHBoxLayout() text_type_lay.addWidget(MLabel('MLabel: Normal')) text_type_lay.addWidget(MLabel('MLabel: Secondary').secondary()) text_type_lay.addWidget(MLabel('MLabel: Warning').warning()) text_type_lay.addWidget(MLabel('MLabel: Danger').danger()) disable_text = MLabel('MLabel: Disabled') disable_text.setEnabled(False) text_type_lay.addWidget(disable_text) text_attr_lay = QHBoxLayout() text_attr_lay.addWidget(MLabel('MLabel: Mark').mark()) text_attr_lay.addWidget(MLabel('MLabel: Code').code()) text_attr_lay.addWidget(MLabel('MLabel: Underline').underline()) text_attr_lay.addWidget(MLabel('MLabel: Delete').delete()) text_attr_lay.addWidget(MLabel('MLabel: Strong').strong()) text_mix_lay = QHBoxLayout() text_mix_lay.addWidget( MLabel('MLabel: Strong & Underline').strong().underline()) text_mix_lay.addWidget( MLabel('MLabel: Danger & Delete').danger().delete()) text_mix_lay.addWidget( MLabel('MLabel: Warning & Strong').warning().strong()) text_mix_lay.addWidget(MLabel('MLabel: H4 & Mark').h4().mark()) data_bind_lay = QHBoxLayout() data_bind_label = MLabel() button = MPushButton(text='Random An Animal').primary() button.clicked.connect(self.slot_change_text) data_bind_lay.addWidget(data_bind_label) data_bind_lay.addWidget(button) data_bind_lay.addStretch() self.register_field('show_text', 'Guess') self.bind('show_text', data_bind_label, 'text') lay_elide = QVBoxLayout() label_none = MLabel('This is a elide NONE mode label. ' 'Ellipsis should NOT appear in the text.') label_left = MLabel( 'This is a elide LEFT mode label. ' 'The ellipsis should appear at the beginning of the text. ' 'xiao mao xiao gou xiao ci wei') label_left.set_elide_mode(Qt.ElideLeft) label_middle = MLabel( 'This is a elide MIDDLE mode label. ' 'The ellipsis should appear in the middle of the text. ' 'xiao mao xiao gou xiao ci wei') label_middle.set_elide_mode(Qt.ElideMiddle) label_right = MLabel() label_right.setText( 'This is a elide RIGHT mode label. ' 'The ellipsis should appear at the end of the text. ' 'Some text to fill the line bala bala bala.') label_right.set_elide_mode(Qt.ElideRight) lay_elide.addWidget(label_none) lay_elide.addWidget(label_left) lay_elide.addWidget(label_middle) lay_elide.addWidget(label_right) main_lay = QVBoxLayout() main_lay.addWidget(MDivider('different level')) main_lay.addLayout(title_lay) main_lay.addWidget(MDivider('different type')) main_lay.addLayout(text_type_lay) main_lay.addWidget(MDivider('different property')) main_lay.addLayout(text_attr_lay) main_lay.addWidget(MDivider('mix')) main_lay.addLayout(text_mix_lay) # main_lay.addWidget(MDivider('data bind')) # main_lay.addLayout(data_bind_lay) main_lay.addWidget(MDivider('elide mode')) main_lay.addLayout(lay_elide) main_lay.addStretch() self.setLayout(main_lay)