2011-10-03 20 views
1

我在基于QML的UI上工作,其中一些元素在C++插件中实现。 在WinXP 32bit和Win7 32bit中一切正常。上周我得到了新的带有Win7 64位的笔记本电脑,并且我的代码在那里无法正常工作。启动应用程序几秒钟后表现很好,但突然停止重新绘制。 QML启动的事件和对QDeclarativeItem :: update()的插件调用都不起作用。在插件中,我100%肯定update()被调用,但是我知道,调用重写QGraphicsItem :: paint()不会按预期发生。当窗口变焦/失焦时,视图只会被重新绘制。没有在64位Win7中重绘QML视图(忽略QDeclarativeItem中的update())

我已经快速验证我的应用程序在运行Win7的桌面上,并没有问题。这导致我怀疑Windows 7如何请求我的笔记本电脑和其他计算机上的窗口更新有一些不同,但是我现在无法找出差异。

有人能帮我理解那里发生了什么吗?

在此先感谢!

p.s.不幸的是,我的原始模型没有出现同样的问题,我不能共享生产代码。如果在找到实际解决方案之前,我会找到一种在原型中重现此问题的方法,我会发布它。

+0

如果您的模型不能重现问题,则表明基本思路是确定的,并且确实存在其他问题。您是否可以对生产代码进行更多的修剪/删除操作,仅用于您自己的测试目的,试图缩小导致问题发生的区域? –

+0

好的,经过一段时间的休息后,我又回到了这个项目,问题依然存在。 我认为会发生的是,Qt的内部循环负责图形场景更新在某些时候被破坏,并在Windows上为外部请求(如WM_SETFOCUS和WM_KILLFOCUS)提供外部请求时退出以响应内部的update()请求。我真的需要Trolls的意见,因为调试QGraphicsScene的想法让我感到担忧:)问题不容易再现 - 有时需要数小时才能开始。 –

回答

0

更新()调用后添加qapp-> processEvents(),它可能会工作。
(我遇到类似的问题,但它发生在所有平台上,希望这个解决方案会为你工作)

+0

谢谢你的想法。不幸的是,它不会影响Qt的行为。 –

0

的回答我的问题奠定了的东西我在问题描述最初忽视。 QDeclarativeItem :: update()函数是从非Qt线程(当然不是GUI线程)调用的。 我通过Qt事件循环重新路由了呼叫,问题消失了。

我当时在Qt 4.7/4.8上,不能说它在Qt 5.x中的表现如何。