按照惯例,Qt 是否允许信号和槽具有不同的签名?
By convention does Qt allow signals and slots to have different signatures?
我根据使用 Qt 的经验假设所有信号和槽都需要相同的签名。最近我看到连接完全不同签名的 Qt 代码,当它们连接到的信号被发出时,槽被调用。例如,将几个对象发射到不带参数的插槽的信号。
我知道可以调用 QObject::connect() 来连接信号和插槽的不同方式,但我仍然认为规则是它们的签名必须相同。
来自 Qt Signals and Slots 上的文档:
The signature of a signal must match the signature of the receiving
slot. (In fact a slot may have a shorter signature than the signal it
receives because it can ignore extra arguments.)
基本上,您可以从插槽签名的末尾删除参数(您可以不从开头或中间删除它们)。
如果您需要忽略任意参数,您可以使您的槽的签名与信号相同,然后对您想要忽略的任何参数使用 Q_UNUSED
macro。例如:
void MyClass::mySlot(int foo, double argIDontCareAbout, int bar)
{
Q_UNUSED(argIDontCareAbout)
}
Q_UNUSED
宏的要点是简单地抑制有关未使用参数的编译器警告。
我根据使用 Qt 的经验假设所有信号和槽都需要相同的签名。最近我看到连接完全不同签名的 Qt 代码,当它们连接到的信号被发出时,槽被调用。例如,将几个对象发射到不带参数的插槽的信号。
我知道可以调用 QObject::connect() 来连接信号和插槽的不同方式,但我仍然认为规则是它们的签名必须相同。
来自 Qt Signals and Slots 上的文档:
The signature of a signal must match the signature of the receiving slot. (In fact a slot may have a shorter signature than the signal it receives because it can ignore extra arguments.)
基本上,您可以从插槽签名的末尾删除参数(您可以不从开头或中间删除它们)。
如果您需要忽略任意参数,您可以使您的槽的签名与信号相同,然后对您想要忽略的任何参数使用 Q_UNUSED
macro。例如:
void MyClass::mySlot(int foo, double argIDontCareAbout, int bar)
{
Q_UNUSED(argIDontCareAbout)
}
Q_UNUSED
宏的要点是简单地抑制有关未使用参数的编译器警告。