wo sagt das Qt doc das?
Nirgendwo, weil es für den Benutzer von QTimer
keine Rolle spielen sollte. Das Timer-Ereignis ist ein Implementierungsdetail. Es wird an das Timer-Objekt selbst geliefert, so dass Sie wirklich aus dem Weg gehen müssen, um es abzufangen. Hier ist, wie QTimer
Werke:
class QTimer : public QObject {
Q_TIMER
QBasicTimer m_timer;
protected:
void timerEvent(QTimerEvent * ev) override {
if (ev->timerId() == m_timer.timerId())
emit timeout();
}
/*...*/
};
Wenn man darüber nachdenkt, gibt es keine Möglichkeit, irgendwelche Signale zu emittieren, ohne den Code ausgeführt wird, der die Signale aussendet, und der einzige Weg, sicher einen solchen Code auszuführen, um Code Dinge asynchron ist aussendet für "run-to-completion" -Brocken, die bei jeder Gelegenheit die Kontrolle an die Ereignisschleife abgeben. Die Ereignisschleife wird von der Plattform benachrichtigt, dass ein Zeitgeber abgelaufen ist, und gibt dann ein Signal aus. Sie würden in große Schwierigkeiten geraten, wenn Qt Signale wie Timer-Timeouts von aufdringlichen asynchronen Rückrufen wie Unix-Signalen ausgibt: Lesen Sie nur, wie wenige Dinge Sie in einem Signal-Handler tun können - es wäre nichts anderes als ein Interrupt-Handler.
Siehe: http://doc.qt.io/qt-5/qtimerevent.html – MrEricSir
'QTimer' und' QTimerEvent' sind zwei verschiedene Möglichkeiten, Timer in Qt zu verwenden. Weitere Informationen finden Sie in der [Qt doc] (http://doc.qt.io/qt-5/qtimer.html#alternatives-to-qtimer). 'QTimer' verwendet Signal/Slot-Kommunikation, während' QTimerEvent' (erstellt von 'QObject :: startTimer' und behandelt von' QObject :: timerEvent() 'oder und Ereignisfilter) sind Ereignisse. Beide erfordern jedoch eine Ereignisschleife im aktuellen Thread. – cbuchart