2016-07-07 3 views
1

Допустим SomeClass есть члены Object1 и Object2 и существует связь между Object1 и Object2 как:Qt Экспедиторские соединения сигнал/слот

connect(Object1, signal1, Object2, slot1) 

После некоторого рефакторинга Object3 был добавлен в SomeClass и Object2 был перемещен, чтобы быть член Object3, но все еще существует потребность в соединении между Object1 и Object2.

Связь между Object1 и Object2 должна пройти через Object3. Это означает, что необходимо изменить Object3, добавив пару сигналов/слотов, чтобы реализовать эту связь между Object1 и Object2.

Это означает, что оба параметра .h и .cpp Object3 будут изменены, добавив много строк кода, чтобы сделать что-то, что было сделано ранее в одной строке.

Моя ленивая сторона говорит, что в этой истории есть что-то странное. Есть ли способ сделать это соединение более прямым?

+0

_ "Это означает, что Object3 необходимо изменить ..." _ - why ??? то же 'connect (Object1, signal1, Object2, slot1)' будет работать как раньше (я полагаю, что 'Object1' и' Object2' являются указателями в вашем коде) – mvidelgauz

ответ

5

Вы инкапсулируете Object2 в пределах Object3. С точки зрения пользователя от Object3 ничего не меняется: для установления соединения есть еще одна строка кода. Object3 нуждается в дополнительном слоте, который отправляется на экземпляр Object2, который он сейчас инкапсулирует. Это один дополнительная линия здесь. Вот и все.

struct Object1 : QObject { 
    Q_SIGNAL void signal1(); 
    Q_OBJECT 
}; 
struct Object2 : QObject { 
    Q_SLOT void slot1() {} 
    Q_OBJECT 
}; 
class Object3 : QObject { 
    Q_OBJECT 
    Object2 m_object2; 
public: 
    // one line to expose object2's slot 
    Q_SLOT void slot1() { m_object2.slot1(); } 
}; 

class SomeClass { 
    Object1 m_object1; 
    Object3 m_object2; 
public: 
    SomeClass() { 
    // still one line 
    connect(&m_object1, &Object1::signal1, &m_object3, &Object3::slot1); 
    } 
}; 
+0

Должен ли я предпочитать Q_SLOT/Q_SLOTS (и Q-SIGNAL/Q_SIGNALS, EMIT ...) над классическими публичными слотами? Я понимаю, почему они требуются из http://doc.qt.io/qt-5/signalsandslots.html#using-qt-with-3rd-party-signals-and-slots, но должны использовать это как стиль по умолчанию даже не используя сторонние сигналы и слоты? – KcFnMi

+0

@KcFnMi Я предпочитаю префикс 'Q_', чтобы глобальное пространство имен не было загрязнено макросами, такими как' сигналы' или 'слоты'. Я предпочитаю 'Q_SIGNAL' и' Q_SLOT' над 'Q_SIGNALS' и' Q_SLOTS', когда количество сигналов/слотов невелико и не гарантирует весь раздел. Кроме того, часто логически сигналы/слоты не принадлежат друг другу, но другими способами. Мне нравится использовать 'emit' над' Q_EMIT', поскольку он делает самообъявление кода не уродливым. В любом случае использование 'emit' /' Q_EMIT' является необязательным, это только для потребления человеком. –

+0

Является ли вызов слота все еще асинхронным ('Q_SLOT void slot1() {m_object2.slot1();}')? – KcFnMi

Смежные вопросы