QFileDialog打开本地对话框无响应不弹出本地文件夹窗口
响应 本地 打开 窗口 文件夹 对话框
2023-09-14 09:07:36 时间
1.问题描述
今天遇到很奇怪的问题,QString strFile = QFileDialog::getOpenFileName(this, "选择Excel文件", m_defalutPath, tr("Exel file(*.xls *.xlsx)"));老是打不开系统保存文件的对话框,代码调试发现执行到这一句,就卡死了,阻塞,没有继续往下走;新建一个工程,可以打开,放到构造函数中,可以打开,最后一个参数设置为QFileDialog::DontUseNativeDialog可以打开QT的选择对话框,可就是放到成员函数中打不开;搞了一下午;
后来在一个英文网站找到了原因;https://stackoverflow.com/questions/31983412/code-freezes-on-trying-to-open-qdialog
因为程序当中,使用了CoInitializeEx函数,这个函数会以独占的方式使用COM端口发送消息,执行命令, QFileDialog::getOpenFileName函数也需要通过COM端口发送消息,造成死锁。
int TextToSpeech::Init() { //初始化COM组件 ::CoUninitialize(); if(FAILED(::CoInitializeEx(NULL,0))) { //MessageBox("初始化COM组件失败!", "提示", MB_OK|MB_ICONWARNING); return -1; } m_bComInit = TRUE; if (CreateSpVoice() == -1) { return -1; } //SetVolume(10); return 0; }
2.解决办法
将CoInitializeEx(NULL,0))改成CoInitializeEx(NULL,COINIT_APARTMENTTHREADED),COINIT_APARTMENTTHREADED意思是在分离的线程中初始化COM
int TextToSpeech::Init() { //初始化COM组件 ::CoUninitialize(); if(FAILED(::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED))) { //MessageBox("初始化COM组件失败!", "提示", MB_OK|MB_ICONWARNING); return -1; } m_bComInit = TRUE; if (CreateSpVoice() == -1) { return -1; } //SetVolume(10); return 0; }
相关文章
- 【应急能力提升4】实战应急响应经验
- 【说站】Nginx响应超时报错:upstream timed out (110: Connection timed out) 原因及解决方案
- vue webpack 前后端请求响应流程
- 百行代码实现 Vue 2 响应式
- Reactor响应式编程 之 简介
- 实测腾讯高精定位:赋能车道级导航 对驶入应急车道、车道级偏航等驾驶行为及时响应
- 低代码平台amis学习 三:发送网络请求并回显响应内容
- 响应式系统与React - 笔记
- 微信小程序点击picker没响应解决方法详解手机开发
- HttpClient携带请求JSON数据访问HTTP接口得到响应JSON数据详解编程语言
- 响应式网站开发Redis解决方案(响应式 redis)
- 深入理解C#实现快捷键(系统热键)响应的方法