def _init_tree_item(self, data, tree_wg): for item_name, item in data.items(): tree_item = QTreeWidgetItem(tree_wg) parent_path = tree_wg.__getattribute__("node_name") tree_item.__setattr__("node_name", os.path.join(parent_path, item_name)) tree_item.setText(0, item_name) if isinstance(item, dict): if "专业列表" in list(item.keys()): item = item.get("专业列表") self._init_tree_item(item, tree_item)
def populate_geom_tree(self): ds = disks.get_disks() for d in ds: di = disks.get_disk(d) print(di) print(di.get("descr")) item = QTreeWidgetItem() item.setText(0, di["descr"]) item.__setattr__("di", di) if di.get("geomname").startswith("cd") == True: item.setIcon(0, QIcon.fromTheme('drive-optical')) elif di.get("geomname").startswith("da") == True: item.setIcon(0, QIcon.fromTheme('drive-removable-media')) else: item.setIcon(0, QIcon.fromTheme('drive-harddisk')) self.geomTreeWidget.addTopLevelItem(item) # Add the partitions that are on the hardware devices as children partitions = disks.get_partitions(di["name"]) if len(partitions) > 0: partitions.pop(0) for p in partitions: if p.name == None: continue child = QTreeWidgetItem() child.setText(0, (p.name + " " + p.type_or_label)) child.setFlags( Qt.ItemIsSelectable) # Make it greyed out here for now item.addChild(child) # In addition to hardware devices, also show ZFS zpools # Not entirely sure if this is the best place to do this in the UI,# # but zpools are neither strictly a child nor a parent of hardware devices... zpools = disks.get_zpools() if len(zpools) > 0: for zp in zpools: item = QTreeWidgetItem() item.setText(0, zp.name) if zp.health == "ONLINE": item.setIcon(0, QIcon.fromTheme('emblem-colors-green')) else: item.setIcon(0, QIcon.fromTheme('emblem-colors-white')) self.geomTreeWidget.addTopLevelItem(item) # Show the datasets (volumes, snapshots, file systems) on the zpool datasets = disks.get_datasets(zp.name) for dataset in datasets: child = QTreeWidgetItem() child.setText(0, (dataset)) child.setFlags( Qt.ItemIsSelectable) # Make it greyed out here for now item.addChild(child)
class VolunteerGui(QMainWindow): def __init__(self, data, parent=None): super(VolunteerGui, self).__init__(parent) self.data = data try: self._init_ui() except Exception as e: logger_current.error("初始化异常:%s" % e) self.setWindowIcon(QIcon(ICON_PATH)) self.setWindowTitle("填报专业--简易浏览器") def _init_ui(self): vlay_main = QVBoxLayout() vlay_main.setContentsMargins(0, 0, 0, 0) self.splitter = QSplitter(Qt.Horizontal) self._init_tree() self._init_content() vlay_main.addWidget(self.splitter) self.setCentralWidget(QWidget(self)) self.centralWidget().setLayout(vlay_main) def eventFilter(self, obj, evt): if isinstance(evt, QMouseEvent) and isinstance(obj, TreeWidget): self.slot_show_selected_item() return False def _init_tree(self): self.file_tree_wgt = TreeWidget() self.file_tree_wgt.setItemsExpandable(True) self.file_tree_wgt.header().setSectionResizeMode( QHeaderView.ResizeToContents) self.file_tree_wgt.header().setStretchLastSection(False) self.file_tree_wgt.header().close() self.file_tree_wgt.setMinimumSize(300, 570) self.file_tree_wgt.setMaximumWidth(450) self.file_tree_wgt.installEventFilter(self) self._load_data_2_tree() self.gbox_tree_view = QGroupBox() gbox_tree_view_vlay = QVBoxLayout() gbox_tree_view_vlay.addWidget(self.file_tree_wgt) self.gbox_tree_view.setLayout(gbox_tree_view_vlay) self.gbox_tree_view.setMaximumWidth(450) self.splitter.addWidget(self.gbox_tree_view) def _load_data_2_tree(self): self.file_name_layer = QTreeWidgetItem(self.file_tree_wgt) self.file_name_layer.__setattr__("node_name", "省份") self.file_name_layer.setText(0, "省份") self._init_tree_item(self.data, self.file_name_layer) def _init_tree_item(self, data, tree_wg): for item_name, item in data.items(): tree_item = QTreeWidgetItem(tree_wg) parent_path = tree_wg.__getattribute__("node_name") tree_item.__setattr__("node_name", os.path.join(parent_path, item_name)) tree_item.setText(0, item_name) if isinstance(item, dict): if "专业列表" in list(item.keys()): item = item.get("专业列表") self._init_tree_item(item, tree_item) def _init_content(self): self.content_wgt = QWidget() self.content_wgt.setMinimumSize(500, 570) vlay_content = QVBoxLayout(self.content_wgt) self.content_tab_wg = QTabWidget() vlay_content.addWidget(self.content_tab_wg) self.gbox_content_view = QGroupBox() gbox_content_view_vlay = QVBoxLayout() gbox_content_view_vlay.setContentsMargins(0, 0, 0, 0) gbox_content_view_vlay.addWidget(self.content_wgt) self.gbox_content_view.setMinimumSize(500, 570) self.gbox_content_view.setLayout(gbox_content_view_vlay) self.splitter.addWidget(self.gbox_content_view) def slot_show_selected_item(self): item = self.file_tree_wgt.currentItem() try: if not item: return loc = item.__getattribute__("node_name") node_list = loc.split("\\") if len(node_list) <= 6: # tab_view show_data = self.get_data_from_node_list(node_list[1:]) self.load_data_2_table(node_list[-1], show_data) else: url = self.get_data_from_node_list(node_list[1:]) self.load_data_2_web(url) except Exception as e: logger_current.error("点击项目树:%s, 异常:%s" % (item, e)) def get_data_from_node_list(self, node_list): origin_data = self.data if len(node_list) >= 5: node_list.insert(4, "专业列表") for item in node_list: if origin_data.get(item): origin_data = origin_data.get(item) return origin_data def slot_jump_2_web_page(self, model_idx): url = None try: if self.tab_page.model().data(model_idx) == "跳转": col = model_idx.column() url = self.tab_page.model().data( model_idx.siblingAtColumn(col - 1)) if not url.startswith("http"): addr = url.split(" ")[0] clip.OpenClipboard() clip.EmptyClipboard() clip.SetClipboardData(win32con.CF_UNICODETEXT, addr) clip.CloseClipboard() url = "https://map.baidu.com" self.load_data_2_web(url) except Exception as e: logger_current.error("点击数据表跳转:%s, 异常:%s" % (url, e)) def load_data_2_table(self, header_data, detail_data): try: if self.content_tab_wg.count() and self.content_tab_wg.widget( 0).__getattribute__("attr") == "tab": if self.tab_page.model(): self.tab_page.model().deleteLater() else: self.tab_page = QTableView() self.tab_page.clicked.connect(self.slot_jump_2_web_page) self.tab_page.__setattr__("attr", "tab") self.tab_page.setAlternatingRowColors(True) self.content_tab_wg.addTab(self.tab_page, "数据表页") col_num = 3 if [ x for x in list(detail_data.values()) if isinstance(x, str) ] else 2 row_num = len(detail_data) self.tab_page_model = QStandardItemModel(row_num, col_num) if col_num == 2: self.tab_page_model.setHorizontalHeaderLabels( [header_data, "项目"]) else: self.tab_page_model.setHorizontalHeaderLabels( [header_data, "项目", "查看详情"]) for col_idx in range(col_num): if col_idx == 0: # 第一列类别 for row_idx in range(row_num): self.tab_page_model.setItem( row_idx, col_idx, QStandardItem(list(detail_data.keys())[row_idx])) elif col_num == 2: # 无第三列,第二列显示子项 标题内容 col2_content = [ x for x in list(detail_data.values()) if isinstance(x, dict) and "标签" not in list( detail_data.keys()) and len(x) <= 10 ] if col2_content: for row_idx in range(row_num): self.tab_page_model.setItem( row_idx, col_idx, QStandardItem("、".join( map(self.strip_colon, col2_content[row_idx].keys())))) else: school_count_list = [] for x in detail_data.values(): if not x: school_count_list.append("") else: school_count_list.append(len(x)) for row_idx in range(row_num): self.tab_page_model.setItem( row_idx, col_idx, QStandardItem(str(school_count_list[row_idx]))) elif col_num == 3 and col_idx == 1: # 有第三列,第二列显示详情 for row_idx in range(row_num): school_content = list(detail_data.values())[row_idx] if isinstance(school_content, dict): school_content = "、".join(school_content.keys()) elif isinstance(school_content, list): school_content = "、".join(school_content) self.tab_page_model.setItem( row_idx, col_idx, QStandardItem(school_content)) elif col_num == 3 and col_idx == 2: # 有第三列,第三列跳转页面 for row_idx in range(row_num): school_content = list(detail_data.keys())[row_idx] if school_content not in ["专业列表", "标签", "优势专业"]: self.tab_page_model.setItem( row_idx, col_idx, QStandardItem("跳转")) self.tab_page.setModel(self.tab_page_model) self.tab_page.setEditTriggers(QTableView.NoEditTriggers) self.tab_page.horizontalHeader().setSectionResizeMode( QHeaderView.ResizeToContents) self.content_tab_wg.setCurrentIndex(0) except Exception as e: logger_current.error("更新数据表信息:%s, 异常:%s" % (header_data, e)) def load_data_2_web(self, url): try: if self.content_tab_wg.count() > 1 and self.content_tab_wg.widget( 1).__getattribute__("attr") == "web": self.web_page.load(QUrl(url)) self.content_tab_wg.setCurrentIndex(1) else: self.web_page = QWebEngineView() self.web_page.__setattr__("attr", "web") self.web_page.load(QUrl(url)) self.web_page.urlChanged.connect(self.slot_refresh_web_page) self.content_tab_wg.addTab(self.web_page, "网页搜索") self.content_tab_wg.setCurrentIndex(1) except Exception as e: logger_current.error("更新网页信息:%s, 异常:%s" % (url, e)) def slot_refresh_web_page(self, url): logger_current.info("访问:%s" % url.url()) @staticmethod def strip_colon(input_str): if input_str[-1] == ":": return input_str.rstrip(":") return input_str