QState.assignProperty 在 PySide 中不起作用

问题描述 投票:0回答:1

我看到这个例子使用QState,它似乎可以与PyQt5一起使用。然而,在尝试使用 PySide 时,我收到此错误;

Traceback (most recent call last):
    File ".../qstate-error.py", line 16, in <module>
        state1.assignProperty(widget, b'test', 1)
TypeError: 'PySide2.QtCore.QState.assignProperty' called with wrong argument types:
    PySide2.QtCore.QState.assignProperty(QWidget, bytes, int)
Supported signatures:
    PySide2.QtCore.QState.assignProperty(PySide2.QtCore.QObject, bytes, typing.Any)

不幸的是我必须使用 PySide 来工作,所以切换到 PyQt5 不是一个选择。我已经用 PySide2 和 PySide6 尝试过 - 两者都抛出此错误。但后来我看到 this Question 明确提到了 PySide - 所以想必它是有效的。那么 QState 是否需要一些我不知道的特殊设置?或者我的构建中有什么问题?我正在研究 Rocky 8,python 3.9.16

作为参考,以下示例在 pyqt5 中有效,但在 pyside2 中无效(在 pyside6 中结果相同)。

try:
    from PySide2.QtWidgets import QApplication, QWidget
    from PySide2.QtCore import QState
except ImportError:
    from PyQt5.QtWidgets import QApplication, QWidget
    from PyQt5.QtCore import QState


if __name__ == '__main__':

    app = QApplication([])
    widget = QWidget()
    state1 = QState()
    state1.assignProperty(widget, b'test', 1)
    widget.show()

    app.exec_()
python pyqt5 pyside2 pyside6
1个回答
0
投票

这是签名定义中的一个错误,已在 PYSIDE-2444 中报告。

基于 PyQt/PySide 约定,C++

char
应该是 Python 中的
bytes
,事实上该函数在 PyQt5/6 中按预期工作,也是最新的 PySide6 版本(由于与上述相关的修复)错误)。

实际上,许多接受

char
的函数也接受标准 Python 字符串并进行内部转换,这意味着您可以只使用以下内容:

state1.assignProperty(widget, 'test', 1)

如果您需要更严格的类型并始终使用字节,您最终可以使用 QState 子类并通过最终转换类型并调用基本实现来“覆盖”

assignProperty()
。它不会是一个real覆盖(因为你可以创建一个具有任何名称的函数并调用原始的
assignProperty()
),但它在代码读取中会更加一致。

© www.soinside.com 2019 - 2024. All rights reserved.