首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQt6:“QMessageBox”关键字未被识别

PyQt6:“QMessageBox”关键字未被识别
EN

Stack Overflow用户
提问于 2022-08-09 00:04:47
回答 3查看 144关注 0票数 2

我对PyQt非常陌生,所以我可能做错了。我目前正在努力在title实例化期间设置QMessageBox的PyQt6属性。这是我的代码:

代码语言:javascript
复制
import PyQt6.QtWidgets as Qtw

app = Qtw.QApplication([])
alert_window = Qtw.QMessageBox(text="Foo", title="Bar")
alert_window.exec()

在运行这个程序时,我会得到以下错误:

代码语言:javascript
复制
TypeError: 'title' is an unknown keyword argument

但是,__init__ for QMessageBox (位于Python QtWidgets.pyi中)似乎清楚地将title定义为字符串参数,我正在正确地传递该参数:

代码语言:javascript
复制
@typing.overload
    def __init__(self, icon: 'QMessageBox.Icon', title: str, text: str, buttons: 'QMessageBox.StandardButton' = ..., parent: typing.Optional[QWidget] = ..., flags: QtCore.Qt.WindowType = ...) -> None: ...

我试图通过删除title关键字参数并离开text来运行它,它似乎运行得很好。我是完全遗漏了什么,还是.pyi文件不正确?而且,如果这个文件不正确,我还可以引用PyQt的其他文档来查找我可以使用和不能使用的参数吗?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-08-09 01:43:11

你有两个问题:

  • 你混淆了位置和命名的论点;
  • QObject属性可以用作命名参数;

位置参数与命名参数

代码语言:javascript
复制
def function(positional1, positional2, named1=something, named2=whatever):

简单地说,上面的意思是,function

  • 需要两个参数(positional1和positional2`2‘);
  • 可以有两个可选参数(named1named2);

位置论点:

  • 在调用函数时需要;
  • 必须遵守订单(可能的话,其预期的类型);
  • 它们的名称仅供参考使用;

命名的论点:

  • 在调用函数时不需要;
  • 如果未指定,则使用它们的默认值,即在=符号之后计算的值;
  • 可以添加作为位置参数,同时尊重顺序(function(x, y, z)意味着named1将等于函数中的z );
  • 可能不是按照相同的顺序(function(x, y, named2=z, named1=w));

上面的意思是调用function(x)将是正确的,而function(positional1=x)则不会。

QObject性质

几乎所有的QObjects都接受与对象属性相对应的命名参数,即使它们没有在构造函数的定义中声明。

例如,所有QWidgets都支持enabled属性,这意味着您可以执行以下操作:

代码语言:javascript
复制
button = QPushButton(enabled=False)

问题所在

为什么这不管用?

代码语言:javascript
复制
Qtw.QMessageBox(text="Foo", title="Bar")

这有两个原因:

  1. 构造函数中列出的title参数只是一个位置参数,因此,如上所述,使用命名参数title="Bar"是错误的;
  2. title,不是在QMessageBox属性列表中列出的(也不是在继承的类中);

为什么会起作用?

代码语言:javascript
复制
Qtw.QMessageBox(text="Foo")

这有两个原因:

  1. 在QMessageBox构造函数中,也有一个不需要位置参数;
  2. text()是QMessageBox的一个有效的Qt性质;

最后注记

  1. 不要使用pyi存根/定义作为参考;使用文档,从官方的C++ API开始(与用于help(class.function)的99.9%相同),并最终使用help(class.function)检查交互式help(class.function)控制台中的参数和返回值;
  2. 更仔细地研究和研究Python中的函数参数,包括参数解包装(通常,*args**kwargs);
  3. PyQt (和PySide一样)是一个绑定;它只是封装了Qt库的C++端的类和函数;这就是为什么您可以(而且应该)使用正式的C++文档,而不是寻找正式的PyQt文档(甚至是有时会误导的PyQt文档),除非严格要求;
票数 3
EN

Stack Overflow用户

发布于 2022-08-09 00:23:44

在哪里可以找到PyQt5方法签名?

您似乎不能将这些用作关键字参数。你必须这样做:

代码语言:javascript
复制
alert_window = Qtw.QMessageBox("Foo", "Bar")
票数 1
EN

Stack Overflow用户

发布于 2022-08-09 00:34:13

我看到您有问题的地方是传递给Qtw.QMessangeBox的参数。

你必须这样通过它:alert_window = Qtw.QMessageBox("Foo", "Bar")

由于不能用参数内的数据将变量分配给它,所以它必须是在当时编写的全局或本地作用域中已经设置的变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73285226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档