Оптимизируйте создание динамического макета, используя QStackedLayout - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь создать динамический составной макет, используя QStackedLayout.Программа работает нормально.Однако, поскольку я динамически создаю новое окно, я заметил, что оно на некоторое время зависает перед переходом.В основном, окно запрашивает ввод данных пользователем через QLineEdits, и после нажатия кнопки «Отправить» оно подключается к методу change_window, который создает новый виджет и добавляет его в основной стек вместе с деталями ввода пользователя, а затем переключается на вновь созданныйраскладка.Следующее окно (т. Е. Создает X количество кнопок, используя ввод от пользователя в предыдущем окне).Ранее я пытался создать следующее окно вместе с другими на главном контроллере пользовательского интерфейса, но, поскольку все макеты были созданы во время первого вызова, он называется, но не обновляет макет.Есть ли лучший способ сделать это?

Основной класс пользовательского интерфейса

class UI(QMainWindow):
    def __init__(self):

    super().__init__()
    self.setWindowTitle("Main Window")

    # Set dimensions and fix scaling
    width, height = 480, 720
    self.setFixedSize(width, height)

    # Center to the screen
    qr = self.frameGeometry()
    cp = QDesktopWidget().availableGeometry().center()
    qr.moveCenter(cp)
    self.move(qr.topLeft())

    # Create a stack object
    self.stacked_layout = QStackedLayout()

    # Set central widget
    self.central_widget = QWidget(self)
    self.central_widget.setLayout(self.stacked_layout)
    self.setCentralWidget(self.central_widget)

    # Create window widgets
    self.main_window = MainWindow(self)
    self.popup_window = PopupWidget(self)
    self.detail_window = DetailWindow(self)
    # self.input_window = InputWindow(self)

    # Add the main window widget to the stack
    self.stacked_layout.addWidget(self.main_window)
    self.stacked_layout.addWidget(self.popup_window)
    self.stacked_layout.addWidget(self.detail_window)
    # self.stacked_layout.addWidget(self.input_window)

Изменить метод окна в классе детализации окна

class DetailWindow(QWidget):
    def __init__(self, main):
        super().__init__()
        self.parent = main

        # Enable styling and set background
        self.setAttribute(Qt.WA_StyledBackground)
        self.setObjectName("detail")
        self.setStyleSheet('''#detail{background-image:
                        url(resources/images/detail_bg.jpg)}''')
        self.installEventFilter(self)

        # Create the line edits
        self.label_width, self.label_height = (74, 40)
        self.examinee_edit = self.create_line_edit(322, 264, 2)
        self.question_edit = self.create_line_edit(322, 332, 2)
        self.choices_edit = self.create_line_edit(322, 397, 2)

        # Create labels
        self.examinee_label = self.create_labels(84, 270, "Number of Examinees")
        self.question_label = self.create_labels(84, 342, "Number of Questions")
        self.choices_label = self.create_labels(84, 404, "Number of Choices")

        self.prompt1 = self.prompt_label(86, 294)
        self.prompt2 = self.prompt_label(86, 364)
        self.prompt3 = self.prompt_label(86, 427)

        # Create the submit button
        self.create_submit_button()

        # Go to the next line edit if enter/return is pressed
        self.examinee_edit.returnPressed.connect(lambda: self.question_edit.setFocus())
        self.question_edit.returnPressed.connect(lambda: self.choices_edit.setFocus())
        self.choices_edit.returnPressed.connect(lambda: self.submit.setFocus())

    def change_window(self):
        print('Current Window:', self.parent.stacked_layout.currentIndex())
        line_edit_list = (self.examinee_edit, self.question_edit, self.choices_edit)
        label_list = (self.examinee_label, self.question_label, self.choices_label)
        prompt_list = (self.prompt1, self.prompt2, self.prompt3)

        if self.examinee_edit.hasAcceptableInput() and self.question_edit.hasAcceptableInput() and self.choices_edit.hasAcceptableInput():
            next_window = InputWindow(self.parent, self.examinee_edit.text())
            self.parent.stacked_layout.addWidget(next_window)
            self.parent.stacked_layout.setCurrentIndex(3)
        else:
            self._input_prompt(label_list, line_edit_list, prompt_list)
...