Но как долго он будет уникальным?
Идентификатор таймера должен оставаться уникальным до тех пор, пока он не будет выпущен через QAbstractEventDispatcherPrivate :: releaseTimerId();
Другими словами, вызов killTimer().
Повторное использование идентификаторов в какой-то момент?
Я быстро написал простой тест, чтобы увидеть, если таймер ID будет получить повторно:
something.h:
#include <QCoreApplication>
#include <QtCore>
#include <QtGlobal>
class Something : public QObject
{
Q_OBJECT
public:
Something() : QObject() {}
~Something() {}
};
main.cpp:
#include "Something.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Something thing;
int i = thing.startTimer(1000);
qDebug() << i;
thing.killTimer(i);
i = thing.startTimer(1000);
qDebug() << i;
return a.exec();
}
Результат :
1
1
Наконец, используя QTimer исключительно ... Вы можете проверить с:
class Something : public QObject
{
Q_OBJECT
public:
Something() : QObject(), timer(NULL) {}
~Something() {}
void runme()
{
timer = new QTimer();
// Old school ;)
QObject::connect(timer, SIGNAL(timeout()), this, SLOT(timerEvent()));
timer->start(100);
}
public Q_SLOTS:
void timerEvent()
{
qDebug() << timer->timerId();
timer->stop();
delete timer;
timer = new QTimer();
QObject::connect(timer, SIGNAL(timeout()), this, SLOT(timerEvent()));
timer->start(1000);
}
public:
QTimer* timer;
};
Тогда просто пнуть его и запустить его:
Something thing;
thing.runme();
Я был в состоянии проследить весь путь вплоть до QAbstractEventDispatcher. cpp/.h под src/qtbase/src/corelib/kernel для Qt 5.2. В верхней части этого файла задаются параметры, а затем вы можете заглянуть в QAbstractEventDispatcherPrivate :: allocateTimerId(). – Huy
Согласно [документации] (http://qt-project.org/doc/qt-4.8/qtimer.html#alternatives-to-qtimer) существует возможность создания количества таймеров, равных числу таймеров, которые может обеспечить операционная система. –