class MNewTag(QWidget): sig_add_tag = Signal(str) def __init__(self, text='New Tag', parent=None): super(MNewTag, self).__init__(parent) self.setAttribute(Qt.WA_StyledBackground) self._add_button = MToolButton().tiny().svg( 'add_line.svg').text_beside_icon() self._add_button.setText(text) self._add_button.clicked.connect(self._slot_show_edit) self._line_edit = MLineEdit().tiny() self._line_edit.returnPressed.connect(self._slot_return_pressed) self._line_edit.setVisible(False) self._main_lay = QGridLayout() self._main_lay.setContentsMargins(3, 3, 3, 3) self._main_lay.addWidget(self._add_button, 0, 0) self._main_lay.addWidget(self._line_edit, 0, 0) self.setLayout(self._main_lay) def set_completer(self, completer): self._line_edit.setCompleter(completer) def _slot_show_edit(self): self._line_edit.setVisible(True) self._add_button.setVisible(False) self._line_edit.setFocus(Qt.MouseFocusReason) def _slot_return_pressed(self): self._line_edit.setVisible(False) self._add_button.setVisible(True) if self._line_edit.text(): self.sig_add_tag.emit(self._line_edit.text()) self._line_edit.clear() def focusOutEvent(self, *args, **kwargs): self._line_edit.setVisible(False) self._add_button.setVisible(True) return super(MNewTag, self).focusOutEvent(*args, **kwargs)
class ParmerPanel(QWidget): """参数面板类""" send_message_signal = Signal(str, str) def __init__(self, username): super(ParmerPanel, self).__init__() self.username = username self.id = None self.setObjectName("parmPanel") self.setupUI() dayu_theme.apply(self) # 设置UI界面 def setupUI(self): self.setMaximumWidth(Data.getWindowWidth() / 3) self.ui = loadUi(file_path + "\\res\\UI\\ParameterWindow.ui") self.ui.setParent(self) self.setLayout(QVBoxLayout()) self.layout().addWidget(self.ui) self.widget_1 = self.ui.findChild(QWidget, "widget") self.widget_2 = self.ui.findChild(QWidget, "widget_2") self.widget_3 = self.ui.findChild(QWidget, "widget_3") self.widget_4 = self.ui.findChild(QWidget, "widget_4") self.widget_1.setLayout(QVBoxLayout()) self.widget_2.setLayout(QVBoxLayout()) self.widget_4.setLayout(QVBoxLayout()) self.widget_2.layout().setSpacing(8) #设置布局 tab_card = MTabWidget() self.label_filePic = MLabel("") self.widget_1.setMinimumSize(Data.getWindowHeight() / 2.8, Data.getWindowHeight() / 2.8) tab_card.addTab(self.label_filePic, u'预览图') # Todo 加载3d视口 # self.model_widget = QWidget() self.model_widget = CefBrowser(self, url="editor") # self.model_widget.setLayout(QVBoxLayout()) tab_card.addTab(self.model_widget, u'3D视口') self.widget_1.layout().addWidget(tab_card) self.widget_1.layout().setContentsMargins(0, 0, 0, 0) self.widget_2.layout().addWidget(MDivider(u'操作面板')) self.let_filename = MLineEdit(text='filename') tool_button = MLabel(text=u'文件名').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.let_filename.set_prefix_widget(tool_button) self.widget_2.layout().addWidget(self.let_filename) self.let_path = MLineEdit(text='filepath') tool_button_2 = MLabel(text=u'文件地址').mark().secondary() tool_button_2.setAlignment(Qt.AlignCenter) tool_button_2.setFixedWidth(80) self.let_path.set_prefix_widget(tool_button_2) self.widget_2.layout().addWidget(self.let_path) self.widget_2.layout().addWidget(MLabel(u'标签')) self.let_tag = MLineEdit(text='tag') self.btn_reviseTag = MPushButton(text=u'修改').primary() self.btn_reviseTag.setFixedWidth(80) self.let_tag.set_suffix_widget(self.btn_reviseTag) self.widget_2.layout().addWidget(self.let_tag) self.btn_export = MPushButton(u'导出到houdini').primary() self.widget_2.layout().addWidget(self.btn_export) self.btn_exportToMaya = MPushButton(u'导出到Maya').primary() self.widget_2.layout().addWidget(self.btn_exportToMaya) self.timer = QTimer() self.timer.setInterval(0.1) self.timer.timeout.connect(self.slot_timeout) self.auto_color_progress = MProgressBar().auto_color() self.widget_2.layout().addWidget(self.auto_color_progress) self.widget_4.layout().addWidget(MDivider(u'操作记录')) self.setWindowTitle(u"参数面板") # #获取控件 self.tableWidget_operationNote = self.ui.findChild( QTableWidget, "tableWidget_operationNote") self.tableWidget_operationNote.setStyleSheet(Data.getQSS()) #设置默认值 self.let_filename.setReadOnly(True) #只读 self.let_path.setReadOnly(True) #只读 self.let_tag.setReadOnly(True) #只读 self.tableWidget_operationNote.setHorizontalHeaderLabels( [u'用户', u'操作', u'时间']) # #连接信号与槽 self.btn_export.clicked.connect(self.slot_run) self.btn_reviseTag.clicked.connect(lambda: self.reviseTag()) # self.tableWidget_operationNote.setColumnCount(3) setSectionResizeMode(self.tableWidget_operationNote.horizontalHeader(), QHeaderView.Stretch) # 自适应 def setParam(self, type, name, path): self.type = type self.filename = name self.filepath = path # 根据图片类型设置图片 if (type == "jpg" or type == "jpeg" or type == "png"): self.setPic(path) elif (type == "obj" or type == "fbx"): self.setObjPic() filepath = os.path.dirname(path) filename = filepath.split("/")[-1] self.let_filename.setText(filename) self.let_path.setText(filepath) tags = "" assetdb = client[type] assetcol = assetdb[name] for tagdic in assetcol.find({}, {"Tag": 1}): if "Tag" in tagdic: tag = tagdic["Tag"] tags += tag + "," self.let_tag.setText(tags) #设置资产操作记录表: assetdb = client[type] assetcol = assetdb[name] assetlist = assetcol.find({}, { "UserName": 1, "Operation": 1, "Time": 1 }) #rowcount = len(assetlist) #assetlist并不是列表类型 i = 0 # for x in assetlist: # i += 1 #求得行数减一 for xdir in assetlist: if "UserName" in xdir: str1 = xdir["UserName"] newItem1 = QTableWidgetItem(str1) self.tableWidget_operationNote.setItem(i, 0, newItem1) if "Time" in xdir: str3 = xdir["Time"] newItem3 = QTableWidgetItem(str3) self.tableWidget_operationNote.setItem(i, 2, newItem3) if "Operation" in xdir: str2 = xdir["Operation"] newItem2 = QTableWidgetItem(str2) self.tableWidget_operationNote.setItem(i, 1, newItem2) i += 1 self.saveBrowseNode(self.username, name, type) #保存浏览信息到库 # 链接信号与槽函数 self.btn_export.clicked.connect( lambda: self.exportModelToHoudini(name, type, path)) self.btn_exportToMaya.clicked.connect( lambda: self.exportModelToMaya(name, type, path)) # self.saveBrowseNode(self.username, name, type) # 进度条 def slot_run(self): self.timer.start() self.auto_color_progress.setValue(0) def slot_timeout(self): if self.auto_color_progress.value() > 99: self.timer.stop() else: self.auto_color_progress.setValue( self.auto_color_progress.value() + 1) def setPic(self, path): pixmap = QPixmap(path) self.label_filePic.setPixmap(pixmap) self.label_filePic.setScaledContents(True) def setObjPic(self): """加载的是obj模型,设置obj的图片""" pixmap = QPixmap(file_path + r"\res\image\objimg.jpg") self.label_filePic.setPixmap(pixmap) self.label_filePic.setScaledContents(True) def saveBrowseNode(self, username, filename, type): RTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) #将浏览信息存入用户数据库 col = userdb[username] dict = {"Operation": "Browse", "Time": RTime, "FileName": filename} col.insert_one(dict) #将浏览信息存入资产数据库 assetdb = client[type] assetcol = assetdb[filename] adict = {"UserName": username, "Time": RTime, "Operation": "Browse"} assetcol.insert_one(adict) def exportModelToHoudini(self, filename, type, path): try: import hrpyc connection, hou = hrpyc.import_remote_module() name = filename.split(".")[0] if (type == "obj" or type == "fbx"): print("exportModelHoudiniOBJ") geo = hou.node('/obj').createNode('geo', name) fileNode = geo.createNode('file', name) fileNode.parm('file').set(path) prinShaderNode = hou.node('/mat').createNode( 'principledshader', name) prinShaderNode.parm('basecolor_useTexture').set(1) materialNode = geo.createNode('material', name + "_material") materialNode.parm('shop_materialpath1').set("/mat/" + name) materialNode.setInput(0, fileNode) materialNode.moveToGoodPosition() materialNode.setDisplayFlag(1) if (type == "jpg" or type == "jpeg"): try: print("exportModelHoudiniJPG") # 路径不能有中文 imgNode = hou.node('/img').createNode('img', "comp1") imgNode = hou.node('/img/comp1').createNode('file', name) # fileNode = imgNode.createNode('file', name) imgNode.parm('filename1').set(path) except: print("ExportPictureFail") #保存导出记录到资产数据库 RTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) assetdb = client[type] assetcol = assetdb[filename] adict = { "UserName": self.username, "Time": RTime, "Operation": "Export" } assetcol.insert_one(adict) # 保存导出记录到用户数据库 usercol = userdb[self.username] adict = { "FileName": filename, "Time": RTime, "Operation": "Export" } usercol.insert_one(adict) except: self.slot_show_message(MMessage.info, (u'导出失败!请确认Houdini是否配置成功或启动。')) print(path) print(type) def exportModelToMaya(self, filename, type, path): if type == "obj" or type == "fbx": print("ExportModelToMaya") import socket try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1', 7001)) #s.send('print("HelloWord!!!!!!!!!!!!");') name = filename.split(".")[0] command0 = "import maya.cmds as mc;" command1 = "imported_objects = mc.file(r'" + path + "\', ns='ns', i=True, rnn=True);" command2 = "transforms = mc.ls(imported_objects, type='transform');" command = command0 + command1 + command2 s.send(command) except: self.slot_show_message(MMessage.info, (u'导出失败!请确认Maya是否配置成功或启动。')) print(path) print(type) else: print("This can't export to Maya") def saveExportModelNode(self, username, filename, type): RTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) # 将浏览信息存入用户数据库 col = userdb[username] dict = {"Operation": "Export", "Time": RTime, "FileName": filename} col.insert_one(dict) # 将浏览信息存入资产数据库 assetdb = client[type] assetcol = assetdb[filename] adict = {"UserName": username, "Time": RTime, "Operation": "Export"} assetcol.insert_one(adict) def reviseTag(self): if self.username != None: usercol = userdb[self.username] idlist = usercol.find({"_id": "UserID"}, {"UserID": 1}) for iddir in idlist: self.id = iddir["UserID"] if self.id != "管理员": self.send_message_signal.emit("warnning", u"只有管理员才可以修改标签") return 0 self.let_tag.setReadOnly(False) #可写入 self.btn_reviseTag.setText(u"确认修改") self.btn_reviseTag.clicked.disconnect() self.btn_reviseTag.clicked.connect(lambda: self.confirmReviseTag()) def confirmReviseTag(self): self.let_tag.setReadOnly(True) # 只读 #连接数据库 assetdb = client[self.type] assetcol = assetdb[self.filename] assetdb = client[self.type] assetcol = assetdb[self.filename] newTags = self.let_tag.text().split(",") self.oldTags = [] taglist = assetcol.find({}, {"Tag": 1}) for tag in taglist: if "Tag" in tag: self.oldTags.append(tag["Tag"]) #是否有删除标签 for oldTag in self.oldTags: delTag = True for newTag in newTags: if newTag == oldTag: delTag = False if delTag: #存在 # 删除资产库里的标签 deldir = {"Tag": oldTag} assetcol.delete_one(deldir) #删除标签文件库里对应的文件 tagfilecol = tagfiledb[oldTag] deldir = {"FileName": self.filename} tagfilecol.delete_one(deldir) #是否有新标签 for newTag in newTags: if newTag == "": continue # 是否为从未有过的标签 new = True for x in tagcol.find({}, {"Tag": 1}): # 把数据库里的标签取出 if newTag == x["Tag"]: new = False if new: newTagdir = {"Tag": newTag} tagcol.insert_one(newTagdir) # 添加到标签数据库 addTag = True for oldTag in self.oldTags: if newTag == oldTag: addTag = False if addTag: #资产库里添加新标签 adict = {"Tag": newTag} assetcol.insert_one(adict) # 标签文件库里添加对应的文件 tagfilecol = tagfiledb[newTag] deldir = {"FileName": self.filename} tagfilecol.insert_one(deldir) self.btn_reviseTag.setText(u"修改") self.send_message_signal.emit("info", u"已成功修改标签") #保存操作记录到用户数据库 RTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) usercol = userdb[self.username] adict = { "FileName": self.filename, "Time": RTime, "Operation": "EditTag" } usercol.insert_one(adict) #保存操作记录到资产数据库 RTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) adict = { "UserName": self.username, "Time": RTime, "Operation": "EditTag" } assetcol.insert_one(adict) self.btn_reviseTag.clicked.disconnect() self.btn_reviseTag.clicked.connect(lambda: self.reviseTag()) # Todo: 传入预览图路径,加载3d视口资源到3d视口 def setModelWidget(self, path): file = os.path.dirname(path) tex_type = [ 'albedo', 'bump', 'roughness', 'specular', 'opacity', 'normal', 'displacement' ] data = {} #存储贴图数据 for name in os.listdir(file): if name.split(".")[-1] == "obj" or name.split(".")[-1] == "fbx": modelpath = os.path.join(file, name).replace("\\", "/") data["model"] = modelpath elif name.split(".")[-1] == "jpg": for typ in tex_type: _typ = "_%s." % typ if _typ in name.lower(): data[typ] = os.path.join(file, name).replace("\\", "/") break import json # self.model_widget.layout().addWidget(MLabel(modelpath)) data = json.dumps(data) print data self.model_widget.loadAsset(data) # 弹出信息提示窗口 def slot_show_message(self, func, config): func(config, parent=self.parent())
class MNewTag(QWidget): """New Tag input component.""" sig_add_tag = Signal(str) def __init__(self, text="New Tag", parent=None): super(MNewTag, self).__init__(parent) self.setAttribute(Qt.WA_StyledBackground) self._add_button = MToolButton().text_beside_icon().small().svg( "add_line.svg") self._add_button.setText(text) self._add_button.clicked.connect(self._slot_show_edit) self._line_edit = MLineEdit().small() self._line_edit.returnPressed.connect(self._slot_return_pressed) self._line_edit.setVisible(False) self._line_edit.installEventFilter(self) self._main_lay = QGridLayout() self._main_lay.setContentsMargins(3, 3, 3, 3) self._main_lay.addWidget(self._add_button, 0, 0) self._main_lay.addWidget(self._line_edit, 0, 0) self.setLayout(self._main_lay) scale_x, _ = get_scale_factor() style = QssTemplate(""" MNewTag{ border: @border@unit dashed @border_color; } MNewTag MToolButton:hover{ border:none; } """) self.setStyleSheet( style.substitute( border_color=utils.fade_color(dayu_theme.secondary_text_color, "35%"), unit=dayu_theme.unit, border=1 * scale_x, )) def set_completer(self, completer): """Set the input completer""" self._line_edit.setCompleter(completer) def _slot_show_edit(self): self._line_edit.setVisible(True) self._add_button.setVisible(False) self._line_edit.setFocus(Qt.MouseFocusReason) def _slot_return_pressed(self): self._line_edit.setVisible(False) self._add_button.setVisible(True) if self._line_edit.text(): self.sig_add_tag.emit(self._line_edit.text()) self._line_edit.clear() self.update() def focusOutEvent(self, *args, **kwargs): """Override focusOutEvent to change the edit mode to button mode.""" self._line_edit.setVisible(False) self._add_button.setVisible(True) return super(MNewTag, self).focusOutEvent(*args, **kwargs) def eventFilter(self, widget, event): if widget is self._line_edit: if event.type() == QEvent.Type.KeyPress and event.key( ) == Qt.Key_Escape: self._line_edit.setVisible(False) self._add_button.setVisible(True) return super(MNewTag, self).eventFilter(widget, event)
class EditWidget(QWidget): send_message_signal = Signal(str, str) def __init__(self, paths, parent=None): super(EditWidget, self).__init__(parent) self.setWindowTitle(u'资产编辑器') self.paths = paths self.isLoadPic = True #导出的是图片 self._init_ui() self.setConnect() def _init_ui(self): self.setWindowModality(Qt.ApplicationModal) self.setMinimumSize(Data.getWindowWidth() / 4.5, Data.getWindowHeight() / 1.6) self.setMaximumSize(Data.getWindowWidth() / 4.5, Data.getWindowHeight() / 1.6) browser_4 = MClickBrowserFolderToolButton().huge() self.lineEdit = MLineEdit(text='filepath') self.lineEdit.setReadOnly(True) browser_4.sig_folder_changed.connect(self.lineEdit.setText) lay_1 = QHBoxLayout() lay_1.addWidget(self.lineEdit) lay_1.addWidget(browser_4) self.tab = MLineTabWidget() widget = QWidget() widget.setLayout(QVBoxLayout()) self.lineEdit_width = MLineEdit() tool_button = MLabel(text=u'宽度').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.lineEdit_width.set_prefix_widget(tool_button) self.lineEdit_width.setText("1080") self.lineEdit_width.setValidator(QIntValidator()) self.lineEdit_height = MLineEdit() tool_button = MLabel(text=u'高度').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.lineEdit_height.set_prefix_widget(tool_button) self.lineEdit_height.setText("720") self.lineEdit_height.setValidator(QIntValidator()) self.lineEdit_level = MLineEdit() tool_button = MLabel(text=u'精度').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.lineEdit_level.set_prefix_widget(tool_button) self.lineEdit_level.setText("50") self.lineEdit_level.setValidator(QIntValidator()) widget.layout().addWidget(MLabel(u'贴图大小')) widget.layout().addWidget(self.lineEdit_width) widget.layout().addWidget(self.lineEdit_height) widget.layout().addSpacing(10) widget.layout().addWidget(MLabel(u'贴图精度')) widget.layout().addWidget(self.lineEdit_level) self.tab.add_tab(widget, u'低精度图片') widget2 = QWidget() widget2.setLayout(QVBoxLayout()) self.MlineEdit_level = MLineEdit() tool_button = MLabel(text=u'精度').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.MlineEdit_level.set_prefix_widget(tool_button) self.MlineEdit_level.setText("50") self.MlineEdit_level.setValidator(QIntValidator()) widget2.layout().addWidget(MLabel(u'模型精度')) widget2.layout().addWidget(self.MlineEdit_level) widget2.layout().addSpacing(100) self.tab.add_tab(widget2, u'低精度模型') btn_layout = QHBoxLayout() self.btn_ok = MPushButton(text=u'导出').primary() self.btn_ok.setFixedWidth(80) self.btn_cancel = MPushButton(text=u'取消').primary() self.btn_cancel.setFixedWidth(80) btn_layout.addWidget(self.btn_ok) btn_layout.addWidget(self.btn_cancel) main_lay = QVBoxLayout() main_lay.addSpacing(20) main_lay.addWidget(MDivider(u'路径选择')) main_lay.addLayout(lay_1) main_lay.addWidget(MDivider(u'操作选择')) main_lay.addWidget(self.tab) main_lay.addWidget(MDivider(u'')) main_lay.addLayout(btn_layout) main_lay.addSpacing(20) self.setLayout(main_lay) dayu_theme.background_color = "#262626" dayu_theme.apply(self) def setConnect(self): self.btn_ok.clicked.connect(self.on_btn_ok_click) self.btn_cancel.clicked.connect(self.on_btn_cancel_click) self.tab.tool_button_group.sig_checked_changed.connect( self.on_tab_change) def on_btn_ok_click(self): if (self.paths == []): self.send_message_signal.emit("warnning", u"请选择操作资产") self.close return if (self.lineEdit.text()) == "filepath": self.send_message_signal.emit("warnning", u"请选择导出的位置") return output = self.lineEdit.text() if self.isLoadPic == True: width = int(self.lineEdit_width.text()) height = int(self.lineEdit_height.text()) level = int(self.lineEdit_level.text()) for path in self.paths: for name in os.listdir(path): if name.split(".")[-1] == "jpg": picpath = path + "/" + name self.make_thumb(picpath, output, width, height, level) self.send_message_signal.emit("success", u"图片生成成功") else: level = int(self.MlineEdit_level.text()) for path in self.paths: for name in os.listdir(path): if name.split(".")[-1] == "obj" or name.split( ".")[-1] == "fbx": modelpath = path + "/" + name self.genteralLOD(modelpath, output, level) self.close() def on_btn_cancel_click(self): self.close() def on_tab_change(self): if self.isLoadPic == True: self.isLoadPic = False else: self.isLoadPic = True def make_thumb(self, path, output, size1=1080, size2=720, level=50): """ 缩略图生成程序 size 参数传递要生成的尺寸 返回缩略图地址 """ try: # 尝试打开文件 im = Image.open(path) except IOError: return mode = im.mode if mode not in ('L', 'RGB'): if mode == 'RGBA': # 透明图片需要加白色底 alpha = im.split()[3] bgmask = alpha.point(lambda x: 255 - x) im = im.convert('RGB') im.paste((255, 255, 255), None, bgmask) else: im = im.convert('RGB') width, height = im.size if width == height: region = im else: if width > height: delta = (width - height) / 2 box = (delta, 0, delta + height, height) else: delta = (height - width) / 2 box = (0, delta, width, delta + width) region = im.crop(box) filename = (path.split("/"))[-1] savePath = output + "//" + os.path.splitext(filename)[0] + "_thumb.jpg" # savePath = file_path + r"\res\images\thumbnail" + "_" + "%sx%s" % (str(size), str(size)) + ".jpg" thumb = region.resize((size1, size2), Image.ANTIALIAS) if (level < 0): level = 0 elif (level > 100): level = 100 thumb.save(savePath, quality=level) # 默认 JPEG 保存质量是 75, 可选值(0~100) # 生成低精度模型 def genteralLOD(self, input, output, level=50): try: import hou name = (input.split("/"))[-1] name = (name.split("."))[0] output = output + "//" + name + "_" + str(level) + ".obj" obj = hou.node("obj") geo = obj.createNode("geo") fileImport = geo.createNode("file") fileImport.parm("file").set(input) polyreduce = geo.createNode("polyreduce") polyreduce.setFirstInput(fileImport) polyreduce.parm("percentage").set(level) fileExport = geo.createNode("file") fileExport.setFirstInput(polyreduce) fileExport.parm("filemode").set(2) fileExport.parm("file").set(output) fileExport.setDisplayFlag(1) fileExport.parm("reload").pressButton() self.send_message_signal.emit("success", u"模型生成成功") except: self.send_message_signal.emit("warnning", u"该功能仅在houdini内部可以调用")
class editUserWinodw(QWidget): """ 编辑用户信息窗口类 """ editUser_signal = QtCore.Signal() #确认头像信号 def __init__(self, username): super(editUserWinodw, self).__init__() self.setWindowModality(Qt.ApplicationModal) self.setMinimumSize(Data.getWindowHeight() / 1.5, Data.getWindowHeight() / 3) # self.setMinimumSize(Data.getWindowWidth() / 3, Data.getWindowHeight() / 3) # self.setMaximumSize(Data.getWindowWidth() / 3, Data.getWindowHeight() / 3) self.username = username self.key = None self.wchp = False self.wcun = False self.wcpw = False self.wcid = False # 设置窗口名称 self.setWindowTitle(u"用户窗口") self.tab = MLineTabWidget() widget = QWidget() widget_child = QWidget() widget_child_2 = QWidget() widget.setLayout(QHBoxLayout()) widget_child.setLayout(QVBoxLayout()) widget_child_2.setLayout(QVBoxLayout()) self.label_headProfile = MLabel() self.label_headProfile.setAlignment(Qt.AlignHCenter) self.btn_changeHead = MPushButton(u'选择新头像') widget_child.layout().addWidget(self.label_headProfile) widget_child.layout().addWidget(self.btn_changeHead) # widget_child.layout().addStretch() self.let_username = MLineEdit(text='username') tool_button = MLabel(text=u'用户名').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.let_username.set_prefix_widget(tool_button) widget_child_2.layout().addWidget(self.let_username) self.let_ID = MLineEdit(text='identity') self.btn_changeID = MPushButton(text=u'修改身份').primary() self.btn_changeID.setFixedWidth(80) self.let_ID.set_suffix_widget(self.btn_changeID) widget_child_2.layout().addWidget(self.let_ID) self.let_key = MLineEdit(text='') tool_button = MLabel(text=u'密钥').mark().secondary() tool_button.setAlignment(Qt.AlignCenter) tool_button.setFixedWidth(80) self.let_key.set_prefix_widget(tool_button) widget_child_2.layout().addWidget(self.let_key) self.let_password = MLineEdit(text='***********') self.btn_changePassword = MPushButton(text=u'修改密码').primary() self.btn_changePassword.setFixedWidth(80) self.let_password.set_suffix_widget(self.btn_changePassword) widget_child_2.layout().addWidget(self.let_password) self.btn_ok = MPushButton(u'确定').large().primary() self.btn_cancel = MPushButton(u'取消').large().primary() layout = QHBoxLayout() layout.addWidget(self.btn_ok) layout.addWidget(self.btn_cancel) widget_child_2.layout().addLayout(layout) widget.layout().addWidget(widget_child) widget.layout().addWidget(widget_child_2) self.tab.add_tab(widget, u'用户信息') widget2 = QWidget() self.ui = loadUi(file_path + r"\res\UI\EditUserWindow.ui") self.ui.setParent(widget2) widget2.setLayout(QVBoxLayout()) widget2.layout().addWidget(self.ui) self.tableWidget_operationNode = self.ui.findChild( QTableWidget, "tableWidget_operationNode") self.tableWidget_operationNode.setStyleSheet(Data.getQSS()) setSectionResizeMode(self.tableWidget_operationNode.horizontalHeader(), QHeaderView.Stretch) # 自适应 # widget2.layout().addSpacing(100) self.tab.add_tab(widget2, u'操作记录') btn_layout = QHBoxLayout() main_lay = QVBoxLayout() main_lay.addSpacing(20) main_lay.addWidget(self.tab) main_lay.addWidget(MDivider(u'')) main_lay.addLayout(btn_layout) main_lay.addSpacing(20) self.setLayout(main_lay) dayu_theme.background_color = "#262626" dayu_theme.apply(self) # 设置默认值 self.tableWidget_operationNode.setHorizontalHeaderLabels( [u'操作', u'文件名', u'时间']) # 设置资产操作记录表: colUser = userdb[self.username] userlist = colUser.find({}, {"FileName": 1, "Operation": 1, "Time": 1}) i = 0 for xdir in userlist: if "Operation" in xdir: str1 = xdir["Operation"] newItem1 = QTableWidgetItem(str1) self.tableWidget_operationNode.setItem(i, 0, newItem1) if "FileName" in xdir: str2 = xdir["FileName"] newItem2 = QTableWidgetItem(str2) self.tableWidget_operationNode.setItem(i, 1, newItem2) if "Time" in xdir: str3 = xdir["Time"] newItem3 = QTableWidgetItem(str3) self.tableWidget_operationNode.setItem(i, 2, newItem3) i += 1 #设置默认值 pixmap = QtGui.QPixmap(hpPath + "\\" + self.username + ".jpg") self.label_headProfile.setPixmap(pixmap) self.let_username.setText(self.username) self.let_username.setReadOnly(True) #只读 self.let_ID.setReadOnly(True) # 只读 self.let_password.setReadOnly(True) # 只读 self.let_password.setEchoMode(QLineEdit.Password) #输入密码形式 # 从数据库提取ID for x in colUser.find({"_id": "UserID"}, {"UserID": 1}): ID = x["UserID"] self.let_ID.setText(ID) # 显示身份 self.let_password.setText("**********") #链接信号与槽 self.btn_changeHead.clicked.connect(lambda: self.editHeadProfile()) self.btn_ok.clicked.connect(lambda: self.ok()) self.btn_cancel.clicked.connect(lambda: self.cancel()) self.btn_changePassword.clicked.connect(lambda: self.changePassword()) self.btn_changeID.clicked.connect(lambda: self.setID()) #修改头像 def editHeadProfile(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() imgPath = imgPaths[0] self.editHeadProfileWin = headProfieWindow(imgPath) self.editHeadProfileWin.show() self.editHeadProfileWin.hPOK_signal.connect( lambda: self.setPicture()) #选中图片,更新头像 self.editHeadProfileWin.hPOK_signal.connect(lambda: self.setWCHP()) #设置头像图片 def setPicture(self): pixmap = QtGui.QPixmap(file_path + r"\res\headPortrial\buffer.jpg") self.label_headProfile.setPixmap(pixmap) def ok(self): # 保存头像 if self.wchp: saveHeadPorfile(self.username, file_path + r"\res\headPortrial\buffer.jpg") if self.wcpw: self.setPassword() self.saveChangePasswordNode(self.username) if self.wcid: colUser = userdb[self.username] # 从数据库提取ID for x in colUser.find({"_id": "UserID"}, {"UserID": 1}): ID = x["UserID"] oldD = {"UserID": ID} newD = {"$set": {"UserID": self.let_ID.text()}} x = colUser.update_many(oldD, newD) self.editUser_signal.emit() #发射确认修改信号 self.slot_show_message(MMessage.success, (u'成功修改用户信息')) self.close() def cancel(self): self.close() def setWCHP(self): self.wchp = True def changePassword(self): self.let_password.setReadOnly(False) self.wcpw = True def setPassword(self): newPassword = self.let_password.text() if not newPassword: msgBox = QMessageBox() msgBox.setText(u'请输入密码!') msgBox.exec_() return 0 colUser = userdb[self.username] # 从数据库提取密码 for x in colUser.find({"_id": "Password"}, {"Password": 1}): if "Password" in x: DBpassword = x["Password"] oldD = {"Password": DBpassword} newD = {"$set": {"Password": newPassword}} x = colUser.update_many(oldD, newD) def setID(self): self.key = self.let_key.text() if self.key == "IDO": if self.let_ID.text() == u"普通用户": self.let_ID.setText(u"管理员") elif self.let_ID.text() == u"管理员": self.let_ID.setText(u"普通用户") self.wcid = True def saveChangePasswordNode(self, username): RTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) # 将浏览信息存入用户数据库 col = userdb[username] dict = {"Operation": "ChangePassword", "Time": RTime} col.insert_one(dict) # def changeUsername(self): # self.let_username.setReadOnly(False) # self.wcun = True # def setUsername(self): # newname = self.let_username.text() # collist = userdb.list_collection_names() # if newname in collist: # print("The username already exists") # return 0 # 弹出信息提示窗口 def slot_show_message(self, func, config): func(config, parent=self)
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) # 显示身份
class CenterWindow(QWidget): """中心窗口类""" load_view_signal = Signal(str, str, str) #加载参数面板的信号 def __init__(self): super(CenterWindow,self).__init__() self.setObjectName("CenterWindow") self.fileList = [] # 保存当前选择标签下的文件列表 self.tag = "" # 保存当前标签 self.tableWidget_show = True # tableWidget窗口是否显示 self.row = 0 # 定位添加标签 self.column = 0 self.setupUI() # 设置tablewidget self.tableWidget = self.ui.findChild(QTableWidget, "tableWidget") self.tableWidget.setMaximumHeight(Data.getWindowHeight()/5) self.setTableWidget() self.tableWidget.setStyleSheet(Data.getQSS()) self.tableWidget.setStyleSheet("background-color: #323232") self.searchWidget = self.ui.findChild(QWidget, "widget_2") self.search_engine_line_edit = MLineEdit().search_engine().large() dayu_theme.apply(self.search_engine_line_edit) self.searchWidget.setLayout(QHBoxLayout()) self.searchWidget.layout().addWidget(self.search_engine_line_edit) self.slider = MSlider(Qt.Horizontal) self.slider.setMaximumWidth(Data.getWindowWidth()/4) self.slider.setValue(50) self.slider.setRange(1, 100) dayu_theme.apply(self.slider) self.searchWidget.layout().addWidget(self.slider) self.button_tag = MToolButton().svg('detail_line.svg').icon_only() self.button_tag.setEnabled(True) self.button_del = MToolButton().svg('trash_line.svg').icon_only() self.button_del.setCheckable(True) dayu_theme.apply(self.button_del) dayu_theme.apply(self.button_tag) self.searchWidget.layout().addWidget(self.button_tag) self.searchWidget.layout().addWidget(self.button_del) self.slider.valueChanged.connect(self.changeBtnSize) self.button_tag.clicked.connect(self.showTableWidget) self.button_del.clicked.connect(self.deleteTag) self.search_engine_line_edit.returnPressed.connect(self.on_searchBtn_click) self.setThread() # 设置UI界面 def setupUI(self): self.setWindowTitle("浏览窗口") self.ui = loadUi(file_path + "\\res\\UI\\CenterWidget.ui") self.ui.setParent(self) self.setLayout(QVBoxLayout()) self.layout().addWidget(self.ui) self.layout().setContentsMargins(0,0,0,0) self.child_widget = self.ui.findChild(QWidget, "widget") # 设置选择窗口 self.widget = SelWidget() layout = QVBoxLayout() self.child_widget.setLayout(layout) self.child_widget.layout().addWidget(self.widget) self.flowLayout = layouitflow.FlowLayout() self.widget.setLayout(self.flowLayout) #瀑布流布局 self.widget.layout().setSpacing(0) #设置间距 # 设置TableWidget def setTableWidget(self): self.tableWidget.setRowCount(5) self.tableWidget.setColumnCount(10) # QHeaderView.setSectionResizeMode(self.tableWidget.horizontalHeader(),QHeaderView.Stretch) # 自适应 # QHeaderView.setSectionResizeMode(self.tableWidget.verticalHeader(),QHeaderView.Stretch) setSectionResizeMode(self.tableWidget.horizontalHeader(),QHeaderView.Stretch) # 自适应 setSectionResizeMode(self.tableWidget.verticalHeader(),QHeaderView.Stretch) self.tableWidget.cellClicked.connect(self.setCenter) #从标签数据库加载数据 colTag = tagdb["tagcol"] try: for x in colTag.find({}, {"Tag": 1}): tag = x["Tag"] self.setTag(tag) except: pass # 获取标签之后设置中心窗口资源 def setCenter(self, row, column): try: #只能打开已经设置标签的 self.addSource(self.tableWidget.item(row, column).text()) except: return # 根据标签从数据库读取文件内容 def addSource(self, tag): # 清除当前窗口的文件列表 self.fileList = [] self.tag = tag #清除原有组件 for i in range(self.widget.layout().count()): self.widget.layout().itemAt(i).widget().deleteLater() collist = tagfiledb.list_collection_names() # 标签文件数据库里集合名列表 for tagx in collist: if tag == tagx: tagfilecolx = tagfiledb[tag] filenamelistx = tagfilecolx.find({}, {"FileName":1}) for x in filenamelistx: filename = x["FileName"] filetype = filename.split(".")[-1] assetdb = client[filetype] collist = assetdb.list_collection_names() # 资产数据库里集合名列表 for file in collist: # 取出资产数据库里单个列表名,即为文件名 assetPathlist = assetdb[file].find({"_id": "Path"}, {"Path": 1}) pathdic = assetPathlist[0] path = pathdic["Path"] if(path.split("/")[-1] == filename): self.addFile(path, filetype, file) self.fileList.append(path) break # 添加按钮 def addFile(self, path, type, name): myBtnWin = btnWin.btnWin(path,type,name) value = (float(self.slider.value()) + 50) / 100 width = height = value * Data.getWindowWidth() / 8 myBtnWin.setMinimumSize(width, height) myBtnWin.setMaximumSize(width, height) myBtnWin.btn_clicked_signal.connect(self.setView) self.widget.layout().addWidget(myBtnWin) # 设置标签 def setTag(self, tag): if(tag.isspace()==False and tag !=""): newItem = QTableWidgetItem(tag) newItem.setTextAlignment(QtCore.Qt.AlignCenter) self.tableWidget.setItem(self.row, self.column, newItem) if (self.column == 9 and self.row == 5): return elif (self.column == 9): self.row += 1 self.column = 0 else: self.column += 1 # 添加标签 def addTag(self, tag): tags = [] for row in range(0, 4): for column in range(0, 9): try: tags.append(self.tableWidget.item(row, column).text()) except: continue if(tag.isspace()==False and tag not in tags and tag !=""): newItem = QTableWidgetItem(tag) newItem.setTextAlignment(QtCore.Qt.AlignCenter) self.tableWidget.setItem(self.row, self.column, newItem) if (self.column == 9 and self.row == 5): return elif (self.column == 9): self.row += 1 self.column = 0 else: self.column += 1 # 滑动Slider,改变按钮大小 def changeBtnSize(self): btnList = self.widget.findChildren(btnWin.btnWin) value = (float(self.slider.value()) + 50) / 100 width = height = value * Data.getWindowWidth() / 8 for btn in btnList: btn.setMinimumSize(width, height) btn.setMaximumSize(width, height) # 设置tableWidget的显示与隐藏 def showTableWidget(self): if (self.tableWidget_show == False): self.tableWidget.setMaximumHeight(Data.getWindowHeight() / 5) self.tableWidget_show = True else: self.tableWidget.setMaximumHeight(0) self.tableWidget_show = False # 搜索按钮按下 def on_searchBtn_click(self): self.search_engine_line_edit.returnPressed.disconnect(self.on_searchBtn_click) #清除原有组件 for i in range(self.widget.layout().count()): self.widget.layout().itemAt(i).widget().deleteLater() import time time.sleep(2) self.thread.start() # 重新根据搜索加载按钮 def endthread(self): #获取输入 search_text = self.search_engine_line_edit.text() # 获取与输入比较的文件名字 matches = [] dir_index = {} # 用于保存文件名和它的对应索引 index = 0 # 文件对应的索引值,用于排序 file_asset = [] typelist = alldoccol.find({}, {"Type":1}) for alltype in typelist: #读取文件类型库里文件类型名 typename = alltype["Type"] assetdb = client[typename] #获得文件类型名对应的资产数据库 collist = assetdb.list_collection_names() #资产数据库里集合名列表 for file in collist: #取出资产数据库里单个列表名,即为文件名 assetcol = assetdb[file] filePathList = assetcol.find({"_id": "Path"}, {"Path": 1}) for filePathTup in filePathList: if "Path" in filePathTup: filePath = filePathTup["Path"] file_asset.append(filePath) for file in self.fileList: name = file.split("/")[-1] matches.append(name) dir_index[name] = index index += 1 # 根据搜索相关性重新排列 ratio = lambda x, y: difflib.SequenceMatcher(None, x, y).ratio() matches = sorted(matches, key=lambda x: ratio(x, search_text), reverse=True) # 按照排列重新添加资源 for name in matches: key = self.fileList[dir_index[name]] filename = os.path.basename(key) type = filename.split(".")[-1] self.addFile(key, type, filename) self.search_engine_line_edit.returnPressed.connect(self.on_searchBtn_click) #设置一个新的线程来显示加载动画 def setThread(self): #防止多次调用线程 self.thread = MFetchDataThread(self) self.thread.started.connect(self.addCircle) self.thread.finished.connect(self.removeCircle) self.thread.finished.connect(self.endthread) def addCircle(self): try: self.win = QWidget() self.win.setMinimumSize(self.child_widget.width()/1.05,self.child_widget.height()/1.1) self.loading_wrapper = MLoading.huge() self.win.setLayout(QHBoxLayout()) self.win.layout().addWidget(self.loading_wrapper) self.widget.layout().addWidget(self.win) except: pass def removeCircle(self): try: self.win.deleteLater() import time time.sleep(2) except: pass def deleteTag(self): username = User.UserPanel.CorrectUserName userID = None if username == None: self.slot_show_message(MMessage.error, (u'请先登陆!')) return 0 else: usercol = userdb[username] userIDlist = usercol.find({"_id": "UserID"}, {"UserID": 1}) for userIDDic in userIDlist: if "UserID" in userIDDic: userID = userIDDic["UserID"] else: userID = None if userID == u"管理员": delDic = {"Tag":self.tag} tagcol.delete_one(delDic) #删除标签库里的该标签 tagfilecol = tagfiledb[self.tag] RTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) filenamelist = tagfilecol.find({}, {"FileName":1}) for filenameDic in filenamelist: if "FileName" in filenameDic: filename = filenameDic["FileName"] type = filename.split(".")[-1] assetdb = client[type] assetcol = assetdb[filename] assetcol.delete_one(delDic) #删除所有含有该标签的文件里的该标签。 dict = {"Time": RTime, "Operation": u"删除标签", "UserName": username} #保存删除记录到资产数据库 assettaglist = assetcol.find({}, {"Tag": 1}) taglist = [] for x in assettaglist: if "Tag" in x: taglist.append(x) if len(taglist) == 0: assetcol.drop() tagfilecol.drop() #删除标签文件库里的该标签集合 dict = {"Time": RTime, "Operation": u"删除标签", "FileName": self.tag} usercol.insert_one(dict) #保存删除记录到用户数据库 self.slot_show_message(MMessage.error, (u'删除成功')) self.resetTableWidget() else: self.slot_show_message(MMessage.error, (u'只有管理员才可以删除标签')) # 弹出信息提示窗口 def slot_show_message(self, func, config): func(config, parent=self) # 按钮点击,发送信号到主窗口 def setView(self, type, name, path): self.load_view_signal.emit(type,name,path) def resetTableWidget(self): tagdb = client["tagdb"] # 标签数据库 tagcol = tagdb["tagcol"] # 标签集合 taglist = tagcol.find({}, {"Tag": 1}) tags = [] for tagdic in taglist: if "Tag" in tagdic: tags.append(tagdic["Tag"]) # 重新设置标签 self.tableWidget.clearContents() self.row, self.column = 0, 0 # 根据标签添加按钮 for tag in tags: self.setTag(tag)