zl程序教程

您现在的位置是:首页 >  前端

当前栏目

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;
}