报错:
TypeError: question(QWidget, str, str, buttons: Union[QMessageBox.StandardButtons, QMessageBox.StandardButton] = QMessageBox.StandardButtons(QMessageBox.Yes|QMessageBox.No), defaultButton: QMessageBox.StandardButton = QMessageBox.NoButton): argument 1 has unexpected type 'Ui_MainWindow'
报错的提示是QMessage.question()函数的第一个参数的类型不对。
代码中也警告:Unexpected type(s):(Ui_MainWindow, str, str, Any, Any)
具体代码
我直接将自己定义的 tipDialog()
函数放在了上面定义的Ui_MainWindow()
类中,第一个参数使用了self
,这里的self
应该指代的Ui_MainWindow()
类,所以出现了类型不符合的错误。
因为这个类的代码是用QtDesigner
自动生成的,就不想改类的代码了。但可以从QMessageBox.question
函数下手解决问题。
那我们就开看看QMessageBox.question函数的参数规则
QMessageBox.question
使用QMessageBox.question可以直接弹出带选择按钮的对话框,然后可以通过判定来获取用户的选择结果。
基本格式: QMessage.question(parent, title, content, button)
parent: 表示对话框所归属的程序窗口。填写父类(通常为self);若不属于任何程序窗口,为None。
title: 标题。
content: 内容。
button: 对话框按钮。
result = QMessageBox.question(self, '提示', '文件保存路径不存在,是否创建?', QMessageBox.Yes | QMessageBox.No,QMessageBox.No)
QMessageBox.Yes | QMessageBox.No 表示要显示什么样的按钮,最后一个参数QMessageBox.No
表示默认选中哪个按钮。
报错解决方法:
将QMessageBox.question
的第一个参数设为None
,就不会再报错了。
def tipDialog(self,path):
result = QMessageBox.question(None, '提示', '文件保存路径不存在,是否创建?', QMessageBox.Yes | QMessageBox.No,QMessageBox.No) # 默认关闭界面选择No
if result == QMessageBox.Yes:
os.makedirs(path)
return True
else:
return False
测试程序
为了验证,专门编了一段测试小代码,可以正常弹出提问对话框。
from PyQt5.QtWidgets import QMessageBox, QApplication
import os
import sys
class test():
def __init__(self,path):
self.path = path
def tipDialog(self):
result = QMessageBox.question(None, '提示', '文件保存路径不存在,是否创建?', QMessageBox.Yes | QMessageBox.No,QMessageBox.No) # 默认关闭界面选择No
if result == QMessageBox.Yes:
os.makedirs(self.path)
return True
else:
return False
if __name__ == '__main__':
# pass
app = QApplication(sys.argv)
demo = test('123')
demo.tipDialog()
sys.exit(app.exec_())
关于其他类型的对话框(消息对话框、提问对话框、警告对话框、严重错误对话框、关于对话框)可以学习下面这篇文章:
[ PyQt入门教程 ] PyQt5基本控件使用:消息弹出、用户输入、文件/目录选择对话框
参考文章
PyQt5 QMessageBox.question一种偷懒的快速对话框