如何关闭模态窗口的非模态子窗口?

时间:2015-12-08 15:22:22

标签: qt modal-dialog pyside

使用PySide(Qt)我试图从模态窗口打开一个非模态窗口。

模态窗口实际上等待强制性答案,其上有一个图标,弹出一个关于用户可以回答的帮助窗口。

在模态父实际关闭之前,我无法找到关闭(非模态)帮助窗口的方法。

有没有办法将子窗口设置为模态,同时仍然保持其父模态?

1 个答案:

答案 0 :(得分:3)

在下面的示例中,我将向您展示如何在模式对话框关闭之前或之后从模式对话框中关闭另一个窗口。这不是很困难,只需要在另一个窗口(您的帮助窗口)上调用close

示例:

from PySide import QtCore, QtGui

def start_modal_dialog():
    modal_dlg = QtGui.QDialog(main_window) # a modal dialog
    modal_dlg.setWindowTitle('Modal Dialog')
    modal_dlg.setFixedSize(200, 200)

    modeless_help_window = QtGui.QLabel('Explanations', modal_dlg, QtCore.Qt.Window) # a modeless help window
    modeless_help_window.setWindowTitle('Modeless Help Window')
    modeless_help_window.setFixedSize(200, 200)
    modeless_help_window.show()

    help_window_close_button = QtGui.QPushButton('Close Help window', modal_dlg)
    help_window_close_button.clicked.connect(modeless_help_window.close)

    modal_dlg.exec_() # execute the dialog

    modeless_help_window.close() # close the modeless help window after the modal dialog window is closed

app = QtGui.QApplication([]) # create app

main_window = QtGui.QMainWindow() # main window
main_window.setWindowTitle('Main Window')
main_window.setFixedSize(200, 200)
dlg_start_button = QtGui.QPushButton('Start Modal dialog', main_window) # add a button
dlg_start_button.clicked.connect(start_modal_dialog) # which shows the dialog
main_window.show()

app.exec_()

我有一个带按钮的主窗口。单击该按钮时,将启动模态对话框(QDialog的实例),但同时会显示无模式窗口(为简单起见,只显示QLabel)。在模态对话框中还有一个按钮,如果单击该按钮,则关闭无模式窗口。在执行对话框后,关闭无模式窗口(以防万一没有按下按钮)。

在那里你看到关闭另一个窗口只需要调用close,但我也设置了一个层次结构。模态对话框是主窗口的子窗口,无模式(帮助)窗口是模态对话框的子窗口。没有它,它可能也不会起作用。

enter image description here