26 июня 2010

Как "динамически" соединить сигнал с сигналом/слотом?

Обычно соединение происходит в виде: connect(obj1, SIGNAL(signal()), obj2, SLOT(slot())); Но такой код не сработает, если имя слота хранится в переменной. Для решения проблемы имитируем макросы SIGNAL и SLOT.

QString signal1 = QMetaObject::normalizedSignature("signal1( )");
QString signal2 = QMetaObject::normalizedSignature("signal2( )");
QString slot1 = QMetaObject::normalizedSignature("slot( )");
connect(obj1, QString("%1%2").arg(QSIGNAL_CODE).arg(signal1).toLatin1().data()
, obj2, QString("%1%2").arg(QSIGNAL_CODE).arg(signal2).toLatin1().data());
connect(obj1, QString("%1%2").arg(QSIGNAL_CODE).arg(signal2).toLatin1().data()
, obj3, QString("%1%2").arg(QSLOT_CODE).arg(slot1).toLatin1().data());

2 комментария:

  1. вывел qDebug() << SIGNAL(...) и увидел, что шаблон получается не "%1%2", а "%1\"%2\""

    ОтветитьУдалить
  2. Поподробнее пожалуйста. Есть в qobjectdefs.h такой код:
    #define QTOSTRING_HELPER(s) #s
    #define QTOSTRING(s) QTOSTRING_HELPER(s)
    #ifndef QT_NO_DEBUG
    # define QLOCATION "\0"__FILE__":"QTOSTRING(__LINE__)
    # define METHOD(a) qFlagLocation("0"#a QLOCATION)
    # define SLOT(a) qFlagLocation("1"#a QLOCATION)
    # define SIGNAL(a) qFlagLocation("2"#a QLOCATION)
    #else
    # define METHOD(a) "0"#a
    # define SLOT(a) "1"#a
    # define SIGNAL(a) "2"#a
    #endif
    , в результате которого при релизной и отладочной сборках выводы макроса SIGNAL будут отличаться.

    ОтветитьУдалить