from PySide2.QtUiTools import QUiLoader from PySide2.QtWidgets import * from PySide2.QtCore import * from PySide2.QtGui import * from PySide2.QtUiTools import QUiLoader # from main_windows import MainWindow from ui.ui_TimingAnalyze import Ui_TimingWindow from ui.ui_Form import Ui_Form from ui.ui_SideBar import Ui_SideBar import GuiType class MultiFormWin(Ui_Form,QMainWindow): def __init__(self, mdiArea) -> None: super().__init__() self.setupUi(self) self.setParent(mdiArea) self.init_multi_form_ui(mdiArea) self.models = [] self.reportButton.clicked.connect(self.report_table) def report_table(self): print("report test") def init_multi_form_ui(self,mdiArea:QMdiArea): self.horizontalLayout_2 = QHBoxLayout() self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") self.sheets = QComboBox(self.centralwidget) self.sheets.setObjectName(u"sheets") sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.sheets.sizePolicy().hasHeightForWidth()) self.sheets.setSizePolicy(sizePolicy) self.horizontalLayout_2.addWidget(self.sheets) self.horizontalSpacer_3 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_2.addItem(self.horizontalSpacer_3) self.horizontalLayout_2.setStretch(0, 3) self.horizontalLayout_2.setStretch(1, 6) self.verticalLayout.insertLayout(0,self.horizontalLayout_2) mdiArea.addSubWindow(self) # mdiArea.currentSubWindow self.show() class TreeWidgetItem(QTreeWidgetItem): def __init__(self, parent: int, tree_row:GuiType._GuiTreeRow): super().__init__(parent) self.tree_row = tree_row class SideBarWin(Ui_SideBar, QMainWindow): def __init__(self, ui, instance:GuiType._GuiSideBar) -> None: super().__init__() self.setupUi(self) self.ui = ui mdiArea:QMdiArea = ui.mdiArea # self.mdisubwin 是用于管理子窗口的,在子窗口中,是由 mdiArea 来管理显示/隐藏、大小、关闭等 self.mdisubwin = mdiArea.addSubWindow(self) self.mdisubwin.setAttribute(Qt.WA_DeleteOnClose) self.mdisubwin.resize(self.width(), mdiArea.height()) self.mdisubwin.show() self.instance = instance self.init_win_data(instance) self.form_multi_temp = None self.treeWidget.itemExpanded.connect(self.expand_tree) self.treeWidget.itemCollapsed.connect(self.collapse_tree) self.treeWidget.itemActivated.connect(self.activated_tree_node) self.sheets.activated.connect(self.activate_table_sheet) # 侧边栏只有一个,只需要 update 即可 def init_win_data(self, instance:GuiType._GuiSideBar): if self.treeWidget.topLevelItemCount(): for i in range(self.treeWidget.topLevelItemCount()): # 获取这个 item 并删除 self.treeWidget.takeTopLevelItem(i) self.ui.setWindowTitle(self.ui.GUI.Title) self.instance = instance self.setWindowTitle(self.instance.Title) self.set_tree(self.instance.Tree) self.mdisubwin.update() # 添加一行树节点,改节点包含 n 列数据 def add_tree_row(self, parent, tree_row:GuiType._GuiTreeRow): item = TreeWidgetItem(parent, tree_row) item.setText(0,tree_row.Name) for i in range(0, len(tree_row.Row)): item.setText(i+1,tree_row.Row[i]) return item def activated_tree_node(self, item:TreeWidgetItem, column): # 如果含有子节点,由展开信号来处理 if item.tree_row.HasSubTreeRows: return self.form_multi_temp = self.instance.GetForms(list(item.text(0))) self.set_form_multi(self.form_multi_temp) def collapse_tree(self, item:TreeWidgetItem): # 取出并删除所有子节点 childrens = item.takeChildren() if not childrens: return if item.tree_row.HasSubTreeRows: # 只添加一个子节点,让父节点变成可展开形式 sub_tree_row:GuiType._GuiTreeRow = item.tree_row.GetSubTreeRows()[0] self.add_tree_row(item, sub_tree_row) # if item.tree_row.HasSubTreeRows: # sub_tree_rows = item.tree_row.GetSubTreeRows()[1:] # for row in sub_tree_rows: # self.set_tree_row(item, row) def expand_tree(self, item:TreeWidgetItem): if item.tree_row.HasSubTreeRows: sub_tree_rows = item.tree_row.GetSubTreeRows()[1:] for row in sub_tree_rows: self.set_tree_row(item, row) def activate_table_sheet(self, index): self.set_form(self.form_multi_temp.GetForm(index)) def set_tree_row(self, parent:TreeWidgetItem, tree_row:GuiType._GuiTreeRow): tree_widget_item = self.add_tree_row(parent, tree_row) if tree_row.HasSubTreeRows: # 只添加一个子节点,让父节点变成可展开形式 sub_tree_row:GuiType._GuiTreeRow = tree_row.GetSubTreeRows()[0] self.add_tree_row(tree_widget_item, sub_tree_row) def set_tree(self, tree:GuiType._GuiTree): # 树 header_item = self.treeWidget.headerItem() for i in range(len(tree.FixedRow)): header_item.setText(i, tree.FixedRow[i]) for tree_row in tree.TreeRows: # 根节点 self.set_tree_row(self.treeWidget, tree_row) def set_form(self, form:GuiType._GuiForm): model = QStandardItemModel(0, len(form.FixedRow)) model.setHorizontalHeaderLabels(form.FixedRow) for row in form.Rows: row_items=[QStandardItem(text) for text in row] model.appendRow(row_items) self.tableView.setModel(model) return model def set_form_multi(self, multi_form:GuiType._GuiFormMulti): self.sheets.clear() for sheet_name in multi_form.Names: self.sheets.addItem(sheet_name) if self.sheets.count() > 0: form = multi_form.GetForm(self.sheets.currentIndex()) self.set_form(form) class SubWindows(QObject): sig = Signal(object) def __init__(self, parent): super().__init__(parent) self.ui = parent self.side_bar = SideBarWin(self.ui, self.ui.GUI.SideBar) self.info = {} def add_win_form_multi(self, instance:GuiType._GuiWinFormMulti): form_multi_win = MultiFormWin(self.ui.mdiArea) # form_multi_win:Ui_form_multi # self.ui.mdiArea.addSubWindow(form_multi_win) form_multi_win.setWindowTitle(instance.Title) # form_multi_win.sheets.currentIndexChanged.connect(lambda:self.change_table_sheet(form_multi_win)) form_multi_win.sheets.currentIndexChanged.connect(lambda:self.change_table_sheet(form_multi_win)) self.set_form_multi_table(form_multi_win,instance.Forms) self.ui.mdiArea.activeSubWindow().resize(self.ui.mdiArea.width()/2,self.ui.mdiArea.height()) self.ui.mdiArea.activeSubWindow().move(form_multi_win.width(),0) def set_form_multi_table(self, win:MultiFormWin, multi_form:GuiType._GuiFormMulti): multi_form:GuiType._GuiFormMulti for i in range(len(multi_form.Names)): sheet_name = multi_form.Names[i] form:GuiType._GuiForm = multi_form.GetForm(i) model = QStandardItemModel(0, len(form.FixedRow)) model.setHorizontalHeaderLabels(form.FixedRow) for row in form.Rows: row_items=[QStandardItem(text) for text in row] model.appendRow(row_items) win.sheets.addItem(sheet_name) # win.sheets.currentText() # win win.models.append(model) if win.sheets.count() > 0: win.sheets.setCurrentIndex(0) win.tableView.setModel(win.models[0]) def change_table_sheet(self, win:MultiFormWin): if not win.models: return win.tableView.setModel(win.models[win.sheets.currentIndex()]) def add_windows(self, instance): if isinstance(instance, GuiType._GuiWinFormMulti): self.add_win_form_multi(instance) elif isinstance(instance, GuiType._GuiSideBar): self.side_bar.init_win_data(instance) if __name__ == '__main__': m = GuiType._GuiWinFormMulti('multi', 1)