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

无意中发现的一个BUG,Qt5.1.1正式版
首先创建一个GUI工程,拖入一个QAxWidget控件(为了使ActiveX生效,需要在.pro文件中加入CONFIG += qaxcontainer)
接着,为了让ActiveX有效,需要引入一个组件,我这里引入的是IE组件

 

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);

ui->axWidget->setControl("{8856f961-340a-11d0-a96b-00c04fd705a2}");

}

 

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

 

 

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

 

 

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

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

 

 

bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)

{

PMSG msg = (PMSG)message;

if (msg->message == WM_ACTIVATE && msg->wParam == WA_ACTIVE)

{

// 窗口被激活了,强制重绘

InvalidateRect((HWND)this->winId(), nullptr, FALSE);

}

return false;

}

 

解决的是这个BUG:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值