示例#1
0
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)
示例#2
0
    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)
示例#4
0
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)  # 显示身份