2016-05-26 4 views
0

Я создал класс для обработки данных, полученных из слотов, и создал несколько перегруженных методов с тем же именем с другим типом параметра.Перегрузка сигналов и слотов Qt5.6

Можно ли использовать перегруженные методы в качестве слотов?

У меня есть два заявления, до сих пор:

void notify(uint uintData); 
    void notify(float fltData); 

Однако второй производит предупреждение во время выполнения:

QObject::connect: No such slot clsSlot::notify(float) 

Найдено это что означает, что должно работать: http://doc.qt.io/qt-5/signalsandslots.html

Но это Безразлично 't ...

От класса' clsSlot ':

public slots: 
     void notify(uint uintValue); 
     void notify(float fltValue); 

Реализация:

void clsSlot::notify(float fltValue) { 
     notifyPrimitive(meID, QString::number(fltValue)); 
    } 
    void clsSlot::notify(uint uintValue) { 
     notifyPrimitive(meID, QString::number(uinValue)); 
    } 

Connect вызов:

 QObject::connect(Fcs::Mount::GetRef() 
         ,&Fcs::Mount::signalElevation 
         ,pobjHandler, &clsSlot::notify); 

pobjHandler является указателем на экземпляр clsSlot.

+1

Да, у вас могут быть перегруженные слоты. Вам нужно будет показать больше кода. Например, как вы фактически выполняете соединение? Как объявлен и определен слот? –

+0

Отредактировано с объявлением и вызовом соединения. – SPlatten

ответ

1
QObject::connect(Fcs::Mount::GetRef() 
    ,&Fcs::Mount::signalElevation 
    ,pobjHandler, &clsSlot::notify); 

Проблема с выше кода является то, что существует более чем одна notify функция (то есть, так как он перегружен). Вы должны указать, к какому из них нужно подключиться. Вы можете сделать это с помощью броска, но в этом случае вам следует просто использовать более старый синтаксис Qt. Например:

connect(sender, SIGNAL(signalFn(float)), this, SLOT(notify(float))); 
connect(sender, SIGNAL(signalFn(uint)), this, SLOT(notify(uint))); 

Очевидно, что выше код подключения является только примером синтаксиса, и вы должны будете заполнить его с соответствующим кодом (например, заменить sender с Fcs::Mount::GetRef() возможно).


Edit: Вот link в документацию Qt, объясняя, почему старый синтаксис должен быть использован для перегрузок.

перегрузки

Как вы могли видеть в приведенном выше примере, подключение к QAbstractSocket :: ошибка не очень красиво, так как ошибка имеет перегрузку, и принимая адрес перегруженной функции требуется явное приведение, например соединение, которое ранее было сделано следующим образом:

connect(mySpinBox, SIGNAL(valueChanged(int)), mySlider, SLOT(setValue(int)); 

не могут быть просто преобразованы в:

connect(mySpinBox, &QSpinBox::valueChanged, mySlider, &QSlider::setValue); 

... потому что QSpinBox имеет два сигнала с именем ValueChanged() с различными аргументами.Вместо этого новый код должен быть:

connect(mySpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), mySlider, &QSlider::setValue); 

Некоторые макрос может помочь (с c11 или TYPEOF расширений) Лучше всего, вероятно, рекомендовать, чтобы не перегрузить сигналы и слоты ...

... но у нас есть добавлял перегрузки в прошлых незначительных выпусках Qt, потому что использование адреса функции не было подходящим вариантом, который мы поддерживаем. Но теперь это было бы невозможно без нарушения совместимости источника.

+0

Я надеялся, что компилятор выберет правильный экземпляр уведомления для меня, поэтому я перегрузил его. – SPlatten

+0

@SPlatten Будет вызвана правильная перегрузка, но вы должны явно подключить каждую перегрузку. –

+0

Пытается, но не получает ничего дальше, он компилируется, но сигналы не попадают в слоты. – SPlatten

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