C++ 根据参数类型,Qt触发不同的信号

C++ 根据参数类型,Qt触发不同的信号,c++,qt,polymorphism,signals,C++,Qt,Polymorphism,Signals,我需要从SomeClass::fireSignal成员函数中激发不同的信号,具体取决于它的参数类型。我看到的解决方案是使用Qt元系统。对于这样的任务,是否有更正确的解决方案?请帮忙。提前谢谢 class SomeClass : public QObject { Q_OBJECT public: void fireSignal(BaseClass *param) { if(param->metaObject->className() == "Derive

我需要从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)
};

一般来说,这是可以的。您可以做出一些改进,但这将严重取决于您如何使用这些信号。例如,如果这三个都连接到同一个插槽,您可以在此处减少代码,留下一个信号,其中有一个参数是基类的指针:

class SomeClass : public QObject
{
    Q_OBJECT
public:
    void fireSignal(BaseClass *param) {
            emit derivedClassSignal(param);
    }
signals:
    void derivedClassSignal(DerivedClass1 *param);
};
但是,从发送方代码中删除检查将迫使您将其包括在接收方代码中(即,已传递确切派生类型的检查)。但是,如果每个信号都连接到不同的插槽,而这些插槽只需要特定类型的参数,那么这将不起作用,您的方法会更好

不妨试试:

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)
};
class-SomeClass:public-QObject
{
Q_对象
公众:
无效火灾信号(基类*参数){
如果(参数->元对象->类名()==DerivedCass::staticMetaObject.className()){
发射信号(qobject_cast,参数);
}
if(param->metaObject->className()==seconderivedClass::staticMetaObject.className()){
发射信号(qobject_cast,参数);
}
如果(参数->元对象->类名()==OtherDerivedClass::staticMetaObject.className()){
发射信号(qobject_cast,参数);
}
}
信号:
无效信号(DerivedClass1*param);
无效信号(第二类*参数);
无效信号(其他派生类*参数)
};

基类的
层次结构是您自己的吗?如果是,您可以使用访客模式(又称双重分派).@mol,如果每个信号连接到不同的插槽,则该操作将不起作用individually@molbnilo,您能描述一下它是如何实现的吗?@Singer,是的,我需要将信号连接到不同的插槽。谢谢。我需要将信号连接到不同的插槽。我可以在基类中使用一些虚拟成员函数来返回指向正确sig的指针吗nal和将在派生类中被重写?在比较类名称的const char*时可能会遇到问题,如果是,请使用它们生成QString。