def get_widget_from_ranking(ranking): assert isinstance(ranking, RankingItem) qual = ranking.qual.name qual_checkbox = QCheckBox(ranking.qual.get_title()) qual_checkbox.setFixedWidth(50) qual_checkbox.setObjectName(qual + '_checkbox') type_combo = AdvComboBox() type_combo.addItems({_('Rank'), _('Max place'), _('Result time')}) type_combo.setFixedWidth(150) type_combo.setObjectName(qual + '_combo') max_place = QSpinBox() max_place.setValue(0) max_place.setFixedWidth(70) max_place.setObjectName(qual + '_place') max_time = QTimeEdit() max_time.setFixedWidth(70) max_time.setDisplayFormat("hh:mm:ss") max_time.setObjectName(qual + '_time') def select_type(): text = type_combo.currentText() max_place.setVisible(text == _('Max place')) max_time.setVisible(text == _('Result time')) def set_enabled(): flag = qual_checkbox.isChecked() type_combo.setEnabled(flag) max_place.setEnabled(flag) max_time.setEnabled(flag) type_combo.currentIndexChanged.connect(select_type) qual_checkbox.stateChanged.connect(set_enabled) if ranking.use_scores: type_combo.setCurrentText(_('Rank')) elif ranking.max_place: type_combo.setCurrentText(_('Max place')) max_place.setValue(ranking.max_place) else: type_combo.setCurrentText(_('Result time')) max_time.setTime(time_to_qtime(ranking.max_time)) qual_checkbox.setChecked(ranking.is_active) select_type() set_enabled() layout = QHBoxLayout() layout.addWidget(qual_checkbox) layout.addWidget(type_combo) layout.addWidget(max_place) layout.addWidget(max_time) return layout
class VCTimeCounter(QWidget): timeChanged = pyqtSignal(QTime) def __init__(self, parent=None): super(VCTimeCounter, self).__init__(parent) self.parent = parent self.timeedit = QTimeEdit(QTime(0, 0)) self.timeedit.setObjectName('timeCounter') self.timeedit.setStyle(QStyleFactory.create('Fusion')) self.timeedit.setFrame(False) self.timeedit.setDisplayFormat('hh:mm:ss.zzz') self.timeedit.timeChanged.connect(self.timeChangeHandler) separator = QLabel('/') separator.setObjectName('timeSeparator') self.duration = QLabel('00:00:00.000') self.duration.setObjectName('timeDuration') layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(5) layout.addWidget(self.timeedit) layout.addWidget(separator) layout.addWidget(self.duration) self.setLayout(layout) def setRange(self, minval: str, maxval: str) -> None: self.timeedit.setTimeRange(QTime.fromString(minval, 'hh:mm:ss.zzz'), QTime.fromString(maxval, 'hh:mm:ss.zzz')) def setMinimum(self, val: str = None) -> None: if val is None: self.timeedit.setMinimumTime(QTime(0, 0)) else: self.timeedit.setMinimumTime(QTime.fromString(val, 'hh:mm:ss.zzz')) def setMaximum(self, val: str) -> None: self.timeedit.setMaximumTime(QTime.fromString(val, 'hh:mm:ss.zzz')) def setTime(self, time: str) -> None: self.timeedit.setTime(QTime.fromString(time, 'hh:mm:ss.zzz')) def setDuration(self, time: str) -> None: self.duration.setText(time) self.setMaximum(time) def clearFocus(self) -> None: self.timeedit.clearFocus() def hasFocus(self) -> bool: if self.timeedit.hasFocus(): return True return super(VCTimeCounter, self).hasFocus() def reset(self) -> None: self.timeedit.setTime(QTime(0, 0)) self.setDuration('00:00:00.000') def setReadOnly(self, readonly: bool) -> None: self.timeedit.setReadOnly(readonly) if readonly: self.timeedit.setButtonSymbols(QAbstractSpinBox.NoButtons) else: self.timeedit.setButtonSymbols(QAbstractSpinBox.UpDownArrows) @pyqtSlot(QTime) def timeChangeHandler(self, newtime: QTime) -> None: if self.timeedit.hasFocus(): self.timeChanged.emit(newtime)
class TimeItem(QListWidgetItem): def __init__(self, parent=None, *args, **kwargs): super().__init__(parent) self.parent = parent def setupUi(self, *args, **kwargs): self.widget = QWidget() try: self.setSizeHint(QSize(self.parent.width() - 20, 40)) self.widget.setGeometry( QtCore.QRect(0, 0, self.parent.width() - 20, 40)) except Exception as e: logging.warning(e) self.setSizeHint(QSize(80, 60)) self.widget.setObjectName("Form") self.horizontalLayoutWidget = QtWidgets.QWidget(self.widget) self.horizontalLayoutWidget.setGeometry( QtCore.QRect(10, 0, self.widget.width() - 10, self.widget.height())) self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") self.horizontalLayout = QtWidgets.QHBoxLayout( self.horizontalLayoutWidget) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setObjectName("horizontalLayout") self.radioButton = QtWidgets.QRadioButton(self.horizontalLayoutWidget) self.radioButton.setObjectName("radioButton") self.radioButton.setText('禁用') self.horizontalLayout.addWidget(self.radioButton) self.lineEdit = QtWidgets.QLineEdit(self.horizontalLayoutWidget) self.lineEdit.setObjectName("lineEdit") self.lineEdit.setText('abc') self.horizontalLayout.addWidget(self.lineEdit) self.comboBox = QtWidgets.QComboBox(self.horizontalLayoutWidget) self.comboBox.setObjectName("comboBox") self.comboBoxSel = {'间隔': "interval", '周期': 'cron', '仅一次': 'date'} for sel in self.comboBoxSel: self.comboBox.addItem(sel) self.horizontalLayout.addWidget(self.comboBox) self.timeEdit = QTimeEdit(self.horizontalLayoutWidget) self.timeEdit.setObjectName("timeEdit") self.timeEdit.setDisplayFormat('hh:mm:ss') self.horizontalLayout.addWidget(self.timeEdit) QtCore.QMetaObject.connectSlotsByName(self.widget) # 设置配置 try: self.set_data(info=kwargs['info']) except Exception as e: self.set_data(info=None) # 设置交互 self.set_connect() return self.widget def set_data(self, *args, **kwargs): if 'info' in kwargs.keys() and kwargs['info']: self.info = kwargs['info'] else: self.info = { "id": "luck", "trigger": "interval", "time": 3600, "is_action": False, "mission_name": 'new mission' } self.set_ui() def set_ui(self): try: self.radioButton.setChecked(self.info['is_action']) self.radio_check() self.lineEdit.setText(self.info['mission_name']) index = list(self.comboBoxSel.values()).index(self.info['trigger']) self.comboBox.setCurrentIndex(index) # to do if 'interval' == self.info['trigger']: self.timeEdit.setTime(QTime(0, 0).addSecs(self.info['time'])) elif 'date' == self.info['trigger']: logging.warning('暂不支持 date 设置') elif 'cron' == self.info['trigger']: logging.warning('暂不支持 cron 设置') except Exception as e: logging.warning(e) def update_info(self) -> bool: flag = False if 'luck' == self.info['id']: self.info['id'] = cryptograph_text(str(int(time.time()))) index = self.comboBox.currentIndex() self.info['trigger'] = list(self.comboBoxSel.values())[index] self.info['is_action'] = self.radioButton.isChecked() self.info['mission_name'] = self.lineEdit.text() aps_time = self.timeEdit.time() self.info['time'] = aps_time.hour() * 3600 + aps_time.minute( ) * 60 + aps_time.second() # 新任务无sign if 'sign' not in self.info.keys(): self.info['createtime'] = get_full_datetime() self.info['sign'] = cryptograph_text( json.dumps(self.info, ensure_ascii=False)) flag = True # 旧任务重新校验 else: sign = self.info.pop('sign') if sign != cryptograph_text( json.dumps(self.info, ensure_ascii=False)): self.info['sign'] = cryptograph_text( json.dumps(self.info, ensure_ascii=False)) flag = True else: self.info['sign'] = sign return flag def set_connect(self): self.radioButton.clicked.connect(self.radio_check) def radio_check(self): if self.radioButton.isChecked(): self.radioButton.setStyleSheet('QRadioButton{color:green}') self.radioButton.setText('启用') else: self.radioButton.setStyleSheet('QRadioButton{color:red}') self.radioButton.setText('禁用')