def ui(self): super(RenamerView, self).ui() renamer_widget = QWidget() renamer_widget.setLayout( layouts.VerticalLayout(spacing=0, margins=(0, 0, 0, 0))) renamer_widget.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.main_layout.addWidget(renamer_widget) rename_layout = layouts.HorizontalLayout(spacing=2, margins=(0, 0, 0, 0)) rename_layout.setAlignment(Qt.AlignLeft) renamer_widget.layout().addLayout(rename_layout) self._base_name_cbx = checkbox.BaseCheckBox(parent=self) rename_layout.addWidget(self._base_name_cbx) self._renamer_line = lineedit.BaseLineEdit(parent=self) self._renamer_line.setPlaceholderText('New Name') rename_layout.addWidget(self._renamer_line) reg_ex = QRegExp("^(?!^_)[a-zA-Z_]+") text_validator = QRegExpValidator(reg_ex, self._renamer_line) self._renamer_line.setValidator(text_validator) self._renamer_btn = buttons.BaseButton(parent=self) self._renamer_btn.setIcon(resources.icon('rename')) rename_layout.addWidget(self._renamer_btn)
def ui(self): super(ManualJointOrientView, self).ui() manual_joint_ori_layout = layouts.HorizontalLayout() self._manual_joint_ori_x_spin = spinbox.DoubleSpinBoxAxis(axis='x', min=-360, max=360, parent=self) self._manual_joint_ori_y_spin = spinbox.DoubleSpinBoxAxis(axis='y', min=-360, max=360, parent=self) self._manual_joint_ori_z_spin = spinbox.DoubleSpinBoxAxis(axis='z', min=-360, max=360, parent=self) self._manual_joint_ori_x_spin.setDecimals(3) self._manual_joint_ori_y_spin.setDecimals(3) self._manual_joint_ori_z_spin.setDecimals(3) self._manual_joint_ori_reset_btn = buttons.BaseButton('Reset', parent=self) self._manual_joint_ori_reset_btn.setIcon(resources.icon('reset')) manual_joint_ori_layout.addWidget(self._manual_joint_ori_x_spin) manual_joint_ori_layout.addWidget(self._manual_joint_ori_y_spin) manual_joint_ori_layout.addWidget(self._manual_joint_ori_z_spin) manual_joint_ori_layout.addWidget(self._manual_joint_ori_reset_btn) manual_joint_splitter_layout = layouts.HorizontalLayout() manual_joint_splitter_layout.addStretch() self._degrees_checks = list() for degree in self._model.available_degrees: degree_radio = buttons.BaseRadioButton(str(degree), parent=self) manual_joint_splitter_layout.addWidget(degree_radio) self._degrees_checks.append(degree_radio) manual_joint_splitter_layout.addStretch() manual_joint_ori_buttons_layout = layouts.HorizontalLayout( spacing=5, margins=(2, 2, 2, 2)) self._manual_joint_ori_add_btn = buttons.BaseButton('Add', parent=self) self._manual_joint_ori_subtract_btn = buttons.BaseButton('Subract', parent=self) self._manual_joint_ori_set_btn = buttons.BaseButton('Set', parent=self) self._manual_joint_ori_set_cbx = checkbox.BaseCheckBox( 'Affect children', parent=self) self._manual_joint_ori_add_btn.setIcon(resources.icon('add')) self._manual_joint_ori_subtract_btn.setIcon(resources.icon('minus')) self._manual_joint_ori_set_btn.setIcon(resources.icon('equals')) manual_joint_ori_buttons_layout.addWidget( self._manual_joint_ori_add_btn) manual_joint_ori_buttons_layout.addWidget( self._manual_joint_ori_subtract_btn) manual_joint_ori_buttons_layout.addWidget( self._manual_joint_ori_set_btn) manual_joint_ori_buttons_layout.addWidget( self._manual_joint_ori_set_cbx) set_rot_axis_widget = QWidget() set_rot_axis_widget.setLayout(layouts.VerticalLayout()) set_rot_axis_widget.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) set_rot_axis_widget.layout().setContentsMargins(5, 5, 5, 5) set_rot_axis_widget.layout().setSpacing(10) self.main_layout.addLayout(manual_joint_splitter_layout) self.main_layout.addLayout(manual_joint_ori_layout) self.main_layout.addWidget(dividers.Divider()) self.main_layout.addLayout(manual_joint_ori_buttons_layout) self.main_layout.addWidget(set_rot_axis_widget)
def ui(self): super(InterpolatorWidget, self).ui() self.setFixedHeight(self.INTERP_HEIGHT) main_frame = base.BaseFrame(parent=self) main_frame.setFixedHeight(self.INTERP_HEIGHT) self.main_layout.addWidget(main_frame) main_widget = QWidget() main_widget.setLayout( layouts.VerticalLayout(spacing=5, margins=(5, 5, 5, 5))) main_widget.setFixedHeight(150) main_widget.setFixedWidth(400) graphics_scene = QGraphicsScene() graphics_view = QGraphicsView() graphics_view.setScene(graphics_scene) graphics_view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) graphics_view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) graphics_view.setFocusPolicy(Qt.NoFocus) graphics_view.setStyleSheet('QGraphicsView {border-style: none;}') graphics_view.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) main_frame.main_layout.addWidget(graphics_view) self._main_widget_proxy = graphics_scene.addWidget(main_widget) main_widget.setParent(graphics_view) title_layout = layouts.HorizontalLayout() select_layout = layouts.HorizontalLayout() button_layout = layouts.HorizontalLayout() slider_layout = layouts.HorizontalLayout() check_layout = layouts.HorizontalLayout() self._title_line = lineedit.BaseLineEdit(parent=self) self._close_btn = buttons.CloseButton('X', parent=self) title_layout.addWidget(self._title_line) title_layout.addWidget(self._close_btn) self._store_items_btn = buttons.BaseButton('Store Items', parent=self) self._clear_items_btn = buttons.BaseButton('Clear Items', parent=self) select_layout.addStretch() select_layout.addWidget(self._store_items_btn) select_layout.addWidget(self._clear_items_btn) select_layout.addStretch() self._store_start_btn = buttons.BaseButton('Store Start', parent=self) self._reset_item_btn = buttons.BaseButton('Reset', parent=self) self._store_end_btn = buttons.BaseButton('Store End', parent=self) button_layout.addWidget(self._store_start_btn) button_layout.addWidget(self._reset_item_btn) button_layout.addWidget(self._store_end_btn) self._start_label = label.BaseLabel('Start', parent=self) self._slider = sliders.BaseSlider(parent=self) self._slider.setRange(0, 49) self._slider.setOrientation(Qt.Horizontal) self._end_label = label.BaseLabel('End', parent=self) slider_layout.addWidget(self._start_label) slider_layout.addWidget(self._slider) slider_layout.addWidget(self._end_label) self._transforms_cbx = checkbox.BaseCheckBox('Transform', parent=self) self._user_attributes_cbx = checkbox.BaseCheckBox('UD Attributes', parent=self) check_layout.addStretch() check_layout.addWidget(self._transforms_cbx) check_layout.addWidget(self._user_attributes_cbx) check_layout.addStretch() main_widget.layout().addLayout(title_layout) main_widget.layout().addLayout(select_layout) main_widget.layout().addLayout(button_layout) main_widget.layout().addLayout(slider_layout) main_widget.layout().addLayout(check_layout)
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)