2015-03-20 5 views
4

У меня есть базовый класс, который определяет слот QtOverride Qt слот в подклассе

class Base 
{ 
public: 
    Base() 
    { 
     connect(otherobject, SIGNAL(mySignal), this, SLOT(mySlot)); 
    } 
public slots: 
    virtual void mySlot() 
    {} 
} 

подклассы просто реализует некоторые другие вещи. Подкласс B перекрывает слот

class SubB : Base 
{ 
public: 
    SubB() : Base() 
    { 
     // Necessary? 
     connect(otherobject, SIGNAL(mySignal), this, SLOT(mySlot)); 
    } 
public slots: 
    virtual void mySlot() override 
    {} 
} 

ли переопределение слота также заменить соединение, которое было сделано ранее в конструкторе Bass (т.е. подключаться в SUBB было бы ненужным)?

+5

Чтобы быть 100% правильно, не забывайте, что база должна наследоваться от 'QObject' и вы должны поместить макрос Q_OBJECT внутри обоих классов;) –

ответ

4

В конструкторе подкласса вам не нужно помещать то же самое connect. Когда создается объект SubB, connect в конструкторе Base соединит правый слот (тот, который переопределен в SubB).

+0

Вот что я надеялся. Не удалось найти что-либо в документах. – Simon

+3

@Simon Это действительно поможет взглянуть на код, сгенерированный moc для реализации 'Base'. Вы можете легко увидеть, как называется слот. –

7

Это становится лучше: вам не нужна специальная обработка слота в производном классе. Нет необходимости делать его виртуальным (это уже для семантики C++), и нет необходимости снова делать его слотом (это уже для семантики Qt). Неправильно добавить второе соединение в Derived, это просто приведет к тому, что слот активируется дважды за каждую активацию сигнала.

Помните, что сигналы и слоты являются обычными методами C++, и эти слоты вызывают из машинного кода, который выглядит точно так, как если бы вы вызывали слот без указания конкретного класса, в котором он должен быть. Таким образом, виртуальный слот действует так, как вы Думайте, что это нужно, учитывая семантику C++.

Ниже достаточно:

class Base : public QObject 
{ 
    Q_OBJECT 
public: 
    Base(QObject * src, QObject * parent = 0) : QObject(parent) 
    { connect(src, SIGNAL(mySignal), SLOT(mySlot)); } 
    Q_SLOT virtual void mySlot() {} 
}; 

class Derived : public Base 
{ 
    Q_OBJECT 
public: 
    Derived(QObject * src, QObject * parent = 0) : Base(src, parent) {} 
    void mySlot() Q_DECL_OVERRIDE { ... } 
}; 
Смежные вопросы