Qt 5计时器中的repaint()不会立即触发paintEvent

时间:2016-08-07 01:34:22

标签: c++ qt timer

我在Qt 5.7.0的Windows 7上使用MinGW构建。 我已经创建并启动了一个定时器,它为我的小部件调用repaint()但是之后不会立即触发paintEvent(),尽管文档说明了这一点。这是一个错误(类似https://bugreports.qt.io/browse/QTBUG-4453)还是我的错误?有没有其他方法我可以强制重新绘制小部件,因为我只能在paintEvent()方法内绘制,我需要绘制一些图片等。从它到tick()连接槽的定时器调试输出比paintEvent()的调试输出。当我将焦点更改为另一个窗口并返回时,绘制的内容始终是最新的。

我的计时器构造:

connect(this->m_paintTimer, SIGNAL(timeout()), this, SLOT(updatePaint()));

...

void RoomWidget::updatePaint()
{
        qDebug() << "Repaint";
        this->repaint();
        qDebug() << "Debug: Repaint end";
}

...

void RoomWidget::paintEvent(QPaintEvent *event)
{
    QWidget::paintEvent(event);
    qDebug() << "Paint event";

    QPainter painter;
    painter.begin(this);
    ...
    qDebug() << "Paint event end";
}

...

m_paintTimer->start(ROOM_REPAINT_INTERVAL_MS);

...

const int ROOM_REPAINT_INTERVAL_MS = 200;

具有讽刺意味的是,这在Fedora上完全有效。

编辑: 我的主窗口默认使用全屏模式。当不使用全屏模式时,它似乎工作和打印:

Debug: Repaint
Debug: Paint event
Debug: Paint event end
Debug: Repaint end
Debug: Repaint
Debug: Paint event
Debug: Paint event end
Debug: Repaint end
Debug: Repaint
Debug: Paint event
Debug: Paint event end
Debug: Repaint end
Debug: Repaint
Debug: Paint event
Debug: Paint event end
Debug: Repaint end

0 个答案:

没有答案