我在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