0

我需要根据参数类型从 SomeClass::fireSignal 成员函数中触发不同的信号。我看到的解决方案是使用 Qt 元系统。这样的任务有更正确的解决方案吗?请帮忙。提前致谢。

class SomeClass : public QObject
{
    Q_OBJECT
public:
    void fireSignal(BaseClass *param) {
        if(param->metaObject->className() == "DerivedClass1") {
            emit derivedClass1Signal(param)
        }
        if(param->metaObject->className() == "SecondDerivedClass") {
            emit secondDerivedClassSignal(param)
        }
        if(param->metaObject->className() == "OtherDerivedClass") {
            emit otherDerivedClassSignal(param)
        }
    }
signals:
    void derivedClass1Signal(DerivedClass1 *param);
    void secondDerivedClassSignal(SecondDerivedClass *param);
    void otherDerivedClassSignal(OtherDerivedClass *param)
};
4

2 回答 2

1

也许尝试:

class SomeClass : public QObject
{
Q_OBJECT
public:
void fireSignal(BaseClass *param) {
    if(param->metaObject->className() == DerivedCass::staticMetaObject.className()) {
        emit sig(qobject_cast<DerivedClass*>(param);
    }
    if(param->metaObject->className() == SecondDerivedClass::staticMetaObject.className()) {
        emit sig(qobject_cast<SecondDerivedClass*>(param);
    }
    if(param->metaObject->className() == OtherDerivedClass::staticMetaObject.className()) {
        emit sig(qobject_cast<OtherDerivedClass*>(param);
    }
}
signals:
    void sig(DerivedClass1 *param);
    void sig(SecondDerivedClass *param);
    void sig(OtherDerivedClass *param)
};
于 2012-10-04T00:10:25.300 回答
0

一般来说,这是可以的。您可以进行一些改进,但这在很大程度上取决于您如何使用这些信号。例如,如果所有三个都连接到同一个插槽,您可以在此处减少代码,留下一个信号,该信号有一个参数,该参数是基类的指针:

class SomeClass : public QObject
{
    Q_OBJECT
public:
    void fireSignal(BaseClass *param) {
            emit derivedClassSignal(param);
    }
signals:
    void derivedClassSignal(DerivedClass1 *param);
};

但是,从发送者的代码中删除检查将迫使您将其包含到接收者的代码中(即检查通过了哪个精确派生类型)。但是,如果每个信号都连接到不同的插槽,并且这些插槽只需要特定类型的参数,那么这将不起作用,您的方法会更好。

于 2012-10-03T12:30:41.920 回答