The QML painting rate is calculated by first creating a \l{QObject}-derived class called PaintEventMonitor, which allows its client to provide a \l{QWidget} to be monitored, and which emits a signal when that widget is repainted: \quotefromfile video/snippets/painteventmonitor/painteventmonitor.h \skipto class PaintEventMonitor \printuntil targetChanged) \dots \skipto protected \printuntil signals: \skipto void targetPainted \printuntil ; \skipto private \printuntil }; The signal is generated by installing an event filter on the target \l{QWidget}: \quotefromfile video/snippets/painteventmonitor/painteventmonitor.cpp \skipto PaintEventMonitor::eventFilter \printuntil } A second class, FrequencyMonitor, is used to turn the stream of targetPainted() signals into an instantaneous and an averaged frequency: \quotefromfile video/snippets/frequencymonitor/frequencymonitor.h \skipto class FrequencyMonitor : public QObject \printuntil Q_OBJECT \skipto Q_PROPERTY(qreal instantaneousFrequency \printuntil averageFrequencyChanged) \skipto public \printuntil : \dots \skipto static void qmlRegisterType \printuntil ; \skipto public slots \printuntil notify(); \skipto }; \printline }; The FrequencyMonitor class is exposed to QML like this \quotefromfile video/snippets/frequencymonitor/frequencymonitordeclarative.cpp \skipto FrequencyMonitor::qmlRegisterType \printuntil } and its data is displayed by defining a QML item called FrequencyItem, like this: \quotefromfile video/snippets/frequencymonitor/qml/frequencymonitor/FrequencyItem.qml \skipto import FrequencyMonitor \printuntil id: root \dots \skipto function notify \printuntil id: monitor \skipto onAverageFrequencyChanged \printuntil { \skipto instantaneousFrequencyText \printuntil /^\}/ The result looks like this: \image video-qml-paint-rate.png