簡體   English   中英

QWidget關閉后如何打開QWidget?

[英]How can I make a QWidget open after a QWidget closes?

我有以下代碼:

import os
from functools import partial
import numpy as np
from PyQt5 import QtCore, QtWidgets


class MainWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.resize(500, 500)
        self.setWindowFlags(
            self.windowFlags() | QtCore.Qt.MSWindowsFixedSizeDialogHint
        )
        self.setWindowTitle("nCode analysis set-up")

        self.wait_window = WaitWindow()

        thread = QtCore.QThread(self)
        thread.start()

        self.m_worker = Worker()
        self.m_worker.moveToThread(thread)
        self.m_worker.new_content_signal.connect(self.get_content)

        # Creating the top level grid layout
        mainGrid = QtWidgets.QGridLayout(self)

        self.analysis_type_label = QtWidgets.QLabel(self)
        self.analysis_type_label.setText("Type of analysis")
        mainGrid.addWidget(self.analysis_type_label, 0, 0)
        self.analysis_type_combo = QtWidgets.QComboBox(self)
        self.analysis_type_combo.addItems(["Fatigue", "Proof plus fatigue"])
        mainGrid.addWidget(self.analysis_type_combo, 0, 1, 1, 2)
        self.load_deck_type_label = QtWidgets.QLabel(self)
        self.load_deck_type_label.setText("Type of fatigue deck")
        mainGrid.addWidget(self.load_deck_type_label, 1, 0)
        self.load_deck_type_combo = QtWidgets.QComboBox(self)
        self.load_deck_type_combo.addItems(
            ["Regen braking", "No regen braking"]
        )
        mainGrid.addWidget(self.load_deck_type_combo, 1, 1, 1, 2)
        self.analysis_engine_type_label = QtWidgets.QLabel(self)
        self.analysis_engine_type_label.setText("Analysis Engine")
        mainGrid.addWidget(self.analysis_engine_type_label, 2, 0)
        self.analysis_engine_type_combo = QtWidgets.QComboBox(self)
        self.analysis_engine_type_combo.addItems(["EN analysis", "SN analysis"])
        mainGrid.addWidget(self.analysis_engine_type_combo, 2, 1, 1, 2)

        # Creating a scrolable area to accommodate for a large number of components with possible lenghty names
        self.scrollArea = QtWidgets.QScrollArea(self)
        # The line below is absolutely required to make the scrollable area work.
        self.scrollArea.setWidgetResizable(True)
        mainGrid.addWidget(self.scrollArea, 3, 0, 1, 3)
        self.secondaryWidget = QtWidgets.QWidget()
        self.scrollArea.setWidget(self.secondaryWidget)
        self.secondaryGrid = QtWidgets.QGridLayout(self.secondaryWidget)

        self.createDCL = QtWidgets.QPushButton(self)
        self.createDCL.setText("Create DCL")
        mainGrid.addWidget(self.createDCL, 4, 0, 1, 3)

    def start_task(self):
        if not os.path.exists("loading_database.db"):
            QtWidgets.QMessageBox.information(
                None,
                "Loading database missing",
                "Loading database has not been found. Creation of a new one will be attempted",
            )
            # self.loadingDatabaseCreator()
            QtWidgets.QMessageBox.information(
                None, "Successful", "Loading database succesfully created"
            )

        filePath, _ = QtWidgets.QFileDialog.getOpenFileName(
            None, "Select input model", "", "Input deck (*.inp)", "*.inp"
        )
        if filePath:
            self.wait_window.show()
            self.m_worker.finished.connect(self.wait_window.close)
            wrapper = partial(self.m_worker.read_file, filePath)
            # Launch the task in a reasonable time for the window to show
            QtCore.QTimer.singleShot(100, wrapper)
            w.show()
            self.wait_window.raise_()
            self.wait_window.activateWindow()

    @QtCore.pyqtSlot(int, str)
    def get_content(self, i, content):
        label = QtWidgets.QLabel("{} material".format(content))
        linedit = QtWidgets.QLineEdit(placeholderText="Drop material name here")
        linedit.setFixedWidth(150)
        button = QtWidgets.QPushButton("Pick material")

        self.secondaryGrid.addWidget(label, 2 + i, 0)
        self.secondaryGrid.addWidget(linedit, 2 + i, 1)
        self.secondaryGrid.addWidget(button, 2 + i, 2)


class WaitWindow(QtWidgets.QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Info")
        self.resize(600, 200)
        layout = QtWidgets.QVBoxLayout(self)
        self.message = QtWidgets.QLabel()
        self.message.setFixedWidth(550)
        self.message.setText("Please wait while input file is being read")
        layout.addWidget(self.message)


class Worker(QtCore.QObject):
    finished = QtCore.pyqtSignal()
    new_content_signal = QtCore.pyqtSignal(int, str)

    @QtCore.pyqtSlot(str)
    def read_file(self, fileName):
        i = 0
        collector_array = []
        with open(fileName, "r") as model_file_obj:
            for line in model_file_obj.readlines():
                if "*ELEMENT," in line and "DCOUP3D" not in line:
                    t = line.split("ELSET=")[1][:-1]
                    if t not in collector_array:
                        self.new_content_signal.emit(i, t)
                        QtCore.QThread.msleep(10)
                        collector_array.append(t)
                        i += 1
        self.finished.emit()


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWidget()
    w.start_task()
    sys.exit(app.exec_())

它看起來像很多代碼,但是MainWidget首先被初始化。 在初始化后MainWidget的功能start_task被稱為該節目的的WaitWindow QDialog的,詢問它的啟動解析輸入文件中的用戶,然后顯示MainWidget QWidget的窗口。 雖然這不是太糟糕了,我想用戶看不到MainWidget窗口,直到該文件已完成分析和WaitWindow關閉。 有任何想法嗎?

我不明白您為什么使用w.show()刪除它。

問題是,如果要在執行任務后顯示MainWidget,只需將show方法連接到完成的信號上

# ...
self.m_worker.finished.connect(self.wait_window.close)
self.m_worker.finished.connect(self.show)
# ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM