sub_windows.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. from PySide2.QtUiTools import QUiLoader
  2. from PySide2.QtWidgets import *
  3. from PySide2.QtCore import *
  4. from PySide2.QtGui import *
  5. from PySide2.QtUiTools import QUiLoader
  6. # from main_windows import MainWindow
  7. from ui.ui_TimingAnalyze import Ui_TimingWindow
  8. from ui.ui_Form import Ui_Form
  9. from ui.ui_SideBar import Ui_SideBar
  10. import GuiType
  11. class MultiFormWin(Ui_Form,QMainWindow):
  12. def __init__(self, mdiArea) -> None:
  13. super().__init__()
  14. self.setupUi(self)
  15. self.setParent(mdiArea)
  16. self.init_multi_form_ui(mdiArea)
  17. self.models = []
  18. self.reportButton.clicked.connect(self.report_table)
  19. def report_table(self):
  20. print("report test")
  21. def init_multi_form_ui(self,mdiArea:QMdiArea):
  22. self.horizontalLayout_2 = QHBoxLayout()
  23. self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
  24. self.sheets = QComboBox(self.centralwidget)
  25. self.sheets.setObjectName(u"sheets")
  26. sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
  27. sizePolicy.setHorizontalStretch(0)
  28. sizePolicy.setVerticalStretch(0)
  29. sizePolicy.setHeightForWidth(self.sheets.sizePolicy().hasHeightForWidth())
  30. self.sheets.setSizePolicy(sizePolicy)
  31. self.horizontalLayout_2.addWidget(self.sheets)
  32. self.horizontalSpacer_3 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
  33. self.horizontalLayout_2.addItem(self.horizontalSpacer_3)
  34. self.horizontalLayout_2.setStretch(0, 3)
  35. self.horizontalLayout_2.setStretch(1, 6)
  36. self.verticalLayout.insertLayout(0,self.horizontalLayout_2)
  37. mdiArea.addSubWindow(self)
  38. # mdiArea.currentSubWindow
  39. self.show()
  40. class TreeWidgetItem(QTreeWidgetItem):
  41. def __init__(self, parent: int, tree_row:GuiType._GuiTreeRow):
  42. super().__init__(parent)
  43. self.tree_row = tree_row
  44. class SideBarWin(Ui_SideBar, QMainWindow):
  45. def __init__(self, ui, instance:GuiType._GuiSideBar) -> None:
  46. super().__init__()
  47. self.setupUi(self)
  48. self.ui = ui
  49. mdiArea:QMdiArea = ui.mdiArea
  50. # self.mdisubwin 是用于管理子窗口的,在子窗口中,是由 mdiArea 来管理显示/隐藏、大小、关闭等
  51. self.mdisubwin = mdiArea.addSubWindow(self)
  52. self.mdisubwin.setAttribute(Qt.WA_DeleteOnClose)
  53. self.mdisubwin.resize(self.width(), mdiArea.height())
  54. self.mdisubwin.show()
  55. self.instance = instance
  56. self.init_win_data(instance)
  57. self.form_multi_temp = None
  58. self.treeWidget.itemExpanded.connect(self.expand_tree)
  59. self.treeWidget.itemCollapsed.connect(self.collapse_tree)
  60. self.treeWidget.itemActivated.connect(self.activated_tree_node)
  61. self.sheets.activated.connect(self.activate_table_sheet)
  62. # 侧边栏只有一个,只需要 update 即可
  63. def init_win_data(self, instance:GuiType._GuiSideBar):
  64. if self.treeWidget.topLevelItemCount():
  65. for i in range(self.treeWidget.topLevelItemCount()):
  66. # 获取这个 item 并删除
  67. self.treeWidget.takeTopLevelItem(i)
  68. self.ui.setWindowTitle(self.ui.GUI.Title)
  69. self.instance = instance
  70. self.setWindowTitle(self.instance.Title)
  71. self.set_tree(self.instance.Tree)
  72. self.mdisubwin.update()
  73. # 添加一行树节点,改节点包含 n 列数据
  74. def add_tree_row(self, parent, tree_row:GuiType._GuiTreeRow):
  75. item = TreeWidgetItem(parent, tree_row)
  76. item.setText(0,tree_row.Name)
  77. for i in range(0, len(tree_row.Row)):
  78. item.setText(i+1,tree_row.Row[i])
  79. return item
  80. def activated_tree_node(self, item:TreeWidgetItem, column):
  81. # 如果含有子节点,由展开信号来处理
  82. if item.tree_row.HasSubTreeRows:
  83. return
  84. self.form_multi_temp = self.instance.GetForms(list(item.text(0)))
  85. self.set_form_multi(self.form_multi_temp)
  86. def collapse_tree(self, item:TreeWidgetItem):
  87. # 取出并删除所有子节点
  88. childrens = item.takeChildren()
  89. if not childrens:
  90. return
  91. if item.tree_row.HasSubTreeRows:
  92. # 只添加一个子节点,让父节点变成可展开形式
  93. sub_tree_row:GuiType._GuiTreeRow = item.tree_row.GetSubTreeRows()[0]
  94. self.add_tree_row(item, sub_tree_row)
  95. # if item.tree_row.HasSubTreeRows:
  96. # sub_tree_rows = item.tree_row.GetSubTreeRows()[1:]
  97. # for row in sub_tree_rows:
  98. # self.set_tree_row(item, row)
  99. def expand_tree(self, item:TreeWidgetItem):
  100. if item.tree_row.HasSubTreeRows:
  101. sub_tree_rows = item.tree_row.GetSubTreeRows()[1:]
  102. for row in sub_tree_rows:
  103. self.set_tree_row(item, row)
  104. def activate_table_sheet(self, index):
  105. self.set_form(self.form_multi_temp.GetForm(index))
  106. def set_tree_row(self, parent:TreeWidgetItem, tree_row:GuiType._GuiTreeRow):
  107. tree_widget_item = self.add_tree_row(parent, tree_row)
  108. if tree_row.HasSubTreeRows:
  109. # 只添加一个子节点,让父节点变成可展开形式
  110. sub_tree_row:GuiType._GuiTreeRow = tree_row.GetSubTreeRows()[0]
  111. self.add_tree_row(tree_widget_item, sub_tree_row)
  112. def set_tree(self, tree:GuiType._GuiTree):
  113. # 树
  114. header_item = self.treeWidget.headerItem()
  115. for i in range(len(tree.FixedRow)):
  116. header_item.setText(i, tree.FixedRow[i])
  117. for tree_row in tree.TreeRows:
  118. # 根节点
  119. self.set_tree_row(self.treeWidget, tree_row)
  120. def set_form(self, form:GuiType._GuiForm):
  121. model = QStandardItemModel(0, len(form.FixedRow))
  122. model.setHorizontalHeaderLabels(form.FixedRow)
  123. for row in form.Rows:
  124. row_items=[QStandardItem(text) for text in row]
  125. model.appendRow(row_items)
  126. self.tableView.setModel(model)
  127. return model
  128. def set_form_multi(self, multi_form:GuiType._GuiFormMulti):
  129. self.sheets.clear()
  130. for sheet_name in multi_form.Names:
  131. self.sheets.addItem(sheet_name)
  132. if self.sheets.count() > 0:
  133. form = multi_form.GetForm(self.sheets.currentIndex())
  134. self.set_form(form)
  135. class SubWindows(QObject):
  136. sig = Signal(object)
  137. def __init__(self, parent):
  138. super().__init__(parent)
  139. self.ui = parent
  140. self.side_bar = SideBarWin(self.ui, self.ui.GUI.SideBar)
  141. self.info = {}
  142. def add_win_form_multi(self, instance:GuiType._GuiWinFormMulti):
  143. form_multi_win = MultiFormWin(self.ui.mdiArea)
  144. # form_multi_win:Ui_form_multi
  145. # self.ui.mdiArea.addSubWindow(form_multi_win)
  146. form_multi_win.setWindowTitle(instance.Title)
  147. # form_multi_win.sheets.currentIndexChanged.connect(lambda:self.change_table_sheet(form_multi_win))
  148. form_multi_win.sheets.currentIndexChanged.connect(lambda:self.change_table_sheet(form_multi_win))
  149. self.set_form_multi_table(form_multi_win,instance.Forms)
  150. self.ui.mdiArea.activeSubWindow().resize(self.ui.mdiArea.width()/2,self.ui.mdiArea.height())
  151. self.ui.mdiArea.activeSubWindow().move(form_multi_win.width(),0)
  152. def set_form_multi_table(self, win:MultiFormWin, multi_form:GuiType._GuiFormMulti):
  153. multi_form:GuiType._GuiFormMulti
  154. for i in range(len(multi_form.Names)):
  155. sheet_name = multi_form.Names[i]
  156. form:GuiType._GuiForm = multi_form.GetForm(i)
  157. model = QStandardItemModel(0, len(form.FixedRow))
  158. model.setHorizontalHeaderLabels(form.FixedRow)
  159. for row in form.Rows:
  160. row_items=[QStandardItem(text) for text in row]
  161. model.appendRow(row_items)
  162. win.sheets.addItem(sheet_name)
  163. # win.sheets.currentText()
  164. # win
  165. win.models.append(model)
  166. if win.sheets.count() > 0:
  167. win.sheets.setCurrentIndex(0)
  168. win.tableView.setModel(win.models[0])
  169. def change_table_sheet(self, win:MultiFormWin):
  170. if not win.models:
  171. return
  172. win.tableView.setModel(win.models[win.sheets.currentIndex()])
  173. def add_windows(self, instance):
  174. if isinstance(instance, GuiType._GuiWinFormMulti):
  175. self.add_win_form_multi(instance)
  176. elif isinstance(instance, GuiType._GuiSideBar):
  177. self.side_bar.init_win_data(instance)
  178. if __name__ == '__main__':
  179. m = GuiType._GuiWinFormMulti('multi', 1)