예제 #1
0
class Ui_MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.select_checkbox_num = 0
        self.all_widgets = []
        self.game_sub_menus = []
        self.face_sub_menus = []
        self.setupUi(self)
        self.updateMenu(self)
        self.retranslateUi(self)

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(775, 532)

        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 775, 23))
        self.menubar.setObjectName("menubar")

        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")

        self.menu_team = QtWidgets.QMenu(self.menubar)  #参赛队组建菜单
        self.menu_team.setObjectName("menu_team")

        self.menu_face = QtWidgets.QMenu(self.menubar)  #对阵组建
        self.menu_face.setObjectName("menu_face")

        MainWindow.setMenuBar(self.menubar)

        mgr_player = QAction(QIcon(), '运动员管理', self)
        mgr_player.triggered.connect(
            functools.partial(self.edit_player, *self.get_player_parmas()))

        mgr_playground = QAction(QIcon(), '场地管理', self)
        mgr_playground.triggered.connect(
            functools.partial(self.edit_player, *self.get_playground_parmas()))

        mgr_game = QAction(QIcon(), '竞赛项目', self)
        mgr_game.triggered.connect(
            functools.partial(self.edit_player, *self.get_game_parmas()))

        mgr_team = QAction(QIcon(), '参赛团队', self)
        mgr_team.triggered.connect(self.edit_team)

        mgr_group = QAction(QIcon(), '分组管理', self)
        mgr_group.triggered.connect(self.edit_group)

        mgr_test = QAction(QIcon(), '我的测试', self)
        mgr_test.triggered.connect(self.test)

        # mgr_face = QAction(QIcon(),'对阵设定',self)
        # mgr_face.triggered.connect(self.edit_face)

        self.toolbar = self.addToolBar('Mytool')
        self.toolbar.addAction(mgr_player)
        self.toolbar.addAction(mgr_playground)
        self.toolbar.addAction(mgr_game)
        self.toolbar.addAction(mgr_team)
        self.toolbar.addAction(mgr_group)
        self.toolbar.addAction(mgr_test)
        # self.toolbar.addAction(mgr_face)

        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.action_init = QtWidgets.QAction(MainWindow)
        self.action_init.setObjectName("action_init")

        self.action_import_data = QtWidgets.QAction(MainWindow)
        self.action_import_data.setObjectName("action_import_data")

        self.action_gamemgr = QtWidgets.QAction(MainWindow)
        self.action_gamemgr.setObjectName("action_gamemgr")

        self.menu.addAction(self.action_init)
        self.menu.addAction(self.action_import_data)
        self.menu.addSeparator()

        self.menubar.addAction(self.menu.menuAction())
        self.menubar.addAction(self.menu_team.menuAction())
        self.menubar.addAction(self.menu_face.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        self.action_init.triggered.connect(self.clear_data_firm)
        self.action_import_data.triggered.connect(self.get_data_file)

        self.add_first_ui()

        # if has_data():
        #     self.add_team_ui()
        # time.sleep(2)
        # self.centralwidget.hide()

    # def pr(self):
    #     print('prrrrr')

    def updateMenu(self, MainWindow):
        """添加或更新为每个竞赛项目组队的‘参赛队组建’菜单"""
        self.games = get_games()
        # 清除‘参赛队组建’原子菜单
        for game_sub_menu in self.game_sub_menus:
            self.menu_team.removeAction(game_sub_menu)

        for game in self.games:
            self.game_sub_menus.append(QtWidgets.QAction(MainWindow))

        for game_sub_menu, game in zip(self.game_sub_menus, self.games):
            game_sub_menu.setObjectName(game.name)
            game_sub_menu.triggered.connect(
                functools.partial(self.select_player, game.id, game.name,
                                  game.team_num, game.sex))
            game_sub_menu.setText(
                QtCore.QCoreApplication.translate("MainWindow",
                                                  "&{}".format(game.name)))

        for game_sub_menu in self.game_sub_menus:
            self.menu_team.addAction(game_sub_menu)
        """添加或更新为每个竞赛项目组队的‘对阵组建’菜单"""
        for face_sub_menu in self.face_sub_menus:
            self.menu_face.removeAction(face_sub_menu)

        for game in self.games:
            self.face_sub_menus.append(QtWidgets.QAction(MainWindow))

        for game_sub_menu, game in zip(self.face_sub_menus, self.games):
            game_sub_menu.setObjectName(game.name + '_')
            game_sub_menu.triggered.connect(
                functools.partial(self.new_face, game.id))
            game_sub_menu.setText(
                QtCore.QCoreApplication.translate("MainWindow",
                                                  "&{}".format(game.name)))

        for game_sub_menu in self.face_sub_menus:
            self.menu_face.addAction(game_sub_menu)

    def add_first_ui(self, info="Welcome!"):
        self.takeCentralWidget()
        self.main_frame = QScrollArea(self)
        self.main_frame.setStyleSheet(
            'QWidget{background-color:rgb(255,255,255)}')
        self.wel = QLabel(info)

        boxlayout = QHBoxLayout()
        boxlayout.addStretch()
        boxlayout.addWidget(self.wel)
        boxlayout.addStretch()

        self.main_frame.setLayout(boxlayout)
        self.setCentralWidget(self.main_frame)

    # def add_team_ui(self):
    #     self.centralwidget = QWidget()
    #     self.form_layout = QHBoxLayout(self.centralwidget)

    #     self.left_layout = MyQVBoxLayout()
    #     self.right_layout = QVBoxLayout()

    #     # qbtn = QPushButton('1')
    #     # qbtn.resize(qbtn.minimumSize())
    #     self.left_widgts = self.get_left_widgts()
    #     # self.left_layout.addWidget(qbtn)
    #     # self.left_layout.addWidget(QLabel('def'))
    #     for widgt in self.left_widgts:
    #         self.left_layout.addWidget(widgt)
    #     self.left_layout.addStretch()
    #     # self.right_layout.addWidget(QLabel('aaaa'),0,0)
    #     # self.right_layout.addWidget(QLabel('bbbb'),1,0)
    #     self.right_widgts = self.get_right_widgets()
    #     for widgt in self.right_widgts:
    #         self.right_layout.addWidget(widgt)
    #     self.right_layout.addStretch()
    #     self.form_layout.addLayout(self.left_layout)
    #     self.form_layout.addLayout(self.right_layout)

    #     self.setCentralWidget(self.centralwidget)

    #     qbtn.clicked.connect(self.test)

    # def test(self):
    #     centralwidget = QWidget()
    #     test_layout = QHBoxLayout(centralwidget)
    #     test_layout.addWidget(QLabel('kkkkkkkkkkkkkkkkkkk'))
    #     # self.removeWidget(self.centralwidget)
    #     self.takeCentralWidget()
    #     self.setCentralWidget(centralwidget)
    #     # self.show()
    #     # self.update()
    #     # self.repaint()

    # def test_tool(self):
    #     print('abccc')
    #     self.wel.setText('akkkkkkkkkkkk!')
    #     self.takeCentralWidget()
    #     self.setCentralWidget(QLabel('kkkdkddaaaaaaaaaaaaaa'))

#         main_form = QFormLayout()
#         left_widgt = QWidget(None)
#         left_widgt_layout = QVBoxLayout()
#         left_widgt.setLayout(left_widgt_layout)
#         for i in range(5):
#             left_widgt_layout.addWidget(QLabel('标签%i' % i))

#         for w in self.get_left_widgts():
#             left_widgt_layout.addWidget(w)

#         scroll_area = QScrollArea()
#         right_widgt = QWidget(None)
#         self.right_widgt_layout = QVBoxLayout()
#         right_widgt.setLayout(self.right_widgt_layout)
#         self.right_widgt_layout.addWidget(QLabel('标签%i' % 5))
#         self.right_widgt_layout.addWidget(QLabel('标签%i' % 7))
#         scroll_area.setWidget(right_widgt)

#         main_form.addRow(left_widgt,scroll_area)

#         main_widgt = QWidget(None)
#         main_widgt.setLayout(main_form)
#         self.setCentralWidget(main_widgt)

# def get_left_widgts(self):
#     widgts = []
#     self.game_data = get_games()
#     mylbl = QLabel('运动项目:')
#     mylbl.setMaximumHeight(20)
#     widgts.append(mylbl)
#     self.game_combo = QComboBox(None)
#     self.game_combo.setMaximumWidth(80)
#     self.game_combo.setMaximumHeight(20)
#     for item in self.game_data.keys():
#         self.game_combo.addItem(item)
#     widgts.append(self.game_combo)
#     self.game_combo.setCurrentIndex(-1)
#     self.game_combo.activated[str].connect(self.set_cur_game)
#     return widgts

# def set_cur_game(self,game):
#     self.game = game
#     print(game,self.game_data[game])
#     if self.game_data[game] == 1:
#         self.show_players(game)

# def get_right_widgets(self):
#     players = get_players()
#     widgts = []

#     for p in players:
#         data = [p.name,p.idcode,p.sex,p.age,p.work_place,p.tel]
#         data = ['' if d is None else d for d in data]
#         info = '{: <8} {: <8} {: <2} {: <2} {: <10} {: <12}'.format(*data)
#         widgts.append(QLabel(info))
#     return widgts

# def show_players(self,game):
#     self.test()

#     game_sex = get_games_sex()
#     sex = game_sex[game]
#     self.players = get_players(sex)
#     self.p_checkboxes = [QCheckBox(' '.join((p.name,p.idcode))) for p in self.players]
#     for w in self.right_widgts:
#         w.hide()
#     for cb in self.p_checkboxes:
#         cb.toggle()
#         print('abc')
#         self.right_layout.addWidget(cb)
#     self.right_layout.addStretch()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "易用竞赛管理系统"))
        self.menu.setTitle(_translate("MainWindow", "&管理数据"))
        self.action_init.setText(_translate("MainWindow", "&清理数据"))
        self.action_import_data.setText(_translate("MainWindow", "&导入数据"))

        self.menu_team.setTitle(_translate("MainWindow", "&参赛队组建"))

        self.menu_face.setTitle(_translate("MainWindow", "&对阵组建"))

    def get_data_file(self):
        fname = QFileDialog.getOpenFileName(self, '打开文件', '.\\')
        if fname[0]:
            info = load_data(fname[0])
            if info:
                QMessageBox.information(self, "数据错误,请修改后重新导入!", info)
            else:
                QMessageBox.information(self, "提示:", '数据导入成功!')
                self.add_first_ui('数据已导入!')
                # self.add_team_ui()
                self.updateMenu(self)

    def clear_data_firm(self):
        reply = QMessageBox.question(self, '确认', '确定删除数据?',
                                     QMessageBox.Yes | QMessageBox.No,
                                     QMessageBox.No)
        self.takeCentralWidget()
        if reply == QMessageBox.Yes:
            clear_data()
            self.add_first_ui('数据已全部清空!')

    def get_player_parmas(self):
        head_lst = ['索引号', '姓名', '身份证号', '性别', '年龄', '工作单位', '电话']
        keys = ['id', 'name', 'idcode', 'sex', 'age', 'work_place', 'tel']
        return get_players, keys, head_lst, Player

    def get_playground_parmas(self):
        head_lst = ['索引号', '场地名', '使用状态', '备注']
        keys = ['id', 'name', 'using', 'memo']
        return get_playgrounds, keys, head_lst, PlayGround

    def get_game_parmas(self):
        head_lst = ['索引号', '竞赛项目', '队员人数', '队员性别', '备注']
        keys = ['id', 'name', 'team_num', 'sex', 'memo']
        return get_games, keys, head_lst, Games

    def edit_player(self, getfunc, keys, head_lst, obj):
        model_objs = getfunc()
        datas = []
        for model_obj in model_objs:
            # data = [p.id,p.name,p.idcode,p.sex,p.age,p.work_place,p.tel]
            data = [getattr(model_obj, key) for key in keys]
            data = ['' if d is None else d for d in data]
            datas.append(data)
        # head_lst = ['索引号','姓名','身份证号','性别','年龄','工作单位','电话']
        if datas:
            self.takeCentralWidget()
            main_frame = QScrollArea(self)
            main_frame.setStyleSheet(
                'QWidget{background-color:rgb(255,255,255)}')

            self.player_tabview = QTableView()
            r, c = len(datas), len(datas[0])
            self.player_model = QStandardItemModel(r, c)
            self.player_model.setHorizontalHeaderLabels(head_lst)
            for r, rdata in enumerate(datas):
                for c, cell in enumerate(rdata):
                    it = QStandardItem(str(cell))
                    if c == 0:
                        it.setEditable(False)
                    self.player_model.setItem(r, c, it)
            # keys = ['id','name','idcode','sex','age','work_place','tel']
            edit_cell = functools.partial(self.edit_cell, obj, keys)
            self.player_model.itemChanged.connect(edit_cell)

            self.player_tabview.setModel(self.player_model)

            boxlayout = QVBoxLayout()
            # boxlayout.addStretch(1)
            boxlayout.addWidget(self.player_tabview, 18)
            # boxlayout.addStretch(1)

            del_btn = QPushButton('删除')
            del_btn.clicked.connect(functools.partial(self.del_row, obj))
            boxlayout.addWidget(del_btn)

            main_frame.setLayout(boxlayout)
            self.setCentralWidget(main_frame)

    def edit_cell(self, obj, keys):
        r = self.player_tabview.currentIndex().row()
        c = self.player_tabview.currentIndex().column()
        curr_data = self.player_tabview.currentIndex().data()
        item = self.player_model.index(r, 0)
        param = dict()
        param[keys[c]] = curr_data
        save_cell(obj, int(item.data()), param)
        if obj == Games and 'name' in param:
            self.updateMenu(self)

    def del_row(self, obj):
        reply = QMessageBox.question(self, '确认', '确定删除数据?',
                                     QMessageBox.Yes | QMessageBox.No,
                                     QMessageBox.No)
        if reply == QMessageBox.Yes:
            r = self.player_tabview.currentIndex().row()
            item = self.player_model.index(r, 0)
            # print(int(item.data()))
            del_rowdb(obj, int(item.data()))
            self.player_model.removeRow(r)
            if obj == Games:
                self.updateMenu(self)

    def edit_team(self):
        datas = get_team_datas()
        head_lst = ['索引号', '队名', '项目', '分组']
        if datas:
            self.takeCentralWidget()
            main_frame = QScrollArea(self)
            main_frame.setStyleSheet(
                'QWidget{background-color:rgb(255,255,255)}')

            self.player_tabview = QTableView()
            r, c = len(datas), len(datas[0])
            self.player_model = QStandardItemModel(r, c)
            self.player_model.setHorizontalHeaderLabels(head_lst)
            for r, rdata in enumerate(datas):
                for c, cell in enumerate(rdata):
                    it = QStandardItem(str(cell))
                    if c == 0:
                        it.setEditable(False)
                    self.player_model.setItem(r, c, it)
            # keys = ['id','name','idcode','sex','age','work_place','tel']
            # edit_cell = functools.partial(self.edit_cell,obj,keys)
            # self.player_model.itemChanged.connect(edit_cell)

            self.player_tabview.setModel(self.player_model)

            boxlayout = QVBoxLayout()
            # boxlayout.addStretch(1)
            boxlayout.addWidget(self.player_tabview, 18)
            # boxlayout.addStretch(1)

            del_btn = QPushButton('删除')
            del_btn.clicked.connect(self.del_team)
            boxlayout.addWidget(del_btn)

            main_frame.setLayout(boxlayout)
            self.setCentralWidget(main_frame)

    def del_team(self):
        # v = MyDialog()
        # if v.exec_():
        #     name,game = v.get_data()
        #     print(name,game)
        reply = QMessageBox.question(self, '确认', '确定删除数据?',
                                     QMessageBox.Yes | QMessageBox.No,
                                     QMessageBox.No)
        if reply == QMessageBox.Yes:
            r = self.player_tabview.currentIndex().row()
            item = self.player_model.index(r, 0)
            # print(int(item.data()))
            del_rowdb(Team, int(item.data()))
            self.player_model.removeRow(r)

    def select_player(self, gid, gname, gteam_num, gsex):
        # 新建团队UI
        players = get_players(gsex)
        head_lst = ['索引号', '姓名', '身份证号', '性别', '年龄', '工作单位', '电话']
        keys = ['id', 'name', 'idcode', 'sex', 'age', 'work_place', 'tel']
        datas = []
        for player in players:
            data = [getattr(player, key) for key in keys]
            data = ['' if d is None else d for d in data]
            datas.append(data)
        if datas:
            self.takeCentralWidget()
            main_frame = QScrollArea(self)
            main_frame.setStyleSheet(
                'QWidget{background-color:rgb(255,255,255)}')

            self.player_tabview = QTableView()
            r, c = len(datas), len(datas[0])
            self.player_model = QStandardItemModel(r, c)

            print(self.player_tabview.itemDelegate())

            self.player_model.setHorizontalHeaderLabels(head_lst)
            for r, rdata in enumerate(datas):
                for c, cell in enumerate(rdata):
                    it = QStandardItem(str(cell))
                    if c == 0:
                        it.setEditable(False)
                    self.player_model.setItem(r, c, it)
            self.player_tabview.setModel(self.player_model)

            boxlayout = QVBoxLayout()
            # boxlayout.addStretch(1)
            boxlayout.addWidget(self.player_tabview, 18)
            # boxlayout.addStretch(1)

            new_btn = QPushButton('新建团队({})'.format(gname))
            new_btn.clicked.connect(
                functools.partial(self.add_team, gid, gteam_num, gsex))
            boxlayout.addWidget(new_btn)

            main_frame.setLayout(boxlayout)
            self.setCentralWidget(main_frame)

    def add_team(self, gid, gteam_num, gsex):
        # 新建团队方法
        rows = set()
        pids = []
        for selected_model_index in self.player_tabview.selectedIndexes():
            rows.add(selected_model_index.row())
        for r in rows:
            item = self.player_model.index(r, 0)
            pids.append(item.data())
        if gteam_num == 1:
            info = new_team(gid, pids, flag=1)
            if info:
                QMessageBox.warning(self, '完成', info, QMessageBox.Ok)
            else:
                QMessageBox.information(self, '完成', '成功建立!', QMessageBox.Ok)
        if gteam_num > 1:
            if len(rows) == gteam_num:
                info = new_team(gid, pids)
                if info:
                    QMessageBox.warning(self, '完成', info, QMessageBox.Ok)
                else:
                    QMessageBox.information(self, '完成', '成功建立!',
                                            QMessageBox.Ok)
            else:
                QMessageBox.warning(self, '错误',
                                    '请选中指定的运动员数:{}'.format(gteam_num),
                                    QMessageBox.Ok)
        self.player_tabview.clearSelection()

    def test(self):
        from .modeltt import TObjModel, MyDelegate
        md = MyDelegate()
        self.takeCentralWidget()
        main_frame = QScrollArea(self)
        main_frame.setStyleSheet('QWidget{background-color:rgb(255,255,255)}')

        self.player_tabview = QTableView()
        self.player_model = TObjModel()
        self.player_tabview.setModel(self.player_model)

        boxlayout = QVBoxLayout()
        # boxlayout.addStretch(1)
        boxlayout.addWidget(self.player_tabview, 18)
        self.player_tabview.setItemDelegateForColumn(2, md)
        self.player_tabview.hideColumn(0)
        main_frame.setLayout(boxlayout)
        self.setCentralWidget(main_frame)

    def edit_group(self):
        datas = get_group_datas()
        head_lst = ['索引号', '组名', '项目', '所含队名', 'gameid']
        self.takeCentralWidget()
        main_frame = QScrollArea(self)
        main_frame.setStyleSheet('QWidget{background-color:rgb(255,255,255)}')

        self.player_tabview = QTableView()
        self.player_model = QStandardItemModel()
        self.player_model.setHorizontalHeaderLabels(head_lst)
        if datas:
            r, c = len(datas), len(datas[0])
            # self.player_model = QStandardItemModel(r,c)
            self.player_model.setHorizontalHeaderLabels(head_lst)
            for r, rdata in enumerate(datas):
                for c, cell in enumerate(rdata):
                    it = QStandardItem(str(cell))
                    # if c == 0:
                    it.setEditable(False)
                    self.player_model.setItem(r, c, it)
        # keys = ['id','name','idcode','sex','age','work_place','tel']
        # edit_cell = functools.partial(self.edit_cell,obj,keys)
        # self.player_model.itemChanged.connect(edit_cell)

        self.player_tabview.setModel(self.player_model)

        boxlayout = QVBoxLayout()
        # boxlayout.addStretch(1)
        boxlayout.addWidget(self.player_tabview, 18)
        # boxlayout.addStretch(1)
        self.player_tabview.hideColumn(4)

        add_btn = QPushButton('添加分组')
        add_btn.clicked.connect(self.add_group)
        boxlayout.addWidget(add_btn)

        del_btn = QPushButton('删除分组')
        del_btn.clicked.connect(functools.partial(self.del_row, Group))
        boxlayout.addWidget(del_btn)

        add_team_btn = QPushButton('分配参赛团队')
        add_team_btn.clicked.connect(self.add_team2group)
        boxlayout.addWidget(add_team_btn)

        main_frame.setLayout(boxlayout)
        self.setCentralWidget(main_frame)

    def add_group(self):
        v = MyDialog()
        if v.exec_():
            name, game = v.get_data()
            if name and game:
                info = add_groupdb(name, int(game))
                if info:
                    QMessageBox.warning(self, '错误', info, QMessageBox.Ok)
                else:
                    QMessageBox.information(self, '完成', '成功建立!',
                                            QMessageBox.Ok)
                    self.edit_group()

    def add_team2group(self):
        rows = set()

        for selected_model_index in self.player_tabview.selectedIndexes():
            rows.add(selected_model_index.row())
        if len(rows) != 1:
            QMessageBox.warning(self, '错误', '请仅选择其中一个小组', QMessageBox.Ok)
            return
        row = rows.pop()
        groupid = self.player_model.index(row, 0).data()
        gameid = self.player_model.index(row, 4).data()

        print(groupid, gameid)
        if get_team_datas(gameid):
            v = GroupDialog(gameid, "添加团队到小组", get_team_datas)
            if v.exec_():
                tids = v.get_data()
                print(tids)
                if tids:
                    add_team2group_db(groupid, tids)
                    QMessageBox.information(self, '提示', '操作完成!',
                                            QMessageBox.Ok)
        else:
            QMessageBox.information(self, '提示', '无参赛团队可以分组!', QMessageBox.Ok)

    def get_grp_combo(self, gid):
        groups = get_group_for_game(gid)
        cur_index = -1
        grp_combo = QComboBox()
        for index, (ggid, gname, ggname) in enumerate(groups):
            grp_combo.addItem('-'.join((ggname, gname)), ggid)

        grp_combo.setCurrentIndex(cur_index)

        grp_combo.currentIndexChanged.connect(
            functools.partial(self.disp_face, gid))
        grp_combo.setToolTip('请选择一个分组,并为其建立对阵。')

        return grp_combo

    def new_face(self, gid):
        # print(gid)
        self.takeCentralWidget()
        main_frame = QScrollArea(self)
        main_frame.setStyleSheet('QWidget{background-color:rgb(255,255,255)}')

        boxlayout = QVBoxLayout()

        self.grp_combo = self.get_grp_combo(gid)

        boxlayout.addWidget(self.grp_combo)
        # boxlayout.addStretch(1)

        self.face_view = QTableView()
        self.face_model = QStandardItemModel()
        self.face_model.setHorizontalHeaderLabels(['id', '队A', '队B'])
        self.face_view.setModel(self.face_model)

        boxlayout.addWidget(self.face_view)

        add_btn = QPushButton('添加对阵')
        add_btn.clicked.connect(functools.partial(self.add_face, gid))
        boxlayout.addWidget(add_btn)

        main_frame.setLayout(boxlayout)
        self.setCentralWidget(main_frame)

    def disp_face(self, gid):
        # print(self.grp_combo.currentIndex(),self.grp_combo.currentText())
        self.ggid = int(self.grp_combo.itemData(self.grp_combo.currentIndex()))
        if self.ggid >= 1:

            self.face_model.beginResetModel()
            self.face_model.clear()
            self.face_model.setHorizontalHeaderLabels(['id', '队A', '队B'])
            faces = get_faces(gid, self.ggid)
            for r, rd in enumerate(faces):
                for c, cd in enumerate(rd):
                    item = QStandardItem(str(cd))
                    item.setEditable(False)
                    self.face_model.setItem(r, c, item)
            self.face_model.endResetModel()

    def add_face(self, gid):

        v = GroupDialog(self.ggid, "添加对阵团队", get_teams_for_group)
        if v.exec_():
            tids = v.get_data()
            print(tids)
            tids = [int(tid) for tid in tids]
            if len(tids) != 2:
                QMessageBox.warning(self, '错误', '请仅选择对阵的双方小组', QMessageBox.Ok)
            else:
                tids.sort()
                if add_face2db(*tids):
                    self.disp_face(gid)
                    QMessageBox.information(self, '提示', '操作完成!',
                                            QMessageBox.Ok)
                else:
                    QMessageBox.warning(self, '错误', '对阵不能重复!', QMessageBox.Ok)