Qt无边框窗体中带有ActiveX组件时的一个BUG

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt无边框窗体中带有ActiveX组件时的一个BUG相关的知识,希望对你有一定的参考价值。

无意中发现的一个BUG,Qt5.1.1正式版
首先创建一个GUI工程,拖入一个QAxWidget控件(为了使ActiveX生效,需要在.pro文件中加入CONFIG += qaxcontainer)
接着,为了让ActiveX有效,需要引入一个组件,我这里引入的是IE组件
[cpp] view plain copy
 
 技术分享技术分享
  1. MainWindow::MainWindow(QWidget *parent) :  
  2.     QMainWindow(parent),  
  3.     ui(new Ui::MainWindow)  
  4. {  
  5.     ui->setupUi(this);  
  6.     ui->axWidget->setControl("{8856f961-340a-11d0-a96b-00c04fd705a2}");  
  7. }  

 

然后就可以开始测试了,生成EXE,运行,此时窗口正常

 

技术分享

 

鼠标单击任务栏窗口,此时窗口会最小化,再次单击恢复,变成这样

 

技术分享

 

很明显,窗口在重新显示时没有收到绘制消息,只有ActiveX的部分显示正常了
经过了一个下午的调试,发现窗口在收到WM_ACTIVATE消息之后并没有收到WM_PAINT消息
而正常情况下应该是这个顺序:WM_ACTIVATE > WM_PAINT
引入了ActiveX后WM_PAINT就没有了,这就是问题的起因!

知道问题的原因就好办了,只要强制窗口重绘就好了
为了处理Windows消息,覆盖了父类的nativeEvent方法

 

[cpp] view plain copy
 
 技术分享技术分享
  1. bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)  
  2. {  
  3.     PMSG msg = (PMSG)message;  
  4.     if (msg->message == WM_ACTIVATE && msg->wParam == WA_ACTIVE)  
  5.     {  
  6.         // 窗口被激活了,强制重绘  
  7.         InvalidateRect((HWND)this->winId(), nullptr, FALSE);  
  8.     }  
  9.     return false;  
  10. }  

 

解决的是这个BUG:

https://bugreports.qt.io/browse/QTBUG-17548

 

http://blog.csdn.net/aqtata/article/details/17038105

以上是关于Qt无边框窗体中带有ActiveX组件时的一个BUG的主要内容,如果未能解决你的问题,请参考以下文章

Qt无边框窗体-最大化时支持拖拽还原

Qt开源作品18-无边框背景透明窗体

Qt开源作品18-无边框背景透明窗体

Qt:移动无边框窗体(使用Windows的SendMessage)

Qt 无边框窗体改变大小 完美实现(全部自己实现)

Qt开源作品16-通用无边框拖动拉伸