我有以下代码来创建一个;关于";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_ok
和sysinfo
函数中的self
实际上指的是您创建的Ui_aboutWindow
实例,但您实际显示的是";设置";是在aboutActionProcedure
函数中创建的QDialog
的dialog
实例。因此,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_())