gpt4 book ai didi

c++ - Qt 是否可以定义一个函数指针来代替信号?

转载 作者:太空狗 更新时间:2023-10-29 23:35:12 25 4
gpt4 key购买 nike

我有很多信号,它们都具有相同的参数但执行不同的功能。

所有信号的连接和断开代码都相同,信号连接到的插槽处理程序也是如此。

而不是一遍又一遍地编写这段代码。我想使用函数指针或类似的东西来分配给信号,然后有一个执行连接或断开连接的通用代码块。

下面的代码只是为了说明我所描述的内容,它是无效的,不会编译。

    void (*pfnSignal)(quint8, QString);
switch( eSigID ) {
case SIGNAL_A:
pfnSignal = signalA;
break;
case SIGNAL_B:
pfnSignal = signalB;
break;
default:
pfnSignal = NULL;
}
if ( pfnSignal != NULL ) {
QObject::connect(pobjRef, pfnSignal, this, SLOT(handler(quint8, QString)));
}

最佳答案

在 Qt5 中,这可以很容易地完成,因为它允许使用 new pointer to member function syntax 进行连接。 .

// Using decltype to avoid figuring out the ugly pointer-to-member-function syntax. 
// Assumes all signals have the same arguments.
decltype<&ThatClass::someSignal> pfnSignal = nullptr;
switch( eSigID ) {
case SIGNAL_A:
pfnSignal = &ThatClass::signalA;
break;
case SIGNAL_B:
pfnSignal = &ThatClass::signalB;
break;
}

if (pfnSignal) {
connect(pobjRef, pfnSignal, this, &ThisClass::handler);
}

但实际上,这对于 Qt4 甚至是可能的,因为 SIGNAL 宏的类型是 const char*

const char *pfnSignal = nullptr;
switch( eSigID ) {
case SIGNAL_A:
pfnSignal = SIGNAL(signalA(quint8, QString));
break;
case SIGNAL_B:
pfnSignal = SIGNAL(signalB(quint8, QString));
break;
}
if (pfnSignal) {
QObject::connect(pobjRef, pfnSignal, this, SLOT(handler(quint8, QString)));
}

关于c++ - Qt 是否可以定义一个函数指针来代替信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43631464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com