Example #1
0
class ChangeCourse(QWidget):
    change_course_signal = Signal(dict)

    def __init__(self,
                 candidate_course,
                 all_candidate_course,
                 candidate_course_semester,
                 pre2post,
                 parent=None):
        super(ChangeCourse, self).__init__(parent)

        self.course_info = dict()
        self.pre2post = pre2post
        self.candidate_course_semester = candidate_course_semester

        # Create required course GroupBox
        required_course = QGroupBox("必修")
        required_course.setFlat(False)

        # Course Label
        self.checkBox = []
        for i in candidate_course:
            if i[0] != '-':
                self.course_info[i] = ''
                label = QLabel(i)
                self.checkBox.append(label)

        # Course combobox
        self.cb = []
        for i in range(0, len(candidate_course)):
            if candidate_course[i][0] != '-':
                cb = QComboBox(self)
                for k in range(
                        candidate_course_semester[all_candidate_course[i]], 8):
                    self.course_info[
                        all_candidate_course[i]] = candidate_course_semester[
                            all_candidate_course[i]]
                    cb.addItem(str(k))
                cb.currentIndexChanged.connect(self.get_info)
                self.cb.append(cb)

        # Add label and combobox to GridLayout
        i = 0
        j = 0
        self.required_layout = QGridLayout()
        for obj in range(len(self.checkBox)):
            self.required_layout.addWidget(self.checkBox[obj], j, i)
            self.required_layout.addWidget(self.cb[obj], j, i + 1)
            if i == 4:
                j = j + 1
                i = 0
            else:
                i = i + 2

        required_course.setLayout(self.required_layout)

        # Create optional course GroupBox
        optional_course = QGroupBox("选修")
        optional_course.setFlat(False)

        # Optional course checkbox
        self.checkBox_optional = []
        for i in candidate_course:
            if i[0] == '-':
                checkbox = QLabel(i[1:])
                # checkbox.stateChanged.connect(self.checkbox_func)
                self.checkBox_optional.append(checkbox)

        # Optional course combobox
        self.cb = []
        for i in range(0, len(self.checkBox_optional)):
            cb = QComboBox(self)
            # cb.addItem('')
            for k in range(
                    candidate_course_semester[
                        self.checkBox_optional[i].text()], 8):
                self.course_info[self.checkBox_optional[i].text(
                )] = candidate_course_semester[
                    self.checkBox_optional[i].text()]
                cb.addItem(str(k))
            cb.currentIndexChanged.connect(self.get_info)
            self.cb.append(cb)

        # Add label and combobox to GridLayout
        i = 0
        j = 0
        self.optional_layout = QGridLayout()
        for obj in range(len(self.checkBox_optional)):
            self.optional_layout.addWidget(self.checkBox_optional[obj], j, i)
            self.optional_layout.addWidget(self.cb[obj], j, i + 1)
            if i == 4:
                j = j + 1
                i = 0
            else:
                i = i + 2

        optional_course.setLayout(self.optional_layout)
        button = QPushButton("确定", self)
        button.clicked.connect(self.return_info)

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(required_course)
        mainLayout.addWidget(optional_course)
        mainLayout.addWidget(button)

        self.setLayout(mainLayout)
        self.setWindowTitle("高级排课选项")

    # Aborted function
    def defer_post_course(self, post_course, grid, pre_semester):
        i = 0
        j = 0
        print(type(pre_semester))
        pre_semester = int(pre_semester)
        for course in post_course:
            if grid == 'required':
                i = 0
                j = 0
                for a in range(len(self.checkBox_optional)):
                    if self.optional_layout.itemAtPosition(
                            i, j).widget().text() == course[1:]:
                        self.optional_layout.itemAtPosition(
                            i, j + 1).widget().clear()
                        for index in range(pre_semester, 8):
                            self.optional_layout.itemAtPosition(
                                i, j + 1).widget().addItem(str(index))
                            self.optional_layout.itemAtPosition(
                                i, j + 1).widget().currentIndexChanged.connect(
                                    self.get_info)

                    if i == 4:
                        j = j + 1
                        i = 0
                    else:
                        i = i + 2

            else:
                i = 0
                j = 0
                for a in range(len(self.checkBox)):
                    if self.required_layout.itemAtPosition(
                            i, j).widget().text() == course:
                        self.required_layout.itemAtPosition(
                            i, j + 1).widget().clear()
                        for index in range(pre_semester, 8):
                            self.required_layout.itemAtPosition(
                                i, j + 1).widget().addItem(str(index))
                            self.required_layout.itemAtPosition(
                                i, j + 1).widget().currentIndexChanged.connect(
                                    self.get_info)

                    if j == 4:
                        i = i + 1
                        j = 0
                    else:
                        j = j + 2

    @Slot()
    # Get info about order of course choose by user
    def get_info(self):
        # str2num = {'1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8}
        cb = self.sender()
        if cb:

            if self.required_layout.indexOf(cb) != -1:
                pos = list(
                    self.required_layout.getItemPosition(
                        self.required_layout.indexOf(cb)))
                self.course_info[self.required_layout.itemAtPosition(
                    pos[0], pos[1] - 1).widget().text()] = cb.currentText()
                post_course = self.pre2post[
                    self.required_layout.itemAtPosition(pos[0], pos[1] -
                                                        1).widget().text()]
                # self.defer_post_course(post_course, "rquired", cb.currentText())
                if len(cb.currentText()):
                    for course in post_course:
                        i = 0
                        j = 0
                        for a in range(len(self.checkBox)):
                            if self.required_layout.itemAtPosition(
                                    i, j).widget().text() == course:
                                self.required_layout.itemAtPosition(
                                    i, j + 1).widget().clear()

                                for index in range(
                                        self.candidate_course_semester[course]
                                        - self.candidate_course_semester[
                                            self.
                                            required_layout.itemAtPosition(
                                                pos[0],
                                                pos[1] - 1).widget().text()] +
                                        int(cb.currentText()), 9):
                                    self.required_layout.itemAtPosition(
                                        i, j + 1).widget().addItem(str(index))
                                    self.required_layout.itemAtPosition(
                                        i, j + 1).widget(
                                        ).currentIndexChanged.connect(
                                            self.get_info)
                            if j == 4:
                                i = i + 1
                                j = 0
                            else:
                                j = j + 2

                        i = 0
                        j = 0
                        for a in range(len(self.checkBox_optional)):
                            if self.optional_layout.itemAtPosition(
                                    i, j).widget().text() == course:
                                self.optional_layout.itemAtPosition(
                                    i, j + 1).widget().clear()

                                for index in range(
                                        self.candidate_course_semester[course]
                                        - self.candidate_course_semester[
                                            self.
                                            required_layout.itemAtPosition(
                                                pos[0],
                                                pos[1] - 1).widget().text()] +
                                        int(cb.currentText()), 9):
                                    self.optional_layout.itemAtPosition(
                                        i, j + 1).widget().addItem(str(index))
                                    self.optional_layout.itemAtPosition(
                                        i, j + 1).widget(
                                        ).currentIndexChanged.connect(
                                            self.get_info)
                            if j == 4:
                                i = i + 1
                                j = 0
                            else:
                                j = j + 2

            else:
                pos = list(
                    self.optional_layout.getItemPosition(
                        self.optional_layout.indexOf(cb)))
                if cb.currentText():
                    self.course_info[self.optional_layout.itemAtPosition(
                        pos[0],
                        pos[1] - 1).widget().text()] = cb.currentText()
                post_course = self.pre2post[
                    self.optional_layout.itemAtPosition(pos[0], pos[1] -
                                                        1).widget().text()]
                # self.defer_post_course(post_course, "optional", cb.currentText())
                for course in post_course:
                    i = 0
                    j = 0
                    for a in range(len(self.checkBox_optional)):
                        if self.optional_layout.itemAtPosition(
                                i, j).widget().text() == course:
                            self.optional_layout.itemAtPosition(
                                i, j + 1).widget().clear()
                            for index in range(
                                    self.candidate_course_semester[course] -
                                    self.candidate_course_semester[
                                        self.required_layout.itemAtPosition(
                                            pos[0],
                                            pos[1] - 1).widget().text()] +
                                    int(cb.currentText()), 9):
                                self.optional_layout.itemAtPosition(
                                    i, j + 1).widget().addItem(str(index))
                                self.optional_layout.itemAtPosition(
                                    i, j +
                                    1).widget().currentIndexChanged.connect(
                                        self.get_info)

                        if j == 4:
                            i = i + 1
                            j = 0
                        else:
                            j = j + 2

    @Slot()
    def return_info(self):
        self.close()
        self.change_course_signal.emit(self.course_info)
Example #2
0
class OptionalCourse(QWidget):
    choose_course_signal = Signal(dict)

    def __init__(self, all_course_info, choose_info, parent=None):
        super(OptionalCourse, self).__init__(parent)

        self.course_info = []

        # Create optional course GroupBox
        optional_course = QGroupBox("选修")
        optional_course.setFlat(False)

        # Optional course checkbox
        self.checkBox = []
        for i in all_course_info:
            if i[0] == '-':
                checkbox = QCheckBox(i[1:])
                checkbox.stateChanged.connect(self.checkbox_func)
                self.checkBox.append(checkbox)

        # Add label and combobox to GridLayout
        i = 0
        j = 0
        self.optional_layout = QGridLayout()
        for obj in range(len(self.checkBox)):
            self.optional_layout.addWidget(self.checkBox[obj], j, i)
            if i == 4:
                j = j + 1
                i = 0
            else:
                i = i + 2

        optional_course.setLayout(self.optional_layout)
        button = QPushButton("确定", self)
        button.clicked.connect(self.return_info)

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(optional_course)
        mainLayout.addWidget(button)

        for i in choose_info:
            for j in self.checkBox:
                if i == j.text():
                    j.setChecked(True)

        self.setLayout(mainLayout)
        self.setWindowTitle("选修课")

    @Slot()
    def checkbox_func(self):
        box = self.sender()
        if box:
            pos = list(
                self.optional_layout.getItemPosition(
                    self.optional_layout.indexOf(box)))
            if self.optional_layout.itemAtPosition(
                    pos[0], pos[1]).widget().isChecked():
                self.course_info.append(
                    self.optional_layout.itemAtPosition(
                        pos[0], pos[1]).widget().text())
            else:
                self.course_info.remove(
                    self.optional_layout.itemAtPosition(
                        pos[0], pos[1]).widget().text())

    @Slot()
    def return_info(self):
        self.close()
        self.choose_course_signal.emit(self.course_info)