- class QSignalSpy#
QSignalSpy
类可用于信号发射的反射。 更多…摘要#
方法#
注意
此文档可能包含自动从 C++ 转换到 Python 的代码片段。我们始终欢迎对片段翻译的贡献。如果您发现翻译存在问题,也可以通过在 https:/bugreports.qt.io/projects/PYSIDE 上创建工单来通知我们。
详细描述#
警告
本节包含自动从C++转换为Python的代码片段,可能存在错误。
QSignalSpy
可以连接到任何对象的任何信号并记录其发射。QSignalSpy
自身是一个QVariant列表。每个信号的发射都会将一个条目添加到列表中,包含信号的参数。以下示例记录了一个QCheckBox的
clicked()
信号的信号发射。box = ... spy = QSignalSpy(box, SIGNAL(clicked(bool))) # do something that triggers the signal box.animateClick() QCOMPARE(spy.count(), 1) # make sure the signal was emitted exactly one time arguments = spy.takeFirst() # take the first signal QVERIFY(arguments.at(0).toBool() == True) # verify the first argument
spy.takeFirst()
返回第一个发射的信号的参数,作为QVariant对象列表。clicked()
信号有一个单一布尔参数,它作为参数列表中的第一个条目存储。以下示例捕获了自定义对象的信号。
spy = QSignalSpy(myCustomObject, SIGNAL(mySignal(int,QString,double))) myCustomObject.doSomething() # trigger emission of the signal arguments = spy.takeFirst() QVERIFY(arguments.at(0).typeId() == QMetaType.Int) QVERIFY(arguments.at(1).typeId() == QMetaType.QString) QVERIFY(arguments.at(2).typeId() == QMetaType.Double)
注意
需要在使用
QSignalSpy
之前,使用函数qRegisterMetaType()
注册非标准数据类型。例如qRegisterMetaType<SomeStruct>() spy = QSignalSpy(model, SIGNAL(whatever(SomeStruct)))
要检索实例,您可以使用qvariant_cast
# get the first argument from the first received signal: result = SomeStruct(spy.at(0).at(0))
验证信号发射#
QSignalSpy
类提供了一种优雅的机制来捕获对象发出的信号列表。但是,您应该在构造后验证其有效性。构造函数执行多个健康检查,例如验证要监控的信号是否确实存在。为了使测试失败的诊断更容易,在继续进行测试之前,应该通过调用QVERIFY(spy.isValid())
来检查这些检查的结果。另请参阅
QVERIFY()
- __init__(signal)#
- 参数:
signal –
PySideSignalInstance
构建一个新
QSignalSpy
对象以监听信号的发射。- __init__(obj, signal)
- 参数:
obj –
QObject
signal –
QMetaMethod
警告
本节包含自动从C++转换为Python的代码片段,可能存在错误。
构建一个新的
QSignalSpy
对象,用于监听从 QObject 对象obj
发出的signal
信号。如果QSignalSpy
无法监听有效的信号(例如,因为obj
是None
或signal
不表示obj
的有效信号),将通过 qWarning() 输出一个解释性警告信息,并且后续调用isValid()
将返回 false。此构造函数非常适合在测试中大量使用 Qt 的元对象系统时使用。
基本使用示例
object = QObject() mo = object.metaObject() signalIndex = mo.indexOfSignal("objectNameChanged(QString)") signal = mo.method(signalIndex) spy = QSignalSpy(object, signal) object.setObjectName("A object() name") QCOMPARE(spy.count(), 1)
想象一下,我们需要检查 QWindow 类表示的最小和最大尺寸的所有属性是否可以正确写入。下面的示例演示了一种方法
def writeMinMaxDimensionalProps_data(self): QTest.addColumn<int>("propertyIndex") # Collect all relevant properties mo = QWindow.staticMetaObject() for i in range(mo.propertyOffset(), mo.propertyCount()): property = mo.property(i) # ...that have type int if property.type() == QVariant.Int: re = QRegularExpression("^minimum|maximum") name = property.name() # ...and start with "minimum" or "maximum" if re.match(name).hasMatch(): QTest.addRow("%s", name) << i def writeMinMaxDimensionalProps(self): QFETCH(int, propertyIndex) property = QWindow.staticMetaObject.property(propertyIndex) QVERIFY(property.isWritable()) QVERIFY(property.hasNotifySignal()) window = QWindow() spy = QSignalSpy(window, property.notifySignal()) QVERIFY(property.write(window, 42)) QCOMPARE(spy.count(), 1)
- __init__(obj, aSignal)
- 参数:
obj –
QObject
参数
警告
本节包含自动从C++转换为Python的代码片段,可能存在错误。
Constructs a new
QSignalSpy
that listens for emissions of thesignal
from the QObjectobject
. IfQSignalSpy
is not able to listen for a valid signal (for example, becauseobject
isNone
orsignal
does not denote a valid signal ofobject
), an explanatory warning message will be output using qWarning() and subsequent calls toisValid()
will return false.示例
spy = QSignalSpy(myPushButton, SIGNAL(clicked(bool)))
- at(arg__1)#
- 参数:
参数
- 返回类型:
返回一个包含 QVariant 类型的列表
- count()#
- 返回类型:
返回一个 int 类型的值
- isValid()#
- 返回类型:
返回一个 bool 类型的值
如果信号监听器正在监听一个有效的信号,返回
true
,否则返回 false。- signal()#
- 返回类型:
返回当前监听器正在监听的标准化信号。
- size()#
- 返回类型:
返回一个 int 类型的值
- wait(timeout)#
- 参数:
timeout – int
- 返回类型:
返回一个 bool 类型的值
这是一个重载函数,相当于将
timeout
传递给chrono重载。wait(std::chrono::milliseconds{timeout});
如果信号在
timeout
内发出至少一次,则返回true
,否则返回false
。