Ist es in Ordnung, Signale zu verwenden, um Fehler zu melden?
Ja, aber ich würde im Allgemeinen diese Situation abhängig machen. Wenn der Fehler asynchron auftreten könnte, ist ein Signal, das dies anzeigt, definitiv richtig. Wenn der Fehler nur auftritt, wenn Client-Code eine bestimmte Funktion aufruft, sollte der Fehler in der Antwort von dieser Funktion sein, nicht als ein Signal. Es gibt jedoch eine Vielzahl von Situationen dazwischen, die von Fall zu Fall durchgeführt werden können.
Signal-Slot-Mechanismen können auch die Cross-Thread-Kommunikation erleichtern (was möglicherweise als asynchroner Fall betrachtet wird), und ich werde sie für diesen Zweck verwenden (Fehler oder Nein).
Ist es in Ordnung anzunehmen, dass ein Signal verarbeitet wird?
Signale sind (philosophisch) entworfen, um anzuzeigen, dass etwas passiert ist. Wie andere gezeigt haben, ist es nie eine gute Idee, anzunehmen, dass ein Signal mit einem Slot oder sogar nur mit einem anderen Slot übereinstimmt.
Können Signale zum Einleiten von Aktionen verwendet werden? Z.B. signal displayInfoScreen() muss von einem Slot bedient werden, der einen Info-Bildschirm anzeigt.
Signale können zum Einleiten von Aktionen verwendet werden, aber wahrscheinlich nicht in der Art, wie Sie denken. Das Signal zeigt an, dass foo passiert ist. Wenn der Code, der Ihre Klasse überwacht, entscheidet, dass wenn foo passiert, sollte ein Dialog angezeigt werden, dann wurde das Signal verwendet, um diese Aktion zu initiieren. Es liegt jedoch in der Regel nicht in der Verantwortung der Klasse, die das Signal aussendet, um sicherzustellen, dass die richtige Aktion stattfindet, da sie nicht dafür verantwortlich ist. (Wenn ja, dann sollte es Teil der gleichen Klasse sein, und kein Signal erforderlich wäre.)
Akzeptiert als diese Antwort lieferte einfache Beispiele für die Verwendung in Qt. Denkst du Fehler sind in Ordnung, aber nur wenn die Verarbeitung asynchron ist? – larsmoa
Danke! Und, ja, ansonsten fügen Sie entweder einen Status-Rückgabewert oder ein Status-Argument hinzu (wie QString :: toInt). – e8johan