2016-06-05 16 views
2

Ich habe einige Code, der etwa wie folgt aussieht:Wie kann ich QT5() auf einem Steckplatz mit Standardparametern verbinden

class MyClass : public QObject 
{ 
    Q_OBJECT 

signals: 
    void SetValue(float value); 

public slots: 
    void OnSetValue(float value, bool fromDatabase = false); 
} 

connect(this, SIGNAL(SetValue(float)), this, SLOT(OnSetValue(float))); 

Dies funktioniert gut, aber ich möchte Vorteil Qt5's new signal/slot syntax nehmen (und entfernen Sie die Makros). Wenn ich ändern Sie die connect() dazu:

connect(this, &MyClass::SetValue, this, &MyClass::OnSetValue); 

ich (in Visual Studio 2013):

Fehler C2338: Der Steckplatz mehr Argumente erfordert als das Signal

bietet Ich könnte eine intermediäre Funktion erstellen, die OnSetValue() aufruft und erlaubt, dass die Standardparameter gesetzt werden, aber das scheint eine Verschwendung von Code zu sein. Was ist eine bessere Lösung?

+1

Nach Qt Wiki ist es nicht möglich mit Member Funktionszeiger: https://wiki.qt.io/New_Signal_Slot_Syntax#cons. – sim642

+2

'connect (this, & MyClass :: SetValue, [this] (Gleitkommawert) {OnSetValue (value);});' –

Antwort

2

Die link, die sim642 zur Verfügung gestellt auch angegeben, dass die neue Verbindungssyntax "mit c + 11 Lambda-Ausdrücke verwendet werden kann". Für das obige Beispiel war ich verwenden können:

connect(this, &MyClass::SetValue, [=](float value) { OnSetValue(value); }); 

, die etwas komplizierter ist, aber weniger Code als eine vermittelnde Funktion Hinzufügen und tut bieten noch Zeit kompilieren zu überprüfen.

Igor Tandetnik vorgesehen, um eine bessere Version oben:

connect(this, &MyClass::SetValue, [this](float value){ OnSetValue(value); }); 

Dies ersetzt [=] (die Lambda ermöglicht wert alle automatischen Variablen in ihrem Umfang zu erfassen) mit [diese], den Umfang der Lambda-Reduzierung und die Möglichkeit eines Fehlers.

Verwandte Themen