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)
def _init_ui(self): size_lay = QHBoxLayout() line_edit_l = MLineEdit().large() line_edit_l.setPlaceholderText('large size') line_edit_m = MLineEdit().medium() line_edit_m.setPlaceholderText('default size') line_edit_s = MLineEdit().small() line_edit_s.setPlaceholderText('small size') size_lay.addWidget(line_edit_l) size_lay.addWidget(line_edit_m) size_lay.addWidget(line_edit_s) line_edit_tool_button = MLineEdit(text='MToolButton') line_edit_tool_button.set_prefix_widget( MToolButton().svg('user_line.svg').icon_only()) line_edit_label = MLineEdit(text='MLabel') tool_button = MLabel(text='User').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) line_edit_label.set_prefix_widget(tool_button) line_edit_push_button = MLineEdit(text='MPushButton') push_button = MPushButton(text='Go').primary() push_button.setFixedWidth(40) line_edit_push_button.set_suffix_widget(push_button) search_engine_line_edit = MLineEdit().search_engine().large() search_engine_line_edit.returnPressed.connect(self.slot_search) line_edit_options = MLineEdit() combobox = MComboBox() option_menu = MMenu() option_menu.set_separator('|') option_menu.set_data([r'http://', r'https://']) combobox.set_menu(option_menu) combobox.set_value('http://') combobox.setFixedWidth(90) line_edit_options.set_prefix_widget(combobox) main_lay = QVBoxLayout() main_lay.addWidget(MDivider('different size')) main_lay.addLayout(size_lay) main_lay.addWidget(MDivider('custom prefix and suffix widget')) main_lay.addWidget(line_edit_tool_button) main_lay.addWidget(line_edit_label) main_lay.addWidget(line_edit_push_button) main_lay.addWidget(MDivider('preset')) main_lay.addWidget(MLabel('error')) main_lay.addWidget( MLineEdit(text='waring: file d:/ddd/ccc.jpg not exists.').error()) main_lay.addWidget(MLabel('search')) main_lay.addWidget(MLineEdit().search().small()) main_lay.addWidget(MLabel('search_engine')) main_lay.addWidget(search_engine_line_edit) main_lay.addWidget(MLabel('file')) main_lay.addWidget(MLineEdit().file().small()) main_lay.addWidget(MLabel('folder')) main_lay.addWidget(MLineEdit().folder().small()) main_lay.addWidget(MLabel('MLineEdit.options()')) main_lay.addWidget(line_edit_options) main_lay.addStretch() self.setLayout(main_lay)
def _init_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 UserPanel(QWidget): """用户面板""" login_signal = QtCore.Signal(str) #用户面板的登陆信号 CorrectUserName = None def __init__(self): super(UserPanel, self).__init__() self.username = None # 初始化用户名 self.imgPath = hpPath + "\\" + "default.jpg" #保存用户头像 self.password = None self.rePassword = None self.key = None self.WM = False self.login_userName = None self.login_password = None self.setObjectName("UserPanel") self.setupUI() self.setTabOrder(self.btn_sign_up, self.line_edit_name) self.setTabOrder(self.line_edit_name, self.line_edit_password) self.setTabOrder(self.line_edit_password, self.btn_sign_in) self.setTabOrder(self.btn_sign_in, self.btn_sign_up) # 设置用户界面 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 slot_show_message(self, func, config): func(config, parent=self) # 登录按钮按下,加载登录界面 def on_sigin_in_click(self): self.login_userName = self.line_edit_name.text() self.login_password = self.line_edit_password.text() if not self.login_userName: self.slot_show_message(MMessage.error, (u'请输入用户名')) return 0 if not self.login_password: self.slot_show_message(MMessage.error, (u'请输入密码')) return 0 collist = userdb.list_collection_names() if self.login_userName in collist: # 判断该用户是否存在 colUser = userdb[self.login_userName] # Todo: 从数据库读取数据,判断是否名字存在,密码是否正确,成功则执行login函数,失败提示 # 从数据库提取密码 for x in colUser.find({"_id": "Password"}, {"Password": 1}): if "Password" in x: DBpassword = x["Password"] if not DBpassword: return 0 if self.login_password == DBpassword: saveLoginTime(self.login_userName) # 保存登陆时间 self.login_signal.emit(self.login_userName) # 发射登陆信号 UserPanel.CorrectUserName = self.login_userName msg = MToast.loading(u'正在登录中', parent=self) msg.sig_closed.connect( functools.partial(MToast.success, u'登录成功', self)) self.close() else: self.slot_show_message(MMessage.error, (u'密码错误')) else: self.slot_show_message(MMessage.error, (u'该用户名不存在')) return 0 # 设置注册界面 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) # 注册按钮按下 def on_sigin_up_click(self): self.slot_new_account() # 注册 def slot_new_account(self): self.setRegeditWindow() self.drawer.show() # 设置头像 def setHeadPorfie(self): dialog = QFileDialog() dialog.setStyleSheet(Data.getQSS()) #根据当前所在文件目录,设置默认打开文件格式 dialog.setNameFilter(u"图片文件(*.jpg *.png *.jpeg);;") #加载对应的文件 dialog.setFileMode(QFileDialog.ExistingFiles) dialog.setViewMode(QFileDialog.Detail) if dialog.exec_(): imgPaths = dialog.selectedFiles() self.imgPath = imgPaths[0] img = cv2.imread(self.imgPath) flag = min(img.shape[0], img.shape[1]) newimg = img[((img.shape[0] - flag) // 2):((img.shape[0] + flag) // 2), ((img.shape[1] - flag) // 2):((img.shape[1] + flag) // 2)] newimg = cv2.resize(newimg, (150, 150), interpolation=cv2.INTER_AREA) cv2.imwrite(hpPath + "\\" + "buffer.jpg", newimg) #将图片作为缓存存入指定文件内 # pixmap = QtGui.QPixmap(hpPath + "\\" + "buffer.jpg") # self.lab_headProfile.setPixmap(pixmap) # 打开头像编辑器 self.hpw = headProfieWindow(self.imgPath) self.hpw.show() # self.hpw.hPOK_signal.connect(lambda: self.setPicture()) # #保存用户头像路径 # def setPicture(self): # self.imgPath = file_path + r"\res\headPortrial\buffer.jpg" # 设置管理员权限 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) # self.custom_widget.layout().addWidget(self.key_widget) #点击完成注册 def regedit(self): self.username = self.line_edit_regedit_name.text() self.password = self.line_edit_regedit_password.text() self.rePassword = self.line_edit_regedit_password2.text() self.key = None #判断是否输入信息 if not self.username: self.slot_show_message(MMessage.error, (u'请输入用户名!')) return 0 if not self.password: self.slot_show_message(MMessage.error, (u'请输入密码!')) return 0 if not self.rePassword: self.slot_show_message(MMessage.error, (u'请再次输入密码!')) return 0 if self.rePassword == self.password: collist = userdb.list_collection_names() if self.username in collist: # 判断该用户是否存在 self.slot_show_message(MMessage.error, (u'该用户已经存在')) return 0 else: if self.WM: #注册管理员 self.key = self.line_edit_key.text() if self.key == "IDO": #管理员密钥 saveUsername(self.username) savePassword(self.username, self.password) saveUserID(self.username, "管理员") saveRegisterTime(self.username) if self.imgPath: #如果设置了截图 saveHeadPorfile(self.username, hpPath + "\\" + "buffer.jpg") else: saveHeadPorfile(self.username, hpPath + "\\" + "default.jpg") self.drawer.close() #注册成功,关闭窗口 else: self.slot_show_message(MMessage.error, (u'密钥错误')) return 0 else: #注册普通用户 saveUsername(self.username) savePassword(self.username, self.password) saveUserID(self.username, "普通用户") saveRegisterTime(self.username) if self.imgPath: # 如果设置了头像截图 saveHeadPorfile(self.username, self.imgPath) msg = MToast.loading(u'正在注册中', parent=self) msg.sig_closed.connect( functools.partial(MToast.success, u'注册成功', self)) self.drawer.close() # 注册成功,关闭窗口 else: self.slot_show_message(MMessage.error, (u'两次输入密码不一致!')) return 0 # 登录,显示登录界面 def login(self, name): self.widget = QWidget() self.widget.setMinimumSize(Data.getWindowWidth() / 6, Data.getWindowHeight() / 4) # 加载ui,并设置ui界面 #self.ui = loadUi(file_path + "\\res\\UI\\LoginIn.ui") self.ui = loadUi(file_path + "\\res\\UI\\LoginIn.ui") self.ui.setParent(self.widget) self.widget.setLayout(QVBoxLayout()) # 设置布局 self.widget.layout().addWidget(self.ui) self.setWidget(self.widget) # 获取控件 self.label_name = self.ui.findChild(QLabel, "label_name") self.label_identity = self.ui.findChild(QLabel, "label_identity") self.label_headLogin = self.ui.findChild(QLabel, "label_headLogin") self.btn_editUser = self.ui.findChild(QPushButton, "btn_editUser") # 链接信号与槽函数 self.btn_editUser.clicked.connect(lambda: self.editUser(name)) #saveLoginTime(name) # 储存登陆时间 # Todo 根据名字访问数据库里的信息,加载到界面 self.label_name.setText(name) # 显示用户名 colUser = userdb[name] for x in colUser.find({"_id": "UserID"}, {"UserID": 1}): ID = x["UserID"] self.label_identity.setText(ID) # 显示身份 # 设置头像 self.setHeadPortrait(name, self.label_headLogin) #设置操作记录 self.Userlogin_signal.emit() # Todo 点击头像,可以更换头像界面,然后把头像写入数据库 # 设置头像 def setHeadPortrait(self, username, QWidget): path = file_path + r"\res\headPortrial\default.jpg" nameList = os.listdir(file_path + r"\res\headPortrial") for name in nameList: if (username + ".jpg") == name: path = file_path + r"\res\headPortrial" + "\\" + username + ".jpg" pixmap = QtGui.QPixmap(path) QWidget.setPixmap(pixmap) # #获得用户名并加载登录后用户界面 # def getUsername(self): # self.username = self.loginWin.username # self.login(self.username) #编辑用户信息 def editUser(self, username): self.editUserWin = editUserWinodw(username) self.editUserWin.show() self.editUserWin.editUser_signal.connect( lambda: self.reSetUserInformation(username)) #链接确认编辑信号与槽函 #重新设置用户信息 def reSetUserInformation(self, username): self.setHeadPortrait(username, self.label_headLogin) colUser = userdb[username] for x in colUser.find({"_id": "UserID"}, {"UserID": 1}): ID = x["UserID"] self.label_identity.setText(ID) # 显示身份