当子窗口打开时关闭父窗口

Posted

技术标签:

【中文标题】当子窗口打开时关闭父窗口【英文标题】:Close parent window, when a sub window open 【发布时间】:2012-02-21 17:00:22 【问题描述】:

应用程序以登录表单启动,当用户和密码正确时,它会启动主窗口。我无法关闭登录表单(QWidget)。

def on_pushButton_login_clicked(self):
    username = str(self.ui.lineEdit_usuario.text())
    password = str(self.ui.lineEdit_password.text())
    if login_user(username, password):
        # Hide error if Login fail
        self.ui.label_error.hide()
        window = Main()    # QMainWindow
        try:
            window.exec_()
        except AttributeError:
            pass
        #self.close()       # close LoginForm & open QMainWindow
    else:
        self.ui.lineEdit_usuario.setFocus()
        self.ui.lineEdit_usuario.clear()
        self.ui.lineEdit_password.clear()
        # Show error if Login fail
        self.ui.label_error.show()

【问题讨论】:

【参考方案1】:

如果windowQMainWindow 实例,则它不会有exec_ 方法。但如果是这样,exec_ 意味着窗口将是模态的,因此会阻塞,直到用户关闭它。

另一方面,如果你使用 window.show() 来避免阻塞,LoginForm 自行关闭 - 但是 window 会立即被垃圾收集,因为你没有在任何地方保持对它的引用。

假设LoginFormQDialog,我建议你利用它的accept 插槽,然后重写你的启动代码以像这样工作:

class LoginForm(QDialog):
    ...
    def on_pushButton_login_clicked(self):
        username = str(self.ui.lineEdit_usuario.text())
        password = str(self.ui.lineEdit_password.text())
        if login_user(username, password):
            self.accept()
        else:
            ...

app = QtGui.QApplication(sys.argv)
if LoginForm().exec_() == QtGui.QDialog.Accepted:
    window = Main()
    window.show()
    sys.exit(app.exec_())

【讨论】:

以上是关于当子窗口打开时关闭父窗口的主要内容,如果未能解决你的问题,请参考以下文章

c# 子窗口如何将信息传至父窗口

当子窗口具有递增值时如何增加父组编号?

请问在PHP中用JS打,关闭子窗口,刷新父窗口,用echo " ";形式,谢了…

jsp点击右上角的X关闭子窗口刷新父窗口该如何实现呢?

window.open()打开一个子窗口,怎么实现在子窗口选择数据,然后提交把数据加到父窗口。

window.open()打开一个子页面,如何在子页面关闭时刷新父页面?