1

一个迷你示例文件main.cpp

#include <iostream>
#include <QCoreApplication>

class MyApp : public QCoreApplication
{
private:
    int m_idtimer;

public:
    MyApp(int nargs, char* argc[]) : QCoreApplication(nargs, argc)
    {
        m_idtimer = startTimer(3000); // 3 segs.
    }

protected:
    void timerEvent(QTimerEvent* e)
    {
        char c = '\0';

        std::cout << "timerEvent" << std::endl;
        std::cin >> c;

        if (c == 'q') {
            killTimer(m_idtimer);
            quit();
        }
    }
};

int main(int nargs, char* argc[])
{
    MyApp app(nargs, argc);

    return app.exec();
}

额外的迷你Makefile

LDFLAGS = -I/usr/include/qt4 -I/usr/include/qt4/QtCore
LDLIBS = -lQtCore

编译和执行:

$ make main
g++   -I/usr/include/qt4/QtCore  main.cpp  -lQtCore -o main
$ ./main
timerEvent
1
timerEvent
2
timerEvent
3
timerEvent
q
$

好的,然后,我的问题。我制作这个示例的目的是测试计时器事件是否是累积的。

当我执行main程序时,接下来会发生:

  • 第一timerEvent条消息在 3 秒后显示,并timerEvent()等待一个字符。
  • 我立即按下1
  • 3 秒后,出现第二timerEvent条消息(如预期的那样)。
  • 我等了几秒钟(15 或更多)然后按2
  • 第三条消息立即显示(累积一个计时器事件)。
  • 我立即按下3
  • 3 秒后,第四条消息出现(不再累积计时器事件)。
  • 我按下q,程序结束。

问题:为什么没有更多的计时器事件累积?这种行为是否取决于平台?

PD:我的 Qt 版本是 4.8,我的 SO Ubuntu 是 13.04,我的内核 (linux) 是 3.8.0-19-generic。运行的图形系统是 Gnome 3。

4

1 回答 1

1

您的 15 秒等待不会累积计时器事件,因为您的timerEvent代码会阻塞等待输入。在您输入输入之前,Qt 无法返回其事件循环。当它返回事件循环时,它会检查经过的时间并注意到已经过去了超过 3 秒,因此它会触发一个计时器事件。十五秒过去的事实是无关紧要的。

这是预期的行为,不会(不应该)依赖于平台。

于 2013-06-13T00:10:45.453 回答