Explorar o código

新建动态窗口,同步添加Action到菜单栏-window中,
实现激活显示在最前端,
实现关闭动态窗口,移除 菜单栏-window 动作

mrh %!s(int64=3) %!d(string=hai) anos
pai
achega
ad9bf3cd0f
Modificáronse 4 ficheiros con 67 adicións e 45 borrados
  1. 11 8
      main_windows.py
  2. 56 35
      sub_windows.py
  3. 0 1
      ui/MainWindows.ui
  4. 0 1
      ui/ui_MainWindows.py

+ 11 - 8
main_windows.py

@@ -87,10 +87,14 @@ class MainWindow(Ui_MainWindow, QMainWindow):
         super().__init__()
         self.setupUi(self)
         # 这里显示一下是为了能获取到 mdiArea 的尺寸,给 sub_windows 使用
-        self.show()
         self.GUI = GUI
         self.setWindowTitle(GUI.Title)
-
+        self.show()
+        
+        sys.stdout = Stream()
+        sys.stdout.newText.connect(self.outputWritten)
+        sys.stderr = sys.stdout
+        
         self.btn_shell.setText(GUI.Prompt)
         self.btn_shell.clicked.connect(self.click_btn_sell)
         self.tabWidget.currentChanged.connect(self.table_widget_change)
@@ -127,8 +131,10 @@ class MainWindow(Ui_MainWindow, QMainWindow):
         self.actionReport_Exceptions.triggered.connect(self.about)
         self.actionReport_Virtual_Timing.triggered.connect(self.add_sub_win)
         # Windows
+        # 先实例一个 ActionGroup,等到创建动态窗口的时候,才会在 菜单栏-Window 中添加Action
         self.action_win_group = QActionGroup(self)
-        self.action_Hierarchy.setActionGroup(self.action_win_group)
+        # 获取分隔符,方便 菜单栏-Window-Action 插入到分隔符之前
+        self.action_win_separator = self.menuWindow.actions()[0]
         action_tabgroup = QActionGroup(self)
         self.actionLog.setActionGroup(action_tabgroup)
         self.actionHistory.setActionGroup(action_tabgroup)
@@ -140,9 +146,6 @@ class MainWindow(Ui_MainWindow, QMainWindow):
         self.actionAbout.triggered.connect(self.about)
         self.textEdit.document().contentsChanged.connect(self.textEdit_change_size)
         self.textEdit.document().contentsChange.connect(self.textEdit_change_contents)
-        sys.stdout = Stream()
-        sys.stdout.newText.connect(self.outputWritten)
-        sys.stderr = sys.stdout
                 
         self.sub_win = SubWindows(self)
         self.sub_win.sig.connect(self.sub_win.add_windows)
@@ -237,14 +240,14 @@ class MainWindow(Ui_MainWindow, QMainWindow):
             # 如果窗口已经存在,关闭窗口,以便重新更新数据
             if win:
                 win.close()
-            LineEditWin(self.mdiArea, win_line_text)
+            LineEditWin(self, win_line_text)
         elif action.text() == 'Properties':
             win_form = item.msg.Properties()
             # 如果窗口已经存在,关闭窗口,以便重新更新数据
             win = get_sub_win(self.mdiArea, FormWindow, win_form.Title)
             if win:
                 win.close()
-            FormWindow(self.mdiArea, win_form)
+            FormWindow(self, win_form)
     
     
     def show_message(self):

+ 56 - 35
sub_windows.py

@@ -45,24 +45,52 @@ def ensure_subwin_in_midarea(mdiArea:QMdiArea, win:QWidget, pos:QPoint):
     else:
         y = mdiArea.height() - win.height()
     return QPoint(x, y)
+
+# 动态窗口,初始化时会添加动作到 菜单栏 - window 中
+class MdiSubWindow(QMainWindow):
+    def __init__(self, mainWindow):
+        super().__init__(mainWindow)
+        self.mainWindow = mainWindow
+        self.regist_action(mainWindow)
+        # 修改窗口标题时同步修改menu-Action信息
+        self.windowTitleChanged.connect(lambda: self.menuWindow_action.setText(self.windowTitle()))
+        
+    def closeEvent(self, event: QCloseEvent):
+        self.mainWindow.menuWindow.removeAction(self.menuWindow_action)
+        return super().closeEvent(event)
+
+    def regist_action(self, mainWindow):
+        action = QAction(mainWindow)
+        action.setText(self.windowTitle())
+        mainWindow.menuWindow.insertAction(mainWindow.action_win_separator,action)
+        action.setActionGroup(mainWindow.action_win_group)
+        action.setCheckable(True)
+        action.setChecked(True)
+        action.triggered.connect(self.active_win)
+        self.menuWindow_action = action
     
+    def active_win(self):
+        self.hide()
+        self.show()
+
     
-class FormWindow(Ui_Form, QMainWindow):
-    def __init__(self, mdiArea:QMdiArea, instan:GuiType._GuiWinForm, pos:QPoint=None) -> None:
-        super().__init__(mdiArea)
+class FormWindow(Ui_Form, MdiSubWindow):
+    def __init__(self, mainWindow, instan:GuiType._GuiWinForm, pos:QPoint=None) -> None:
+        super().__init__(mainWindow)
         self.setupUi(self)
+        mdiArea:QMdiArea = mainWindow.mdiArea
         self.instan = instan
         self.setWindowTitle(instan.Title)
         self.tableView.setModel(FormWindow.get_form_model(self.instan.Form))
-        mdisubwin = mdiArea.addSubWindow(self)
-        mdisubwin.setAttribute(Qt.WA_DeleteOnClose)
         
+        self.mdisubwin:QMdiSubWindow = mainWindow.mdiArea.addSubWindow(self)
+        self.mdisubwin.setAttribute(Qt.WA_DeleteOnClose)
         # mdisubwin.move(mdiArea.x()+(mdiArea.width()-self.width())/2 + self.width()*0.8,mdiArea.y()+(mdiArea.height()-self.height())/2)
-        mdisubwin.show()
+        self.mdisubwin.show()
         # 必须要show之后才能 ensure_subwin_in_midarea,因为没有显示时Form窗口大小是不正确的
         # 移动到鼠标 pos 位置
         if pos:
-            mdisubwin.move(ensure_subwin_in_midarea(mdiArea, self, pos))
+            self.mdisubwin.move(ensure_subwin_in_midarea(mdiArea, self, pos))
         self.reportButton.clicked.connect(lambda: print(self.geometry()))
     
     def get_form_model(form:GuiType._GuiForm):
@@ -117,7 +145,6 @@ class MultiFormWin(FormWindow):
 
         self.verticalLayout.insertLayout(0,self.horizontalLayout_2)
         mdiArea.addSubWindow(self)
-        # mdiArea.currentSubWindow
         self.show()
 
 
@@ -126,19 +153,19 @@ class TreeWidgetItem(QTreeWidgetItem):
         super().__init__(parent)    
         self.tree_row = tree_row
 
-class LineEditWin(Ui_LineEdit, QMainWindow):
-    def __init__(self, mdiArea:QMdiArea, instance:GuiType._GuiWinLinedText) -> None:
-        super().__init__()
+class LineEditWin(Ui_LineEdit, MdiSubWindow):
+    def __init__(self, mainWindow, instance:GuiType._GuiWinLinedText) -> None:
+        super().__init__(mainWindow)
         self.setupUi(self)
         self.setWindowTitle(instance.Title)
-        
         self.textBrowser.textChanged.connect(self.__line_widget_line_count_changed)
         self.lineWidget = LineNumberWidget(self.textBrowser)
         self.horizontalLayout.insertWidget(0,self.lineWidget)
         self.instance = instance
         self.set_text(instance)
 
-        self.mdisubwin = mdiArea.addSubWindow(self)
+        mdiArea:QMdiArea = mainWindow.mdiArea
+        self.mdisubwin:QMdiSubWindow = mdiArea.addSubWindow(self)
         self.mdisubwin.setAttribute(Qt.WA_DeleteOnClose)
         self.mdisubwin.resize(self.width(), mdiArea.height())
         self.mdisubwin.show()
@@ -173,18 +200,11 @@ class LineEditWin(Ui_LineEdit, QMainWindow):
                 self.lineWidget.changeLineCount(n)
          
                 
-class SideBarWin(Ui_SideBar, QMainWindow):
+class SideBarWin(Ui_SideBar, MdiSubWindow):
     def __init__(self, ui, instance:GuiType._GuiSideBar) -> None:
-        super().__init__()
+        super().__init__(ui)
         self.setupUi(self)
         self.ui = ui
-        mdiArea:QMdiArea = ui.mdiArea
-        self.mdiArea = 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_instan = None
@@ -194,6 +214,14 @@ class SideBarWin(Ui_SideBar, QMainWindow):
         self.treeWidget.customContextMenuRequested.connect(self.right_click_menu)
         self.sheets.activated.connect(self.activate_table_sheet)
         self.tableView.customContextMenuRequested.connect(self.right_click_menu)
+        
+        mdiArea:QMdiArea = ui.mdiArea
+        self.mdiArea:QMdiArea = mdiArea
+        self.mdisubwin:QMdiSubWindow = mdiArea.addSubWindow(self)
+        self.mdisubwin.setAttribute(Qt.WA_DeleteOnClose)
+        # self.mdisubwin 是用于管理子窗口的,在子窗口中,是由 mdiArea 来管理显示/隐藏、大小、关闭等
+        self.mdisubwin.resize(self.width(), mdiArea.height())
+        self.mdisubwin.show()
     
     def right_click_menu(self, pos):
         sender = self.sender()
@@ -212,7 +240,11 @@ class SideBarWin(Ui_SideBar, QMainWindow):
     def add_crossprobe_win(self, sender):
         tree_names, formname, formrow = self.get_win_argument(sender)
         line_text = self.instance.CrossProbe(tree_names, formname, formrow)
-        self.lineEdit_win = LineEditWin(self.ui.mdiArea, line_text)
+        property_win:QMdiSubWindow = get_sub_win(self.mdiArea, LineEditWin, line_text.Title)
+        # 窗口已经存在
+        if property_win:
+            property_win.close()
+        self.lineEdit_win = LineEditWin(self.ui, line_text)
 
     def add_properties_win(self, sender:QWidget):
         tree_names, formname, formrow = self.get_win_argument(sender)
@@ -223,7 +255,7 @@ class SideBarWin(Ui_SideBar, QMainWindow):
             property_win.close()
         mouse_pos = QCursor().pos()
         pos = self.mdiArea.mapFromGlobal(mouse_pos)
-        form_window = FormWindow(self.mdiArea, win_form_instan, pos)
+        form_window = FormWindow(self.ui, win_form_instan, pos)
          
     def get_win_argument(self, sender):
         item = self.treeWidget.currentItem()
@@ -250,7 +282,6 @@ class SideBarWin(Ui_SideBar, QMainWindow):
         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):
@@ -317,13 +348,6 @@ class SideBarWin(Ui_SideBar, QMainWindow):
             # 根节点
             self.set_tree_row(self.treeWidget, tree_row)
 
-    # def get_form_model(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)
-    #     return model
         
     def set_form_multi(self, multi_form:GuiType._GuiFormMulti):
         self.sheets.clear()
@@ -345,10 +369,7 @@ class SubWindows(QObject):
     
     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())

+ 0 - 1
ui/MainWindows.ui

@@ -237,7 +237,6 @@
     <property name="title">
      <string>Window</string>
     </property>
-    <addaction name="action_Hierarchy"/>
     <addaction name="separator"/>
     <addaction name="actionLog"/>
     <addaction name="actionHistory"/>

+ 0 - 1
ui/ui_MainWindows.py

@@ -282,7 +282,6 @@ class Ui_MainWindow(object):
         self.menuReport.addAction(self.actionReport_Clocks)
         self.menuReport.addSeparator()
         self.menuReport.addAction(self.actionReport_Virtual_Timing)
-        self.menuWindow.addAction(self.action_Hierarchy)
         self.menuWindow.addSeparator()
         self.menuWindow.addAction(self.actionLog)
         self.menuWindow.addAction(self.actionHistory)