1

シグナルを受信し、いくつかの条件をチェックし、それらが満たされている場合はシグナルをスロットに送信し、そうでない場合はシグナルを破棄するシグナルマネージャーを考えてみましょう。

シグナル (いくつかの引数) ---> [マネージャー] ---> スロット (いくつかの引数)

QMetaObject::invokeMethod を使用して、与えられた引数のセットごとに実装できます。たとえば、void signal(int) と void slot(int) の場合です。

.h

class Manager: public QObject
{
    Q_OBJECT
public:
    Manager(QObject* sender,const char* signal, QObject* recv, const char* slot);
private:
    bool isOkToSend();

    QString slotInvokeSyntax;
    QObject *recv;

private slots:
    On_Signal(int);
}

.cpp

Manager::Manager(QObject* sender,const char* signal, QObject* recvIn, const char* slot)
        : slotInvokeSyntax(slot)
        , recv(recvIn)
{
    connect(sender,signal,this,SLOT(On_Signal(int));
    //retrieving method name only
    slotInvokeSyntax.remove(0,1).remove(QRegExp("(*",Qt::CaseSensitive,QRegExp::Wildcard));
} 

Manager::On_Signal(int val)
{
    //invoking slot
    if(isOkToSend())
        QMetaObject::invokeMethod(recv,slotInvokeSyntax.toAscii().constData(),Q_ARG(int,val));
}

一般的な数/タイプの引数を持つシグナルとスロットに対してこれを何らかの形で一般化したいと思います-マネージャーが signal(QString)-slot(QString)、signal(int,int)-slot(int,int) のような任意のペアで動作するようにします、...

Manager で引数の型ごとにスロットを追加せずにこの機能を実装する方法はありますか? 私のアプローチが一般的に間違っている場合は、そのようなマネージャーを実装する方法についての提案を歓迎します!

編集

何を実装しようとしているのかを少し明確にします - 私は、多くの小さなウィジェット (またはサブシステム) で構成されるいくつかの可能な状態を持つ大規模なシステムを持っています (一部のサブシステムは、スタンドアロン アプリケーションまたは一部として機能することもできます)。より大きなシステム)。特定のUIイベント(ボタンのクリック、QLineEditでの編集、QDropboxの変更など)を傍受し、ウィジェットの対応するスロットを呼び出させるか、必要なアクションが干渉する場合は破棄するグローバルオブザーバーを実装しようとしていますシステムのグローバルな状態。システムコンポーネント間の依存関係を回避し、各サブシステムをスタンドアロンライブラリとしてコンパイルできるため(オブザーバーはシステムの他の部分に依存せず、したがってコアライブラリに配置されます)、シグナルを傍受することでそれを行いたいと思いますが、私'

4

1 に答える 1