2016-06-21 15 views
3

Ich verwende Qt5 (C++ 11 aktiviert) auf Windows7.
In meiner app habe ich so etwas wie dieses:Qt C++ 11 Lambda: Ist diese Verbindung (Signal-Slot) korrekt?

connect(ui->alarm, &QCheckBox::stateChanged, [this]{ 
    (ui->alarm->isChecked()) ? m_timer.start() : m_timer.stop(); 
}); 

wo alarmQCheckBox und m_timer ist ein QTimer.

Ich möchte den Timer im laufenden Betrieb starten/stoppen, abhängig vom Status der Alarm-Checkbox.

Ich habe getestet, es scheint zu funktionieren, aber ich bin mir nicht sicher, ob es 100% ok ist ... oder wenn es ein besseres Lambda gibt, es zu tun?

Antwort

5
connect(ui->alarm, &QCheckBox::stateChanged, [this](int state){ 
    state ? m_timer.start() : m_timer.stop(); 
}); 

Auf diese Weise brauchen Sie nicht zu ui->alarm verweisen.

In QCheckBox::stateChanged(int state), die state wirklich ein

Enum Qt :: Checkstate

Qt :: Ungeprüfter = 0 Der Artikel ist nicht markiert.

Qt :: Teilweise geprüft = 1 Der Artikel ist teilweise geprüft. Elemente in hierarchischen Modellen können teilweise überprüft werden, wenn einige, aber nicht alle ihrer untergeordneten Elemente überprüft werden.

Qt :: Geprüft = 2 Der Artikel ist geprüft.

+0

Großartig! Ich werde es morgen testen, aber ich denke, es wird gut funktionieren :) –

+0

Der richtige Test wäre: 'if (state == Qt :: Deaktiviert) m_timer.stop(); sonst if (state == Qt :: Checked) m_timer.start(); '. Sie sollten den Zustand "PartiallyChecked" ignorieren! –

+2

Noch eine Sache: Sie können das Signal toggled (bool checked) anstelle von stateChanged (int state) verwenden – user3302274

Verwandte Themen