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

一般的に言えば、これでOKです。いくつかの改善を行うことができますが、それはこれらの信号をどのように使用しているかに大きく依存します. たとえば、3 つすべてが同じスロットに接続されている場合、ここでコードを削減して、基本クラスのポインターである 1 つの引数を持つ 1 つのシグナルを残すことができます。

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 に答える