zoukankan      html  css  js  c++  java
  • 【Qt】无边框窗体中带有ActiveX组件时的一个BUG

    无意中发现的一个BUG,Qt5.1.1正式版
    首先创建一个GUI工程,拖入一个QAxWidget控件(为了使ActiveX生效,需要在.pro文件中加入CONFIG += qaxcontainer)
    接着,为了让ActiveX有效,需要引入一个组件,我这里引入的是IE组件
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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
     
     在CODE上查看代码片派生到我的代码片
    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

  • 相关阅读:
    OpenStack源码系列---neutron-server
    理解全虚拟、半虚拟以及硬件辅助的虚拟化
    QEMU+GDB调试方法
    SQL Server故障转移集群
    OpenStack源码系列---nova-conductor
    mysql 安装和基本使用
    数据库原理
    linux 计划任务
    linux 进程管理和内存分配

  • 原文地址:https://www.cnblogs.com/findumars/p/6375565.html
Copyright © 2011-2022 走看看