我看到这个例子使用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_()
这是签名定义中的一个错误,已在 PYSIDE-2444 中报告。
基于 PyQt/PySide 约定,C++
char
应该是 Python 中的 bytes
,事实上该函数在 PyQt5/6 中按预期工作,也是最新的 PySide6 版本(由于与上述相关的修复)错误)。
实际上,许多接受
char
的函数也接受标准 Python 字符串并进行内部转换,这意味着您可以只使用以下内容:
state1.assignProperty(widget, 'test', 1)
如果您需要更严格的类型并始终使用字节,您最终可以使用 QState 子类并通过最终转换类型并调用基本实现来“覆盖”
assignProperty()
。它不会是一个real覆盖(因为你可以创建一个具有任何名称的函数并调用原始的assignProperty()
),但它在代码读取中会更加一致。