C++ 有没有办法确定调用了哪个QTimer?
我曾考虑过为回调提供额外的参数,但这看起来太复杂了(创建一个自己修改过的QTimer对象,等等) 阅读后,我想到的另一件事是保存timerID并检查它,但由于回调中没有任何内容,我不知道要检查什么:/ 如果有人对特殊用例感兴趣:C++ 有没有办法确定调用了哪个QTimer?,c++,qt,C++,Qt,我曾考虑过为回调提供额外的参数,但这看起来太复杂了(创建一个自己修改过的QTimer对象,等等) 阅读后,我想到的另一件事是保存timerID并检查它,但由于回调中没有任何内容,我不知道要检查什么:/ 如果有人对特殊用例感兴趣: 我至少可以想到两种方法: 首先,您可以通过在插槽中强制转换发送方来检索指向QTimer的指针: class MyClass : public QObject { Q_OBJECT public: MyClass(QObject * parent = 0)
我至少可以想到两种方法: 首先,您可以通过在插槽中强制转换发送方来检索指向
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
}
}
}
第二种方法在forQTimer
中提到:
QTimer的替代品
使用QTimer的另一种方法是为对象调用QObject::startTimer(),并在类中重新实现QObject::timerEvent()事件处理程序(必须继承QObject)。缺点是timerEvent()不支持单次触发计时器或信号等高级功能
那么QObject::sender()呢?这是一个很好的答案,现在我只需要想办法将其转换为Python Qt,谢谢!
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
}
}