Как сбросить пользовательский интерфейс в PyQt5 - PullRequest
0 голосов
/ 12 июня 2019

Я строю макет в pyqt5, где вы можете динамически добавлять или удалять виджеты.Ниже вы можете увидеть упрощенную версию моей проблемы: после успешного удаления вложенного макета "nested_hbox" и его виджетов он не будет снова собираться и просто показывает пустое окно.

Редактировать: В моем реальномПриложение У меня есть сетка, где вы можете динамически добавлять диаграммы в форме матрицы для просмотра нескольких входящих значений из интерфейса.Для этого вы можете определить количество строк и столбцов.Таким образом, сетка должна обновляться, когда пользователь нажимает кнопку.

import sys
from PyQt5.QtWidgets import *

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.layouts = []
        self.main_content_ui()
        self.init_ui()

    def main_content_ui(self):
        """Build up content for the main layout "vbox" """

        self.lbl_hello = QLabel()
        self.lbl_hello.setObjectName("lbl_hello")
        self.lbl_hello.setText("Hello StackOverflow")

        self.btn_reset_ui = QPushButton()
        self.btn_reset_ui = QPushButton()
        self.btn_reset_ui.setObjectName("btn_reset_ui")
        self.btn_reset_ui.clicked.connect(self.reset_ui)
        self.btn_reset_ui.setText("Reset UI")

        self.nested_hbox = QHBoxLayout()
        self.nested_hbox.setObjectName("nested_hbox")
        self.nested_hbox.addWidget(self.lbl_hello)
        self.nested_hbox.addWidget(self.btn_reset_ui)
        self.layouts.append(self.layouts)

        # main layout
        self.vbox = QVBoxLayout()
        self.vbox.setObjectName("vbox_main")
        self.layouts.append(self.vbox)
        self.vbox.addLayout(self.nested_hbox)

    def init_ui(self):
        """Set "vbox" as main layout
        """
        self.setLayout(self.vbox)
        self.show()

    def delete_layout(self, layout):
        """Delete all layouts from list "layouts"
        """
        try:
            while layout.count():
                item = layout.takeAt(0) 
                widget = item.widget() 
                if widget is not None: 
                    widget.deleteLater() 
                else: 
                    self.delete_layout(item.layout())
        except Exception as e:
            print(e)

    def reset_ui(self):
        """Clear and reinitalize main layouts content"""

        for lay in self.layouts:
            self.delete_layout(lay)
        print("Layout deleted rebuild layout")
        self.main_content_ui()
        self.vbox.update()
        QMainWindow.update(self)

app = QApplication(sys.argv)
ex = Window()
sys.exit(app.exec_())

Я ожидаю того же окна, что и до нажатия кнопки сброса, но окно ничего не показывает.

1 Ответ

0 голосов
/ 12 июня 2019

Qt Wiki предлагает отличный способ сделать ваше приложение перезагружаемым https://wiki.qt.io

EXIT_CODE_REBOOT = -11231351

def main():
    exitCode = 0
    while True:
        try: app = QApplication(sys.argv)
        except RuntimeError: app = QApplication.instance()
        window = MainUI()
        window.show()
        exitCode = app.exec_()
        if exitCode != EXIT_CODE_REBOOT: break
    return exitCode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...