Qt画家外面的油漆事件 - 不可能 - 解决方法?

时间:2011-01-20 01:13:47

标签: c++ windows qt4

所以看来Qt4不允许你在绘画事件之外的窗口上画画。我有很多代码希望能够绘制橡皮筋线(特定的专有界面的通用绘图代码,然后我在给定的UI中实现)。我已经阅读了pixmap方法,这将是很多工作,我认为这不是我想要的。

是否有一种解决方法可以让我做我想做的事情?我只需要在屏幕上绘制XOR波段。

尝试了WA_PaintOutsidePaintEvent标志。然后我看到它说它在Windows上不起作用。

3 个答案:

答案 0 :(得分:3)

在现代合成桌面中,窗口绘制需要由窗口管理器同步,以便可以按顺序将alpha混合和其他效果应用于正确的后台缓冲区 - 然后将其结果翻转到屏幕上以允许无泪窗口动画。

在这个过程的带外调用绘制操作 - 虽然由于基础平台上的遗留原因而受到支持 - 会破坏此过程并导致执行许多非最佳的代码路径。

基本上,当您在窗口上进行绘画时:调用invalidate函数以尽快安排绘画,并在绘画事件期间绘画。

答案 1 :(得分:1)

好像你可以访问相关窗口的Hwnd,你可以在那个表面上绘画。否则,我不确定。如果用pixmap方法你的意思是这样的话,我不认为这是一个糟糕的解决方案:

m_composed_image = QImage(size, QImage::Format_ARGB32);
m_composed_image.setDotsPerMeterX(dpm);
m_composed_image.setDotsPerMeterY(dpm);
m_composed_image.fill(Qt::transparent);

//paint all image data onto new image
QPainter painter(&m_composed_image);
painter.drawImage(QPoint(0, 0), m_alignment_image); 

答案 2 :(得分:1)

只需绘制到QPixmap,然后将其复制到paintEvent中的真实小部件。这是唯一的标准方式。你不应该试图解决它。