如何从Qdialog窗口返回



我有以下代码来创建一个;关于";windows

class Ui_aboutWindow(QDialog):
def setupUi(self, aboutWindow):
aboutWindow.setObjectName("aboutWindow")
aboutWindow.setEnabled(True)
aboutWindow.resize(330, 300)
aboutWindow.setWindowTitle("About")
#aboutWindow.setWhatsThis("")
self.aboutText = QtWidgets.QTextBrowser(aboutWindow)
self.aboutText.setGeometry(QtCore.QRect(20, 10, 280, 190))
#self.aboutText.setWhatsThis("")
self.aboutText.setAcceptRichText(False)
self.aboutText.setObjectName("aboutText")
self.horizontalLayoutWidget = QtWidgets.QWidget(aboutWindow)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(20, 240, 281, 41))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.btSysinfo = QtWidgets.QPushButton(self.horizontalLayoutWidget)
self.btSysinfo.setText("SysInfo")
self.btSysinfo.setObjectName("btSysinfo")
self.horizontalLayout.addWidget(self.btSysinfo)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.btOK = QtWidgets.QPushButton(self.horizontalLayoutWidget)
self.btOK.setToolTip("")
self.btOK.setWhatsThis("")
self.btOK.setText("OK")
self.btOK.setShortcut("")
self.btOK.setObjectName("btOK")
self.horizontalLayout.addWidget(self.btOK)
# connect buttons to signal
self.btOK.clicked.connect(self.return_ok)
self.btSysinfo.clicked.connect(self.sysinfo)
def return_ok(self):
print("OK clicked")
self.destroy()
return
def sysinfo(self):
print("sysinfo clicked")
pass

我从主窗口调用这个,就像一样

def aboutActionProcedure(self):
# print("Opening a new popup window...")
dialog = QtWidgets.QDialog()
dialog.ui = Ui_aboutWindow()
dialog.ui.setupUi(dialog)
dialog.exec_()

about窗口中的OK按钮调用return_OK例程(用print语句验证(,但about窗口不会关闭

我不想使用Qmessagebox,因为我想在窗口中添加另一个非标准按钮(sysInfo按钮(

我在这里错过了什么?

您的代码中存在一些问题和误解。

首先,您不是在使用Ui_aboutWindow子类,或者,至少,您没有像您想象的那样使用它
我的印象是,您试图模仿pyuic生成的文件的行为,这是应该避免的:pyuic文件被写为"界面层";从ui文件构建GUI,但如果你要手动创建它,你应该只创建QWidgets(或者,在你的情况下,QDialog(的子类,而不使用setupUi

问题是,将setupUi与您创建的新QDialog实例一起使用,return_oksysinfo函数中的self实际上指的是您创建的Ui_aboutWindow实例,但您实际显示的是";设置";是在aboutActionProcedure函数中创建的QDialogdialog实例。因此,destroy实际上将尝试销毁Ui_aboutWindow实例(从未显示(。

其他注意事项和问题:

  • 应该始终为顶级小部件设置布局管理器
  • 即使需要自定义按钮,也可以使用QMessageBox:只需使用addButton()
  • 您可以为对话框按钮使用QDialogButtonBox,就像消息框一样,使用具有特定角色的addButton()添加一个自定义按钮(对于自定义用途,ActionRole可能是最佳选择(
  • destroy()不是关闭窗口的正确方法,请使用close()(了解更多关于差异的信息(
  • 要正确返回已被exec计算的QDialog,不应调用close,而应使用现有函数之一:accept()reject()done(r)

这里有一种更简单、更干净的方法来实现您想要的:

from PyQt5 import QtWidgets
class AboutWindow(QtWidgets.QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.resize(330, 300)
self.setWindowTitle("About")
layout = QtWidgets.QVBoxLayout(self)
self.aboutText = QtWidgets.QTextBrowser()
self.aboutText.setAcceptRichText(False)
layout.addWidget(self.aboutText)
self.buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok)
layout.addWidget(self.buttonBox)
self.btSysinfo = QtWidgets.QPushButton("SysInfo")
self.buttonBox.addButton(self.btSysinfo, QtWidgets.QDialogButtonBox.ActionRole)
self.btSysinfo.clicked.connect(self.sysinfo)
self.buttonBox.accepted.connect(self.return_ok)
# note that, if you don't need to do anything specific, you can also do this:
# self.buttonBox.accepted.connect(self.accept)
def return_ok(self):
print("OK clicked")
# set the dialog as "accepted" and return its exec()
self.accept()
def sysinfo(self):
print("sysinfo clicked")

class Test(QtWidgets.QWidget):
def __init__(self):
super().__init__()
layout = QtWidgets.QHBoxLayout(self)
btn = QtWidgets.QPushButton('About...')
layout.addWidget(btn)
btn.clicked.connect(self.aboutActionProcedure)
def aboutActionProcedure(self):
# print("Opening a new popup window...")
dialog = AboutWindow()
dialog.exec_()
if __name__ == '__main__':     
import sys
app = QtWidgets.QApplication(sys.argv)
w = Test()
w.show()
sys.exit(app.exec_())

最新更新