def __set_text_edit_color(self, state, sender: QLineEdit): if state == QValidator.Acceptable: color = '#c4df9b' # green else: color = QtCore.Qt.BackgroundRole sender.setStyleSheet('QLineEdit { background-color: %s }' % color)
class Borda(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent=parent) self.st = QStringListModel self.linha = QLineEdit() self.linha.setStyleSheet(self.configurarLinha()) def configurarLinha(self): self.st = ("border-right: 10px solid blue;" + "border-top: 10px solid blue;" + "border-left: 10px solid blue;" + "border-bottom: 10px solid blue;") return self.st
class InputLine(QWidget): HEIGHT = 30 LABEL_WIDTH = 170 INPUT_TEXT_WIDTH = 200 BUTTON_WIDTH = 100 BUTTON_BLOCK_X = 380 ELEMENT_GAP = 5 ERROR_WIDTH = 250 ERROR_X = 595 def __init__(self, parent): super().__init__(parent) self.initUI() def initUI(self): component_stylesheet = """ .QPushButton { font-weight: bold; font-size: 13px; background-color:#E0E0E0; } .QPushButton:pressed { background-color:#CCCCCC; } .QLabel { padding-top: 7px; font-weight: bold; font-size: 14px; } .QLineEdit { font-weight: bold; font-size: 14px; } .QLabel#error { color: red; font-size: 12px; font-style: italic; padding-top: 0px; padding-left: 6px; } """ self.label = QLabel("", self) self.label.setStyleSheet(component_stylesheet) self.label.setAlignment(Qt.AlignRight) self.label.resize(InputLine.LABEL_WIDTH, InputLine.HEIGHT) self.label.move(0, 0) self.text = QLineEdit(self) self.text.setStyleSheet(component_stylesheet) self.text.resize(InputLine.INPUT_TEXT_WIDTH, InputLine.HEIGHT) self.text.move(InputLine.LABEL_WIDTH + InputLine.ELEMENT_GAP, 0) self.ok = QPushButton("OK", self) self.ok.setStyleSheet(component_stylesheet) self.ok.resize(InputLine.BUTTON_WIDTH, InputLine.HEIGHT) self.ok.move(InputLine.BUTTON_BLOCK_X, 0) self.cancel = QPushButton("Cancel", self) self.cancel.setStyleSheet(component_stylesheet) self.cancel.resize(InputLine.BUTTON_WIDTH, InputLine.HEIGHT) self.cancel.move(InputLine.BUTTON_BLOCK_X + InputLine.BUTTON_WIDTH + InputLine.ELEMENT_GAP, 0) self.error = QLabel("", self) self.error.setObjectName("error") self.error.setStyleSheet(component_stylesheet) self.error.resize(InputLine.ERROR_WIDTH, InputLine.HEIGHT) self.error.move(InputLine.ERROR_X, 0) """ listeners which control what happens on ok an cancel button presses """ def addOkListener(self, onOkEvent): self.ok.clicked.connect(onOkEvent) def addCancelListener(self, onCancelEvent): self.cancel.clicked.connect(onCancelEvent) """ utility methods of the widget """ def getText(self): return self.text.text() def setText(self, text): self.text.setText(text) def setLabelText(self, text): self.label.setText(text) def setErrorText(self, text): self.error.setText(text)
class Index(QWidget): show_mainindex_sg = pyqtSignal(int, str) show_register_sg = pyqtSignal() def __init__(self, parent=None): super(Index, self).__init__(parent) self.desktop = QApplication.desktop() self.screenRect = self.desktop.screenGeometry() self.h = self.screenRect.height() self.w = self.screenRect.width() self.xr = self.w / 930 self.yr = self.h / 640 self.zr = min(self.xr, self.yr) self.top_wi = QWidget(self) self.logo_la = QLabel(self.top_wi) self.ind_wi = QWidget(self) self.login_but = QPushButton(self.ind_wi) self.joke_but = QPushButton(self.ind_wi) self.register_but = QPushButton(self.ind_wi) self.imp_la = QLabel(self.ind_wi) self.account_le = QLineEdit(self.ind_wi) self.psw_le = QLineEdit(self.ind_wi) self.loading = QLabel(self) self.gif = QMovie('./resource/image/load.gif') self.set_ui() with open('index.qss', 'r') as f: self.setStyleSheet(f.read()) def set_ui(self): self.setWindowTitle('Login') self.setObjectName('index') self.resize(self.w, self.h) self.top_wi.setObjectName('top') self.top_wi.resize(930 * self.xr, 95 * self.yr) self.logo_la.setObjectName('logo') self.logo_la.resize(65 * self.xr, 65 * self.zr) self.logo_la.move(29 * self.xr, 16 * self.yr) effect = QGraphicsDropShadowEffect() effect.setOffset(10, 10) effect.setColor(QColor(0, 0, 0, 80)) effect.setBlurRadius(20) self.ind_wi.setObjectName('login') self.ind_wi.resize(327 * self.xr, 388 * self.yr) self.ind_wi.move(300 * self.xr, 150 * self.yr) self.ind_wi.setGraphicsEffect(effect) self.joke_but.setObjectName('joke') self.joke_but.resize(130 * self.xr, 30 * self.yr) self.joke_but.move(76 * self.xr, 234 * self.yr) self.joke_but.setFlat(True) self.joke_but.setText('忘记密码?我也没办法') self.login_but.setObjectName('button') self.login_but.move(64 * self.xr, 260 * self.yr) self.login_but.resize(202 * self.xr, 45 * self.yr) self.login_but.setText('登陆') self.login_but.clicked.connect(self.login) self.register_but.setObjectName('button') self.register_but.move(64 * self.xr, 315 * self.yr) self.register_but.resize(202 * self.xr, 45 * self.yr) self.register_but.setText('注册') self.register_but.clicked.connect(self.show_register) self.imp_la.setObjectName('imp_label') self.imp_la.resize(100 * self.zr, 100 * self.zr) self.imp_la.move(115 * self.xr + 100 * (self.xr - self.zr) / 2, 15 * self.yr) self.imp_la.setStyleSheet('border-radius:{}px;'.format(self.zr * 49)) self.account_le.setObjectName('input') self.account_le.setTextMargins(20, 0, 0, 0) self.account_le.resize(213 * self.xr, 45 * self.yr) self.account_le.move(59 * self.xr, 126 * self.yr) self.account_le.setPlaceholderText('账号') self.psw_le.setObjectName('input') self.psw_le.setTextMargins(20, 0, 0, 0) self.psw_le.resize(213 * self.xr, 45 * self.yr) self.psw_le.move(59 * self.xr, 181 * self.yr) self.psw_le.setPlaceholderText('密码') self.psw_le.setEchoMode(QLineEdit.Password) self.loading.setObjectName('load') self.loading.resize(self.xr * 150, self.yr * 150) self.loading.move(self.xr * 760, self.yr * 500) self.loading.setScaledContents(True) self.loading.setMovie(self.gif) self.gif.start() self.ind_wi.setStyleSheet('#input{border-radius:' + str(self.zr * 20) + 'px;}' + '#button{border-radius:' + str( self.zr * 20) + 'px;' + 'font-size:' + str(int(self.zr * 18)) + 'px;}') def login(self): account_p = self.account_le.text() psw_p = self.psw_le.text() dic = login(account_p, psw_p) if dic['status'] == 0: self.show_mainindex_sg.emit(dic['data']['user_id'], dic['data']['token']) elif dic['status'] == 1: self.account_le.clear() self.psw_le.clear() self.account_le.setStyleSheet('border:4px solid;border-color:red;') self.account_le.setPlaceholderText('网络超时') else: self.account_le.clear() self.psw_le.clear() self.account_le.setStyleSheet('border:4px solid;border-color:red;') self.account_le.setPlaceholderText('账号不存在或密码错误') def show_register(self): self.show_register_sg.emit()
class Search(QWidget): search_sg = pyqtSignal(dict) back_sg = pyqtSignal() def __init__(self, parent=None): super(Search, self).__init__(parent) self.desktop = QApplication.desktop() self.screenRect = self.desktop.screenGeometry() self.h = self.screenRect.height() self.w = self.screenRect.width() self.xr = self.w / 930 self.yr = self.h / 640 self.zr = min(self.xr, self.yr) self.token = '' self.head = QLabel(self) self.search = QLineEdit(self) self.butt = QPushButton(self) self.but = QPushButton(self) self.set_ui() def set_ui(self): self.search.setObjectName('search') self.search.resize(self.xr * 520, self.yr * 40) self.search.move(self.xr * 205, self.yr * 300) self.search.setPlaceholderText('请输入战局ID') self.search.setTextMargins(20, 0, 0, 0) self.search.setStyleSheet('font-size:{}px;border-radius:{}px;'.format(int(self.zr * 16), self.zr * 15)) self.head.setObjectName('head') self.head.resize(self.xr * 200, self.yr * 50) self.head.move(self.xr * 360, self.yr * 240) self.head.setText('搜索战局') self.head.setAlignment(Qt.AlignCenter) self.head.setStyleSheet('font-size:{}px;'.format(int(self.zr * 25))) self.but.setObjectName('button') self.but.resize(self.xr * 130, self.yr * 40) self.but.move(self.xr * 480, self.yr * 380) self.but.setText('返回') self.but.clicked.connect(self.back_for) self.butt.setObjectName('button') self.butt.resize(self.xr * 130, self.yr * 40) self.butt.move(self.xr * 320, self.yr * 380) self.butt.setText('搜索') self.butt.clicked.connect(self.search_for) self.setStyleSheet('#button{font-size:' + str(int(self.zr * 18)) + 'px;border-radius:' + str( self.zr * 15) + 'px;background-color:#333643;color:#ffffff;}#button:hover{background-color:#575B6E;}#button:pressed{background-color:#202129;}') def search_for(self): id_p = self.search.text() self.search.clear() dic = find_info(id_p, self.token) # print(dic) if dic['status'] == 0: self.search_sg.emit(dic) else: self.search.setStyleSheet( 'font-size:{}px;border-radius:{}px;border:4px solid;border-color:red'.format(int(self.zr * 16), self.zr * 15)) self.search.clear() self.search.setPlaceholderText('ID不存在') def back_for(self): self.back_sg.emit() def get_token(self, t): self.token = t
class PackageWidget(QWidget): def __init__(self, main, channels): super(PackageWidget, self).__init__() self.setObjectName("PackageWidget") self.main_win = main self.game = self.main_win.games[self.main_win.game_index] self.channels = channels self.check_boxs = [] self.indexs = [] self.lbps = {} self.progress = None self.monitor = PackageMonitor() self.monitor.signal.connect(self.complete) v_layout = QVBoxLayout() h_layout1 = QHBoxLayout() cbox_widget = QWidget() v_layout1 = QVBoxLayout() self.all_selected_cbox = QCheckBox("全 选") self.all_selected_cbox.stateChanged.connect(self.select_all) v_layout1.addWidget(self.all_selected_cbox) for channel in self.channels: check_box = QCheckBox(channel['channelId']) check_box.setFixedWidth(100) v_layout1.addSpacing(10) v_layout1.addWidget(check_box) self.check_boxs.append(check_box) cbox_widget.setLayout(v_layout1) channel_list_area = QScrollArea() channel_list_area.setWidget(cbox_widget) h_layout1.addWidget(channel_list_area, 1) self.qpb_list_widget = QListWidget() self.qpb_list_widget.setSelectionMode( QAbstractItemView.SingleSelection) self.qpb_list_widget.itemDoubleClicked.connect(self.select_list) h_layout1.addWidget(self.qpb_list_widget, 5) v_layout.addLayout(h_layout1) h_layout2 = QHBoxLayout() self.back_btn = QPushButton("返 回") self.back_btn.setFixedWidth(100) self.back_btn.clicked.connect(self.back) h_layout2.addWidget(self.back_btn, alignment=Qt.AlignLeft | Qt.AlignBottom) h_layout2.addSpacing(100) select_apk_btn = QPushButton("选择母包:") select_apk_btn.clicked.connect(self.select_apk) h_layout2.addWidget(select_apk_btn) self.apk_path = QLineEdit() self.apk_path.setPlaceholderText("母包路径") h_layout2.addWidget(self.apk_path) h_layout2.addSpacing(100) self.pack_btn = QPushButton("打 包") self.pack_btn.setFixedWidth(100) self.pack_btn.clicked.connect(self.click) h_layout2.addWidget(self.pack_btn, alignment=Qt.AlignRight | Qt.AlignBottom) v_layout.addLayout(h_layout2) self.setLayout(v_layout) def select_list(self): index = self.qpb_list_widget.currentIndex().row() channel_id = self.channels[self.indexs[index]]['channelId'] success = self.lbps[channel_id]['success'] dest_apk_dir = Utils.get_full_path('output/' + self.game['id'] + '/' + channel_id) if success: os.startfile(dest_apk_dir) else: QMessageBox.warning(self, "警告", "打包成功了吗?") def back(self): self.monitor.deleteLater() self.main_win.set_channel_list_widget(self.channels) def select_apk(self): fname = QFileDialog.getOpenFileName( self, '选择母包', os.path.join(os.path.expanduser('~'), "Desktop"), ("Apk (*.apk)")) if fname[0]: self.apk_path.setStyleSheet("font-size:12px") self.apk_path.setText(fname[0]) def select_all(self): if self.all_selected_cbox.isChecked(): for cbox in self.check_boxs: cbox.setChecked(True) else: for cbox in self.check_boxs: cbox.setChecked(False) def click(self): if self.pack_btn.text() == "打 包": self.package() elif self.pack_btn.text() == "取 消": self.cancel() def package(self): # 清空上次打包完成后的进度条显示列表 count = self.qpb_list_widget.count() if count > 0: for i in range(count): item = self.qpb_list_widget.takeItem(0) del item self.indexs = [] for i in range(len(self.channels)): if self.check_boxs[i].isChecked(): self.indexs.append(i) if len(self.indexs) <= 0: QMessageBox.warning(self, "警告", "请选择需要打包的渠道!") return if self.apk_path.text().strip() == "": QMessageBox.warning(self, "警告", "请上传母包!") return apk = self.apk_path.text().strip().replace('\\', '/') for i in self.indexs: lbp = {} lbp['success'] = False self.set_qpb_list_item(self.channels[i], lbp) runnable = PackRunnable(self.game, self.channels[i], apk) runnable.signal.signal.connect(self.set_value) self.monitor.add_runnable(runnable) lbp['runnable'] = runnable self.lbps[self.channels[i]['channelId']] = lbp # 开启监听线程 self.monitor.start() # 开始打包,不可返回,返回按钮禁用;设置打包按钮文本为"取 消" self.back_btn.setDisabled(True) self.pack_btn.setText("取 消") def set_qpb_list_item(self, channel, lbp): item = QListWidgetItem(self.qpb_list_widget) item.setSizeHint(QSize(400, 80)) widget = QWidget(self.qpb_list_widget) v_layout = QVBoxLayout() label = QLabel(channel['channelId'] + "==>>>等待出包...") v_layout.addWidget(label) lbp['label'] = label qpb = QProgressBar(self.qpb_list_widget) v_layout.addWidget(qpb) lbp['qpb'] = qpb widget.setLayout(v_layout) self.qpb_list_widget.addItem(item) self.qpb_list_widget.setItemWidget(item, widget) def set_value(self, channel_id, result, msg, step): lbp = self.lbps[channel_id] if result: # 打包步骤异常,提示异常,关闭进度条 lbp['label'].setText(channel_id + "==>>>" + msg) lbp['qpb'].close() if step == 100: lbp['success'] = True self.lbps[channel_id] = lbp else: # 打包正常,设置进度条进度 lbp['qpb'].setValue(step) if step == 0: lbp['label'].setText(channel_id + "==>>>" + msg) # 取消打包(全部取消) def cancel(self): self.progress = QProgressDialog(self) self.progress.setFixedWidth(500) self.progress.setFixedHeight(80) self.progress.setWindowTitle("正在取消,请稍等...") self.progress.setCancelButtonText("取消") self.progress.setMinimumDuration(1) self.progress.setWindowModality(Qt.ApplicationModal) self.progress.setRange(0, 0) self.progress.show() # 清空进度条显示列表 count = self.qpb_list_widget.count() for i in range(count): item = self.qpb_list_widget.takeItem(0) del item # 清空任务线程池;线程池清空后,会触发监听线程的完成信号,重置返回和打包按钮 # 因为打包任务调用外部程序,并不能立即终止外部程序连接,所以清空过程有延迟 for channel_id in self.lbps: self.lbps[channel_id]['runnable'].is_close = True self.monitor.clear() # 取消打包(清空任务完成),或打包完成, def complete(self): if self.progress is not None: self.progress.cancel() # 清空复选框的选择 self.all_selected_cbox.setChecked(False) for cbox in self.check_boxs: cbox.setChecked(False) # 返回按钮解禁;设置打包按钮文本为"打 包" self.back_btn.setDisabled(False) self.pack_btn.setText("打 包")
class StickmanToolsPanel(QFrame): WIDTH = 1100 HEIGHT = 45 FRAME_SIZE_X = 180 FRAME_WIDTH = 1 FRAME_MARGIN = 2 ICON_SIZE = 35 ICON_BUTTON_WIDTH = 60 INPUT_TEXT_WIDTH = 300 INPUT_START_X = 213 SAY_BLOCK_X = 520 PHOTO_BUTTON_WIDTH = 240 PHOTO_BUTTON_X = 858 def __init__(self, parent, tools): super().__init__(parent) self.tools = tools self.initUI() def initUI(self): self.resize(StickmanToolsPanel.WIDTH, StickmanToolsPanel.HEIGHT + StickmanToolsPanel.FRAME_MARGIN*2) self.setFrameStyle(QFrame.StyledPanel) self.setFrameRect(QRect(0, 0, StickmanToolsPanel.FRAME_SIZE_X + StickmanToolsPanel.FRAME_MARGIN*2, StickmanToolsPanel.HEIGHT + StickmanToolsPanel.FRAME_MARGIN*2)) self.setLineWidth(StickmanToolsPanel.FRAME_WIDTH) component_stylesheet = """ .QPushButton { font-weight: bold; font-size: 13px; background-color:#E0E0E0; } .QPushButton:pressed { background-color:#CCCCCC; } .QLineEdit { font-weight: bold; font-size: 24px; } """ self.smile_button = QPushButton('', self) self.smile_button.setIcon(assets.smile) self.smile_button.setIconSize(QSize(StickmanToolsPanel.ICON_SIZE, StickmanToolsPanel.ICON_SIZE)) self.smile_button.resize(StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.HEIGHT) self.smile_button.move(StickmanToolsPanel.FRAME_MARGIN, StickmanToolsPanel.FRAME_MARGIN) self.smile_button.setStyleSheet(component_stylesheet) self.smile_button.clicked.connect(self.changeExpression) self.smile_button.show() self.sad_button = QPushButton('', self) self.sad_button.setIcon(assets.sad) self.sad_button.setIconSize(QSize(StickmanToolsPanel.ICON_SIZE, StickmanToolsPanel.ICON_SIZE)) self.sad_button.resize(StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.HEIGHT) self.sad_button.move(StickmanToolsPanel.FRAME_MARGIN + StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.FRAME_MARGIN) self.sad_button.setStyleSheet(component_stylesheet) self.sad_button.clicked.connect(self.changeExpression) self.sad_button.show() self.confused_button = QPushButton('', self) self.confused_button.setIcon(assets.confused) self.confused_button.setIconSize(QSize(StickmanToolsPanel.ICON_SIZE, StickmanToolsPanel.ICON_SIZE)) self.confused_button.resize(StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.HEIGHT) self.confused_button.move(StickmanToolsPanel.FRAME_MARGIN + StickmanToolsPanel.ICON_BUTTON_WIDTH*2, StickmanToolsPanel.FRAME_MARGIN) self.confused_button.setStyleSheet(component_stylesheet) self.confused_button.clicked.connect(self.changeExpression) self.confused_button.show() self.say_text = QLineEdit(self) self.say_text.setStyleSheet(component_stylesheet) self.say_text.resize(StickmanToolsPanel.INPUT_TEXT_WIDTH, StickmanToolsPanel.HEIGHT) self.say_text.move(StickmanToolsPanel.FRAME_MARGIN + StickmanToolsPanel.INPUT_START_X, StickmanToolsPanel.FRAME_MARGIN) self.say_left = QPushButton('', self) self.say_left.setIcon(assets.say_left) self.say_left.setIconSize(QSize(StickmanToolsPanel.ICON_SIZE, StickmanToolsPanel.ICON_SIZE)) self.say_left.resize(StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.HEIGHT) self.say_left.move(StickmanToolsPanel.SAY_BLOCK_X, StickmanToolsPanel.FRAME_MARGIN) self.say_left.setStyleSheet(component_stylesheet) self.say_left.clicked.connect(self.sayLeft) self.say_right = QPushButton('', self) self.say_right.setIcon(assets.say_right) self.say_right.setIconSize(QSize(StickmanToolsPanel.ICON_SIZE, StickmanToolsPanel.ICON_SIZE)) self.say_right.resize(StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.HEIGHT) self.say_right.move(StickmanToolsPanel.SAY_BLOCK_X + StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.FRAME_MARGIN) self.say_right.setStyleSheet(component_stylesheet) self.say_right.clicked.connect(self.sayRight) self.say_exit = QPushButton('', self) self.say_exit.setIcon(assets.exit) self.say_exit.setIconSize(QSize(StickmanToolsPanel.ICON_SIZE, StickmanToolsPanel.ICON_SIZE)) self.say_exit.resize(StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.HEIGHT) self.say_exit.move(StickmanToolsPanel.SAY_BLOCK_X + StickmanToolsPanel.ICON_BUTTON_WIDTH*2, StickmanToolsPanel.FRAME_MARGIN) self.say_exit.setStyleSheet(component_stylesheet) self.say_exit.clicked.connect(self.sayClear) self.photo = QPushButton('', self) self.photo.setIcon(assets.camera) self.photo.setIconSize(QSize(StickmanToolsPanel.ICON_SIZE, StickmanToolsPanel.ICON_SIZE)) self.photo.resize(StickmanToolsPanel.PHOTO_BUTTON_WIDTH, StickmanToolsPanel.HEIGHT) self.photo.move(StickmanToolsPanel.PHOTO_BUTTON_X, StickmanToolsPanel.FRAME_MARGIN) self.photo.setStyleSheet(component_stylesheet) self.photo.clicked.connect(self.makePhoto) def sayLeft(self): search = getWorld().getActive() if search != None: search.sayLeft(self.say_text.text()) self.say_text.setText("") def sayRight(self): search = getWorld().getActive() if search != None: search.sayRight(self.say_text.text()) self.say_text.setText("") def sayClear(self): search = getWorld().getActive() if search != None: search.sayRemove() self.say_text.setText("") def changeExpression(self): search = getWorld().getActive() if search != None: if self.sender() == self.smile_button: search.setHappy() elif self.sender() == self.sad_button: search.setSad() else: search.setConfused() def makePhoto(self): self.tools.framemenu.addNewFrame(getWorld().getFrame())
class FirstRunWiz(QWizard): def __init__(self, app_settings): QWizard.__init__(self) self.app_settings = app_settings layout = [ QWizard.Stretch, QWizard.BackButton, QWizard.NextButton, QWizard.FinishButton, QWizard.CancelButton ] self.setButtonLayout(layout) self.setOptions(self.NoBackButtonOnStartPage) if getattr(sys, 'frozen', False): self.dir_path = os.path.dirname(sys.executable) else: self.dir_path = os.path.dirname(os.path.realpath(__file__)) self.setWizardStyle(QWizard.ModernStyle) self.setWindowTitle("MQT First Run Wizard") self.setPixmap(QWizard.WatermarkPixmap, QPixmap(os.path.join(self.dir_path, "watermark.png"))) self.first_name = '' self.surname = '' self.email = '' self.first_name_edit = None self.surname_edit = None self.email_edit = None self.server_address = '' self.class_key = '' self.ssl_checkbox = None self.server_address_edit = None self.class_key_edit = None self.setPage(1, self.intro()) self.setPage(2, self.user_info()) self.setPage(3, self.server_details()) self.setPage(4, self.complete()) self.setStartId(1) @staticmethod def intro(): page = QWizardPage() page.setTitle("Welcome to My Query Tutor") page.setSubTitle("The best tool to learn SQL") welcome_label = QLabel(''' I can see that this is the first time you have run My Query Tutor. We will now set everything up and you won't have to see this again :-D ''') description_label = QLabel('') layout = QGridLayout(page) layout.addWidget(welcome_label) layout.addWidget(description_label) return page def server_details(self): page = QWizardPage() page.setTitle("Server Details") page.setSubTitle("Optional server details (for syncing progress)") layout = QGridLayout(page) server_address_label = QLabel("Server Address ") self.server_address_edit = QLineEdit() class_key_label = QLabel("Class Key ") self.class_key_edit = QLineEdit() ssl_label = QLabel("SSL ") self.ssl_checkbox = QCheckBox() layout.addWidget(server_address_label, 1, 0) layout.addWidget(self.server_address_edit, 1, 1) layout.addWidget(class_key_label, 2, 0) layout.addWidget(self.class_key_edit, 2, 1) layout.addWidget(ssl_label, 3, 0) layout.addWidget(self.ssl_checkbox, 3, 1) return page def user_info(self): page = QWizardPage() page.setTitle("Your details") page.setSubTitle("Complete the form and click next") layout = QGridLayout(page) first_name_label = QLabel("First Name ") self.first_name_edit = QLineEdit() self.first_name_edit.setStyleSheet( "QLineEdit { background-color : white; color : black; }") surname_label = QLabel("Surname ") self.surname_edit = QLineEdit() self.surname_edit.setStyleSheet( "QLineEdit { background-color : white; color : black; }") email_label = QLabel("Email Address ") self.email_edit = QLineEdit() self.email_edit.setStyleSheet( "QLineEdit { background-color : white; color : black; }") layout.addWidget(first_name_label, 1, 0) layout.addWidget(self.first_name_edit, 1, 1) layout.addWidget(surname_label, 2, 0) layout.addWidget(self.surname_edit, 2, 1) layout.addWidget(email_label, 3, 0) layout.addWidget(self.email_edit, 3, 1) return page @staticmethod def complete(): page = QWizardPage() page.setTitle("Settings Complete") page.setSubTitle("All Done! (That was easy, wasn't it?)") label = QLabel("Click finish and start MQT") label.setWordWrap(True) layout = QGridLayout(page) layout.addWidget(label) return page def nextId(self): current_id = self.currentId() if current_id == 1: return 2 elif current_id == 2: return 3 elif current_id == 3: return 4 else: return -1 def validateCurrentPage(self) -> bool: current_id = self.currentId() all_goods = True if current_id == 2: if self.check_name_entry(): self.app_settings.set_user_details(self.first_name, self.surname, self.email) self.make_local_database() else: all_goods = False if current_id == 3: if self.ssl_checkbox.isChecked(): ssl = 'true' else: ssl = 'false' self.app_settings.set_server_details( self.server_address_edit.text(), self.class_key_edit.text(), "", ssl) return all_goods def check_name_entry(self): correct_style = "QLineEdit { background-color : white; color : black; }" incorrect_style = "QLineEdit { background-color : yellow; color : black; }" all_cool = True self.first_name = self.first_name_edit.text() self.surname = self.surname_edit.text() self.email = self.email_edit.text() if len(self.first_name) == 0: self.first_name_edit.setStyleSheet(incorrect_style) all_cool = False else: self.first_name_edit.setStyleSheet(correct_style) if len(self.surname) == 0: self.surname_edit.setStyleSheet(incorrect_style) all_cool = False else: self.surname_edit.setStyleSheet(correct_style) if re.match('''(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)''', self.email): self.email_edit.setStyleSheet(correct_style) else: self.email_edit.setStyleSheet(incorrect_style) all_cool = False return all_cool def make_local_database(self): src_db_file = os.path.join(self.dir_path, 'MQT_APP.sqlite') dir_path = QStandardPaths.writableLocation( QStandardPaths.AppLocalDataLocation) file_name = os.path.join(dir_path, 'MQT_APP.sqlite') shutil.copy(src_db_file, file_name) src_db_file = os.path.join(self.dir_path, 'MQT_EX.sqlite') dir_path = QStandardPaths.writableLocation( QStandardPaths.AppLocalDataLocation) file_name = os.path.join(dir_path, 'MQT_EX.sqlite') shutil.copy(src_db_file, file_name) src_dir = os.path.join(self.dir_path, 'images') dst_dir = os.path.join(dir_path, 'images') shutil.copytree(src_dir, dst_dir)
class Register(QWidget): register_ok_sg = pyqtSignal() def __init__(self, parent=None): super(Register, self).__init__(parent) self.desktop = QApplication.desktop() self.screenRect = self.desktop.screenGeometry() self.h = self.screenRect.height() self.w = self.screenRect.width() self.xr = self.w / 930 self.yr = self.h / 640 self.zr = min(self.xr, self.yr) self.top_wi = QWidget(self) self.logo_la = QLabel(self.top_wi) self.ind_wi = QWidget(self) self.register_but = QPushButton(self.ind_wi) self.imp_la = QLabel(self.ind_wi) self.account_le = QLineEdit(self.ind_wi) self.psw_le = QLineEdit(self.ind_wi) self.name_le = QLineEdit(self.ind_wi) self.set_ui() with open('index.qss', 'r') as f: self.setStyleSheet(f.read()) def set_ui(self): self.setWindowTitle('Register') self.setObjectName('register') self.resize(self.w, self.h) self.top_wi.setObjectName('top') self.top_wi.resize(930 * self.xr, 95 * self.yr) self.logo_la.setObjectName('logo') self.logo_la.resize(65 * self.xr, 65 * self.zr) self.logo_la.move(29 * self.xr, 16 * self.yr) effect = QGraphicsDropShadowEffect() effect.setOffset(10, 10) effect.setColor(QColor(0, 0, 0, 80)) effect.setBlurRadius(20) self.ind_wi.setObjectName('login') self.ind_wi.resize(327 * self.xr, 388 * self.yr) self.ind_wi.move(300 * self.xr, 150 * self.yr) self.ind_wi.setGraphicsEffect(effect) self.register_but.setObjectName('button') self.register_but.move(64 * self.xr, 315 * self.yr) self.register_but.resize(202 * self.xr, 45 * self.yr) self.register_but.setText('注册新用户') self.register_but.clicked.connect(self.register) self.imp_la.setObjectName('imp_label') self.imp_la.resize(100 * self.zr, 100 * self.zr) self.imp_la.move(115 * self.xr + 100 * (self.xr - self.zr) / 2, 15 * self.yr) self.imp_la.setStyleSheet('border-radius:{}px;'.format(self.zr * 49)) self.account_le.setObjectName('input') self.account_le.setTextMargins(20, 0, 0, 0) self.account_le.resize(213 * self.xr, 45 * self.yr) self.account_le.move(59 * self.xr, 126 * self.yr) self.account_le.setPlaceholderText('账号') self.psw_le.setObjectName('input') self.psw_le.setTextMargins(20, 0, 0, 0) self.psw_le.resize(213 * self.xr, 45 * self.yr) self.psw_le.move(59 * self.xr, 181 * self.yr) self.psw_le.setPlaceholderText('密码') self.psw_le.setEchoMode(QLineEdit.Password) self.name_le.setObjectName('input') self.name_le.setTextMargins(20, 0, 0, 0) self.name_le.resize(213 * self.xr, 45 * self.yr) self.name_le.move(59 * self.xr, 236 * self.yr) self.name_le.setPlaceholderText('昵称') self.ind_wi.setStyleSheet('#input{border-radius:' + str(self.zr * 20) + 'px;}' + '#button{border-radius:' + str(self.zr * 20) + 'px;' + 'font-size:' + str(int(self.zr * 18)) + 'px;}') def register(self): account_p = self.account_le.text() psw_p = self.psw_le.text() # name_p = self.name_le.text() dic = register(account_p, psw_p) if dic['status'] == 1001: self.account_le.clear() self.psw_le.clear() self.account_le.setStyleSheet('border:4px solid;border-color:red;') self.account_le.setPlaceholderText('账号已存在') elif dic['status'] == 0: self.register_ok_sg.emit() else: self.account_le.clear() self.psw_le.clear() self.account_le.setStyleSheet('border:4px solid;border-color:red;') self.account_le.setPlaceholderText('未知错误')