Po 18 miesiącach ... zacząłem od komentarzy pod odpowiedzią @ Mata i szybko kończyło się miejsce. Tak więc odpowiedź.
IMO emit
nie jest ani cukrem syntaktycznym, ani prostym słowem kluczowym w tym sensie
- Generuje kod (jak wyjaśniono powyżej @Mat),
- Pomaga
connect
mechanizmowi rozpoznać, że rzeczywiście jest to element signal
a
- Dzięki temu sygnał staje się częścią „większego” systemu, w którym sygnały i odpowiedzi (szczeliny) mogą być wykonywane synchronicznie lub asynchronicznie lub w kolejce, w zależności od tego, gdzie i jak został wyemitowany. Jest to niezwykle przydatna cecha systemu sygnał / szczelina.
Cały system sygnału / szczelin to inny idiom niż proste wywołanie funkcji. Uważam, że wynika to ze wzoru obserwatora. Istnieje również zasadnicza różnica między a signal
i a slot
: sygnał nie musi być implementowany, podczas gdy gniazdo musi być !
Idziesz ulicą i widzisz płonący dom (sygnał). Wybierasz numer 911 ( podłącz sygnał pożaru do gniazda odpowiedzi 911 ). Sygnał był tylko emitowany , natomiast szczelina została zrealizowana przez straż pożarną. Może być nieprecyzyjne, ale masz pomysł. Spójrzmy na przykład OP.
Jakiś obiekt zaplecza wie, jaki postęp został osiągnięty. Więc może po prostu emit progressNotification(...)
sygnalizować. Do klasy, która wyświetla rzeczywisty pasek postępu, należy odebranie tego sygnału i wykonanie na nim. Ale w jaki sposób widok łączy się z tym sygnałem? Witamy w systemie sygnałów / gniazd Qt. Można teraz wyobrazić sobie klasę menedżera (zwykle pewnego rodzaju widget), która składa się z obiektu widoku i obiektu obliczeniowego danych (oba są QObjects
), które może wykonać connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)
.
Nie wchodźmy w aspekty projektowe klasy menedżera, ale wystarczy powiedzieć, że tutaj świeci system sygnału / gniazda. Mogę skupić się na zaprojektowaniu bardzo czystej architektury dla mojej aplikacji. Nie zawsze, ale często okazuje się, że po prostu emituję sygnały, ale wdrażam sloty .
Jeśli możliwe jest użycie / wywołanie metody sygnału bez jej emitowania , oznacza to , że w pierwszej kolejności nigdy nie potrzebowałeś tej funkcji jako sygnału .
emit
nie jest potrzebne. To jednak dziwne, że nauczyłeś się o tymemit
długo po bezpośrednim wywołaniu sygnałów, ponieważ system slotów sygnałowych jest jedną z pierwszych rzeczy, których można się nauczyć o Qt.