【Qt】无边框窗体中带有ActiveX组件时的一个BUG
来源:互联网 发布:mac xdebug 安装 编辑:程序博客网 时间:2024/05/02 01:58
无意中发现的一个BUG,Qt5.1.1正式版
首先创建一个GUI工程,拖入一个QAxWidget控件(为了使ActiveX生效,需要在.pro文件中加入CONFIG += qaxcontainer)
接着,为了让ActiveX有效,需要引入一个组件,我这里引入的是IE组件
首先创建一个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
- 【Qt】无边框窗体中带有ActiveX组件时的一个BUG
- Qt中实现无边框的窗体
- qt 移动无边框的窗体
- Qt实现无边框窗体的移动
- Qt:移动无边框窗体
- Qt - 移动无边框窗体
- Qt移动无边框窗体
- Qt 设置窗体无边框
- Qt:移动无边框窗体
- wpf中无边框窗体的问题
- Qt中设置QML窗体无边框和背景透明
- QT 无边框窗体最大化 遮挡windows任务栏的问题
- Qt 无边框、透明、可移动的个性窗体
- Qt 无边框、透明、可移动的个性窗体
- Qt控制无边框窗体的拖动与缩放
- QT实现无边框的可移动窗体
- Qt控制无边框窗体的拖动与缩放
- Qt 无边框、透明、可移动、的个性窗体
- 玻璃钢罐的属性
- 私有继承成员公有化
- opencv写入视频帧(四)
- Web Services--gSOAP 2.7.6 第一章(1.2)
- SpringMVC框架中的异常解析器-ExceptionHandler和HandlerExceptionResolver
- 【Qt】无边框窗体中带有ActiveX组件时的一个BUG
- google protobuf有用的类
- 华硕笔记本电脑下载了一个银行插件后键盘失灵了不能用(解决方案之一)
- 实例:在Android调用WCF服务
- Codeforces Round #216 (Div. 2) A.B
- Nutch1.7学习笔记2:基本工作流程分析
- ExtJs-Panel解读
- Perl专题之函数(二)函数参数与返回值
- 第十四周项目7-1-体验文件操作(热身)