调用update或者repaint后没有paintEvent事件产生

xiaohuh421 2019-06-03 10:34:24
我是在win7上,IE11中, 使用QT开发的ActiveX插件.

然后发现在QT窗口设置为全屏
setWindowFlags(Qt::Dialog| Qt::WindowSystemMenuHint | Qt::WindowStaysOnTopHint);
__super::showFullScreen();

然后, 我在鼠标移动事件(MouseMove)中调用update或者repaint, 都不能触发paintEvent. (已经打印log跟踪,确定调用了update或者repaint)

但是鼠标 左键点击事件中调用update/repaint都可以正常触发paintEvent.

求问: 
什么情况下,可能导致update/repaint不触发paintEvent事件?
或者 还有没有其它办法触发paintEvent, 比如能不能手动向事件队列投递一个paintEvent事件.
...全文
3756 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mythSaber 2020-05-18
  • 打赏
  • 举报
回复
楼主,我也遇到了类似的问题。将一个组件设置为dialog模式, 然后调用showFullScreen全屏,之后,其子组件调update就无效了,不能触发相应的paintEvent。有什么好的解决方法吗
xiaohuh421 2019-07-04
  • 打赏
  • 举报
回复 1
结了, 估计是qt的bug. 目前在某个情况下, 只能使用hide/show来触发paintEvent, 不能用hide/show的地方 , 就用resize来触发paintEvent
xiaohuh421 2019-06-25
  • 打赏
  • 举报
回复
引用 7 楼 csdnwingwu 的回复:
会不会是paintEvent事件 被 eventFilter 过滤了?
并没有配置eventFilter
引用 8 楼 翅膀又硬了 的回复:
如果都是界面线程,弄个接口,直接调用 paintEvent
这个函数不能直接调用, 会报错.
翅膀又硬了 2019-06-12
  • 打赏
  • 举报
回复
如果都是界面线程,弄个接口,直接调用 paintEvent
csdnwingwu 2019-06-12
  • 打赏
  • 举报
回复
会不会是paintEvent事件 被 eventFilter 过滤了?
xiaohuh421 2019-06-11
  • 打赏
  • 举报
回复
引用 5 楼 donwmufromdying 的回复:
挺奇怪啊。我测试了一下。我在下边代码中
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    qDebug("mouseMoveEvent[%d],pos is:x%d,y%d" , (int)event->type(), event->x(), event->y());
    this->update();
}
能够触发paintevent mouseMoveEvent[5],pos is:x217,y289 current event type:129 current event type:77 current event type:12 paintEvent[12] 不知道楼主为什么不能触发
正常是能够触发的, 我是用QT写的ActiveX插件, 然后为了全屏, 把QT窗口设置为dialog模式, 然后调用showFullScreen. 就会出这个问题
xiaohuh421 2019-06-10
  • 打赏
  • 举报
回复
引用 3 楼 hzh_Beyond 的回复:
你说的两中情况都不是. 并不是合并了, 而是一次都不会触发. 也没有在paintEvent中触发.
donwmufromdying 2019-06-10
  • 打赏
  • 举报
回复
挺奇怪啊。我测试了一下。我在下边代码中
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    qDebug("mouseMoveEvent[%d],pos is:x%d,y%d" , (int)event->type(), event->x(), event->y());
    this->update();
}
能够触发paintevent mouseMoveEvent[5],pos is:x217,y289 current event type:129 current event type:77 current event type:12 paintEvent[12] 不知道楼主为什么不能触发
浮一大白开水 2019-06-05
  • 打赏
  • 举报
回复
去看了一下帮助文档:protected] void QWidget::paintEvent(QPaintEvent *event)里边有介绍,可能有帮助。 会不会是因为mousemove触发太频繁被合并处理导致。 Qt also tries to speed up painting by merging multiple paint events into one. When update() is called several times or the window system sends several paint events, Qt merges these events into one event with a larger region (see QRegion::united()) 或者是 Note: Generally, you should refrain from calling update() or repaint() inside a paintEvent(). For example, calling update() or repaint() on children inside a paintEvent() results in undefined behavior; the child may or may not get a paint event. 之前没有使用过这种方式,个人猜测。
xiaohuh421 2019-06-05
  • 打赏
  • 举报
回复
引用 1 楼 RangersTank 的回复:
首先,查看下是否点用了update和repant函数。 其次,update仅仅是需要更新,但是窗口要不要更新qt会依据计算要不要调用pant函数。 按照这个思路看下问题出在哪里。
你没仔细看我说的. 已经打log确定是调用了update或者repaint了. 还是不能触发paintEvent. 目前是使用歪招触发paintEvent; 调用两次resize
RangersTank 2019-06-04
  • 打赏
  • 举报
回复
首先,查看下是否点用了update和repant函数。 其次,update仅仅是需要更新,但是窗口要不要更新qt会依据计算要不要调用pant函数。 按照这个思路看下问题出在哪里。

16,818

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧