Qt Designer设计界面二,应用树结构和MDI区域


功能:

1.添加,删除,修改分组、节点

2.按钮来显示/隐藏界面某部分区域

3.MDI区域显示子窗口

效果图:

代码:

import sys
from threading import Thread
from PySide2.QtCore import Qt
from PySide2.QtWidgets import (QApplication, QWidget, QTreeWidgetItem, QMdiSubWindow, QDialog)
from display import Ui_Form
from video import Ui_Dialog

class video_dialog(QDialog, QMdiSubWindow):
    '''
    功能:子窗口
    '''
    def __init__(self):
        super(video_dialog, self).__init__()
        self.video_dialog = Ui_Dialog()
        self.video_dialog.setupUi(self)
        self.video_dialog.video_lbl.setFixedWidth(220)
        self.video_dialog.video_lbl.setFixedHeight(220)
        self.video_dialog.video_lbl.setScaledContents(True)


class UI(QWidget):

    def __init__(self):
        super(UI, self).__init__()
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.ui.display_btn.clicked.connect(self.display_area)
        self.ui.treeWidget.clicked.connect(self.on_tree_clicked)
        self.ui.add_btn.clicked.connect(self.addNode)
        self.ui.add_group_btn.clicked.connect(self.add_group)
        self.ui.del_btn.clicked.connect(self.delete_node)
        self.ui.tile_window_btn.clicked.connect(self.tile_window)
        self.ui.close_all_win_btn.clicked.connect(self.close_all_window)

        self.ui.treeWidget.expandAll()
        # 字典用于记录打开窗口,某窗口存在时为激活已存在窗口
        self.subDict = {}

    def tile_window(self):
        self.ui.mdiArea.tileSubWindows()

    def close_all_window(self):
        self.subDict = {}
        self.ui.mdiArea.closeAllSubWindows()

    def display_area(self):
        '''
        功能:通过按钮显示/隐藏某区域
        :return:
        '''
        if self.ui.display_btn.text() == '<<':
            self.ui.groupBox.setHidden(True)
            self.ui.display_btn.setText('>>')
        else:
            self.ui.groupBox.setHidden(False)
            self.ui.display_btn.setText('<<')

    def on_tree_clicked(self, index):
        '''
        功能:单击显示子窗口
        :param index:
        :return:
        '''
        item = self.ui.treeWidget.currentItem()
        if item.parent() == None:
            return
        win_title = item.text(0)
        if win_title in self.subDict.keys():
            try:
                self.subDict[win_title].setFocus()
                return
            except:
                pass
        self.video_ui = video_dialog()
        self.ui.mdiArea.addSubWindow(self.video_ui)
        self.video_ui.setWindowTitle(win_title)
        self.video_ui.show()
        self.subDict[win_title] = self.video_ui
        th = Thread(target = self.display)
        th.start()

    def display(self):
        item = self.ui.treeWidget.currentItem()
        self.video_ui.video_dialog.video_lbl.setText(item.text(0))

    def add_group(self):
        root = QTreeWidgetItem(self.ui.treeWidget)
        root.setText(0, '新分组')
        root.setFlags(root.flags() | Qt.ItemIsEditable)
        self.ui.treeWidget.expandAll()

    def delete_node(self):
        '''
        功能:单击选中项后删除分组或节点
        :return:
        '''
        item = self.ui.treeWidget.currentItem()
        parent = item.parent()
        if parent != None:
            parent.removeChild(item)
            win_title = item.text(0)
            if win_title in self.subDict.keys():
                try:
                    self.subDict[win_title].setFocus()
                    self.ui.mdiArea.closeActiveSubWindow()
                except:
                    pass
                del self.subDict[win_title]

        else:
            # 获取当前根节点的子节点数量
            count = item.childCount()
            if count != 0:
                for i in range(0, count):
                    win_title = item.child(i).text(0)
                    if win_title in self.subDict.keys():
                        try:
                            self.subDict[win_title].setFocus()
                            self.ui.mdiArea.closeActiveSubWindow()
                        except:
                            pass
                        del self.subDict[win_title]
            root_index = self.ui.treeWidget.indexOfTopLevelItem(item)
            self.ui.treeWidget.takeTopLevelItem(root_index)

    def addNode(self):
        '''
        功能:新建节点
        :return:
        '''
        item = self.ui.treeWidget.currentItem()
        ip = self.ui.ip_lineEdit.text().strip()
        if len(ip) == 0:
            return
        try:
            if item.parent() == None:
                node = QTreeWidgetItem(item)
                node.setText(0, ip)
            else:
                node = QTreeWidgetItem(item.parent())
                node.setText(0, ip)
        except:
            pass
        self.ui.treeWidget.expandAll()

if __name__ == '__main__':
    app = QApplication([])
    server = UI()
    server.show()
    sys.exit(app.exec_())