Qt打开外部程序和文件夹需要注意的细节(注意QProcess的空格问题,以及打开本地文件时,需要QUrl::fromLocalFile才可以)

示例代码

QProcess *process = new QProcess(this);
    QFileInfo fileinfo(appUrl);
 
    QString appPath = QApplication::applicationDirPath()+SAVEDIR+"/"+fileinfo.fileName();
    bool res = process->startDetached(appPath,QStringList());
    if (res)
    {
        accept();
    }
    else
    {
        MyHelper::ShowMessageBoxError("下载完成但自动升级失败,请手工安装升级包!");
        QDesktopServices::openUrl(QUrl::fromLocalFile(QApplication::applicationDirPath()+SAVEDIR));
        reject();
    }
  • 细节1:

           原本代码中是这样写的:
      process->startDetached(appPath);
         测试环境没任何问题,但是生产环境却不能调用外部程序,最终发现生产环境的文件路径在C:\Program Files (x86)\...带有空格,造成调用失败,于是google之后尝试
     process->startDetached(appPath,QStringList());
    问题得到解决。

  • 细节2:

   QDesktopServices::openUrl(QUrl(QApplication::applicationDirPath()+SAVEDIR));
        这地方同样存在这样的问题,如果使用QUrl::fromLocalFile进行处理,就可以正常打开文件夹:
    QDesktopServices::openUrl(QUrl::fromLocalFile(QApplication::applicationDirPath()+SAVEDIR));

      除此之外,还有一个和这段代码无关的问题:Qt调用VC写的动态库,VC需要用C的方式输出函数,否则MinGW32编译过程会报错,即:
    VC DLL头文件示例:

#ifndef CDOUBLEREADERDLL  
#ifdef CDOUBLEREADERDLL_EXPORTS
#define CDOUBLEREADERDLL extern "C" __declspec(dllexport)
#else
#define CDOUBLEREADERDLL extern "C" __declspec(dllimport)
#endif
#endif
  
# define BUFFERSIZE 20
# define READTIMEOUT 1000
// 打开串口
CDOUBLEREADERDLL bool _stdcall  RD_Open(int iPort,unsigned long iBaudRate);
...

Qt中调用示例:

extern "C"
{
    #include "drivers/CdoubleReaderDll.h"
}

猜你喜欢

转载自blog.csdn.net/lengyuezuixue/article/details/81209679
今日推荐