class QSignalSpy#

QSignalSpy 类可用于信号发射的反射。 更多

Inheritance diagram of PySide6.QtTest.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)#
参数:

signalPySideSignalInstance

构建一个新QSignalSpy对象以监听信号的发射。

__init__(obj, signal)
参数:

警告

本节包含自动从C++转换为Python的代码片段,可能存在错误。

构建一个新的 QSignalSpy 对象,用于监听从 QObject 对象 obj 发出的 signal 信号。如果 QSignalSpy 无法监听有效的信号(例如,因为 objNonesignal 不表示 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)
参数:

警告

本节包含自动从C++转换为Python的代码片段,可能存在错误。

Constructs a new QSignalSpy that listens for emissions of the signal from the QObject object. If QSignalSpy is not able to listen for a valid signal (for example, because object is None or signal does not denote a valid signal of object), an explanatory warning message will be output using qWarning() and subsequent calls to isValid() will return false.

示例

spy = QSignalSpy(myPushButton, SIGNAL(clicked(bool)))
at(arg__1)#
参数:

参数

返回类型:

返回一个包含 QVariant 类型的列表

count()#
返回类型:

返回一个 int 类型的值

isValid()#
返回类型:

返回一个 bool 类型的值

如果信号监听器正在监听一个有效的信号,返回 true,否则返回 false。

signal()#
返回类型:

返回一个 QByteArray 类型的值

返回当前监听器正在监听的标准化信号。

size()#
返回类型:

返回一个 int 类型的值

wait(timeout)#
参数:

timeout – int

返回类型:

返回一个 bool 类型的值

这是一个重载函数,相当于将 timeout 传递给chrono重载。

wait(std::chrono::milliseconds{timeout});

如果信号在 timeout 内发出至少一次,则返回 true,否则返回 false