我考虑过为回调提供额外的参数,但这看起来太复杂了(创建自己的修改后的 QTimer 对象等)
读完 QTimer docs 后我想到的另一件事正在保存 timerID 并检查它,但由于回调中没有任何内容,我不知道要检查什么:/
如果有人对特殊用例感兴趣: https://github.com/Bluscream/pyTSon_plugins/blob/master/scripts/antiAFK/init.py#L35
最佳答案
我可以想到至少两种您可以采用的方法:
首先,您可以通过在插槽中转换发送者来检索指向 QTimer
的指针:
class MyClass : public QObject
{
Q_OBJECT
public:
MyClass(QObject * parent = 0);
<...>
private Q_SLOTS:
void onTimerFired();
private:
void doSomethingAndStartTimer();
private:
int m_firstTimerId;
int m_secondTimerId;
};
void MyClass::doSomethingAndStartTimer()
{
<...>
QTimer *timer = new QTimer(this);
m_firstTimerId = timer->timerId();
connect(timer, SIGNAL(timeout()), this, SLOT(onTimerFired()));
timer->start();
<..>
}
void MyClass::onTimerFired()
{
QTimer * timer = qobject_cast<QTimer*>(sender());
if (timer) {
if (timer->timerId() == m_firstTimerId) {
<...> // Process it somehow
}
else if (timer->timerId() == m_secondTimerId) {
<...> // Process it some other way
}
}
}
其次,您可以放弃显式的 QTimer
用法,而是使用 startTimer以及重新实现类的 timerEvent
方法,该方法接收 QTimerEvent
,您可以从中获取计时器 ID
class MyClass : public QObject
{
Q_OBJECT
public:
MyClass(QObject * parent = 0);
<...>
private:
virtual void timerEvent(QTimerEvent * event);
private:
void doSomethingAndStartTimer();
private:
int m_firstTimerId;
int m_secondTimerId;
};
void MyClass::doSomethingAndStartTimer()
{
<...>
int interval = 100; // 100 msec
m_firstTimerId = startTimer(interval);
<...>
}
void MyClass::timerEvent(QTimerEvent * event)
{
if (event->timerId() == m_firstTimerId) {
<...> // process it somehow
}
else if (event->timerId() == m_secondTimerId) {
<...> // process it some other way
}
}
第二种方法在 documentation 中提到对于 QTimer
:
Alternatives to QTimer
An alternative to using QTimer is to call QObject::startTimer() for your object and reimplement the QObject::timerEvent() event handler in your class (which must inherit QObject). The disadvantage is that timerEvent() does not support such high-level features as single-shot timers or signals.
关于c++ - 有什么方法可以识别调用了哪个 QTimer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48924190/