首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >直到QtWidgets.QMainWindow关闭,然后才继续

直到QtWidgets.QMainWindow关闭,然后才继续
EN

Stack Overflow用户
提问于 2018-04-25 18:36:57
回答 2查看 1.6K关注 0票数 1

我有一个PyQt5窗口,它将打开我创建的对话框窗口,该窗口要求用户做一些事情,然后单击一个关闭窗口的按钮。这两个窗口是用class RenameDialog(QtWidgets.QMainWindow):class Prog(QtWidgets.QMainWindow):制作的。在Prog,我有self.renameDialog = RenameDialog(self)。在我的代码中

代码语言:javascript
复制
self.renameDialog.show()
#Other code to run after renameDialog window is closed

但这是行不通的,因为我不知道如何等到renameDialog关闭。我尝试过将self.renameDialog.setWindowModality(QtCore.Qt.WindowModality)放在self.renameDialog.show()之前,我试图弄清楚如何使用.exec_(),但不知道在这个上下文中可以在哪里使用这个方法。在继续代码之前,是否有一种方法可以等到隐藏或销毁这个QtWidgets.QMainWindow

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-25 18:48:06

这里有两种可能性。

1.可以将对话框设置为模态。在这种情况下,与GUI的任何其他交互都会被阻止,直到用户关闭对话框为止。只有这样,代码才会继续。您需要从QDialog继承才能工作:

代码语言:javascript
复制
class RenameDialog(QDialog):
    # ...
    pass

class YourMainWindow(QMainWindow):
    def show_dlg(self):
        dlg = RenameDialog(self)
        res = dlg.exec()
        if res == QDialog.Accepted:
            print('Accepted')
        else:
            print('Rejected')
  1. 连接到对话框的完成()信号。这样,对话框就不必是模态的,您仍然可以与GUI的其余部分进行交互。当用户关闭对话框时,将触发finished信号,并调用连接的回调函数。
票数 4
EN

Stack Overflow用户

发布于 2022-09-01 14:49:34

在这里,我留下一个小的测试应用程序来测试QMainWindow充当QDialog的不同选项。

我是根据这个问题提出的:

PyQt:等待小部件关闭

这个问题的答案给了我@musicamante:

QMainWindow停止/暂停执行,直到窗口关闭(不是QDialog)

这是我的代码:

代码语言:javascript
复制
import sys
from PyQt6 import QtCore, QtWidgets

class Ui_FirstWindow(object):
    def setupUi(self, FirstWindow):
        FirstWindow.resize(400, 300)
        self.centralWidget = QtWidgets.QWidget(FirstWindow)
        self.pushButton = QtWidgets.QPushButton(self.centralWidget)
        self.pushButton.setGeometry(QtCore.QRect(110, 130, 191, 23))
        self.pushButton.setText("Load Second Window")
        self.pushButton2 = QtWidgets.QPushButton(self.centralWidget)
        self.pushButton2.setGeometry(QtCore.QRect(110, 170, 191, 23))
        self.pushButton2.setText("LoadThirdWindow")
        self.pushButton4 = QtWidgets.QPushButton(self.centralWidget)
        self.pushButton4.setGeometry(QtCore.QRect(110, 210, 191, 23))
        self.pushButton4.setText("4 Window")
        self.pushButton5 = QtWidgets.QPushButton(self.centralWidget)
        self.pushButton5.setGeometry(QtCore.QRect(110, 250, 191, 23))
        self.pushButton5.setText("5 Window")
        FirstWindow.setCentralWidget(self.centralWidget)
        

    def LoadSecondWindow(self):
        SecondWindow = QtWidgets.QMainWindow()
        ui = Ui_SecondWindow()
        ui.setupUi(SecondWindow)
        SecondWindow.show()
        
class Ui_SecondWindow(object):
    
    def setupUi(self, SecondWindow):
        SecondWindow.resize(400, 300)
        self.centralWidget = QtWidgets.QWidget(SecondWindow)
        self.pushButton = QtWidgets.QPushButton(self.centralWidget)
        self.pushButton.setGeometry(QtCore.QRect(110, 130, 191, 23))
        SecondWindow.setCentralWidget(self.centralWidget)
        self.pushButton.setText('PushButton')
        
class Controller:

    def __init__(self):
        pass

    def Show_FirstWindow(self):

        self.FirstWindow = QtWidgets.QMainWindow()
        self.ui = Ui_FirstWindow()
        self.ui.setupUi(self.FirstWindow)
        self.ui.pushButton.clicked.connect(self.Show_SecondWindow)
        self.ui.pushButton2.clicked.connect(self.Show_ThirdWindow)
        self.ui.pushButton4.clicked.connect(self.Show_4Window)
        self.ui.pushButton5.clicked.connect(self.Show_5Window)
        
        self.FirstWindow.show()

    def Show_SecondWindow(self):
        
        self.SecondWindow = QtWidgets.QMainWindow()
        
        self.ui = Ui_SecondWindow()
        self.ui.setupUi(self.SecondWindow)
       
        self.SecondWindow.setWindowModality(QtCore.Qt.WindowModality.ApplicationModal)
        self.SecondWindow.show()
        print("Don't Stop")
        
    def Show_ThirdWindow(self):
        self.ThirdWindow = QtWidgets.QDialog()
        self.ThirdWindow.exec()
        print('Yess Stop Window 3')

    def Show_4Window(self):
        # https://stackoverflow.com/questions/19462112/pyqt-wait-until-widget-closes
        self.widget = QtWidgets.QMainWindow()
        self.widget.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose)
        self.widget.setWindowModality(QtCore.Qt.WindowModality.ApplicationModal)
        self.widget.show()
        loop = QtCore.QEventLoop()
        self.widget.destroyed.connect(loop.quit)
        loop.exec() # wait ...
        print('Yes Stop Window 4')
    
    def Show_5Window(self):
        def action5(self):
            print('Yes Stop Window 5')
            
        self.window5 = QtWidgets.QMainWindow()
        
        self.ui = Ui_SecondWindow()
        self.ui.setupUi(self.window5)
        self.window5.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose)
        self.window5.setWindowModality(QtCore.Qt.WindowModality.ApplicationModal)
        self.window5.show()
        self.window5.destroyed.connect(action5)
        

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    Controller = Controller()
    Controller.Show_FirstWindow()
    sys.exit(app.exec())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50029201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档