使用Qt打开外部文件,调用外部程序(QDesktopServices,QUrl ,QProcess,QProcess)

本文详细介绍了如何在程序中自动查找本地文件并使用正确的程序打开它们,以及如何调用外部程序而不阻塞主线程。通过使用QDesktopServices、QUrl等Qt库函数,可以实现跨文件名编码的文件打开,并通过QProcess类灵活地启动外部应用。

1 自动查找本地文件对应的打开程序打开文件

        //打开pdf文件
        QDesktopServices ds;
        if (!ds.openUrl(QUrl::fromLocalFile(fileList.at(0))))
            showMessage(QStringLiteral("pdf程序不存在"));

QUrl::fromLocalFile用这个方法,因为文件名或路径中包含有中文或空格,不然打不开文件.

QUrl(fileName)只能打开英文名称和没有空格路径的文件

2 调用外部程序

1、使用QProcess::startDetached()方法,启动外部程序后立即返回;

2、使用QProcess::execute(),不过使用此方法时程序会最阻塞直到此方法执行的程序结束后返回,这时候可使用QProcess和QThread这两个类结合使用的方法来处理,以防止在主线程中调用而导致阻塞的情况










### 如何通过 QT 框架调用打开外部 .exe 文件 在 Qt 中,可以使用 `QDesktopServices` 或者 `QProcess` 来实现对外部 `.exe` 文件的调用打开操作。 #### 使用 QDesktopServices::openUrl() 如果目标 `.exe` 文件可以通过操作系统默认的应用程序直接运行,则可以选择使用 `QDesktopServices::openUrl()` 函数。以下是具体代码示例: ```cpp #include <QCoreApplication> #include <QDesktopServices> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 定义要调用外部 exe 文件路径 QString program = "path/to/your/external/exe"; // 调用 openUrl() 方法并传入本地文件 URL QDesktopServices::openUrl(QUrl::fromLocalFile(program)); return a.exec(); } ``` 上述方法适用于简单的场景,其中不需要向外部应用程序传递参数或者捕获其返回值[^1]。 --- #### 使用 QProcess 类 对于更复杂的交互需求(例如需要传递命令行参数、读取标准输出等),推荐使用 `QProcess` 类。下面是一个完整的例子展示如何利用 `QProcess` 启动外部 `.exe` 文件以及处理可能存在的中文乱码问题。 ##### 示例代码 ```cpp #include <QCoreApplication> #include <QProcess> #include <QDebug> void startExternalExe(const QString &programPath, const QStringList &arguments) { QProcess process; // 设置工作目录为当前应用所在位置 process.setWorkingDirectory(QCoreApplication::applicationDirPath()); // 连接 readyReadStandardOutput 信号以便实时获取子进程的标准输出 QObject::connect(&process, static_cast<void (QProcess::*)(QProcess::ExitStatus)>(&QProcess::finished), [&]() { qDebug() << "Program finished with exit code:" << process.exitCode(); // 如果有标准输出则打印出来 QByteArray outputData = process.readAllStandardOutput(); QString outputString(outputData); qDebug() << "Standard Output:\n" << outputString; }); QObject::connect(&process, &QProcess::readyReadStandardOutput, [&]() { QByteArray data = process.readAllStandardOutput(); QString text(data.toUtf8()); // 解决可能出现的中文乱码问题 qDebug() << "Received from standard output:" << text.trimmed(); }); // 开始执行外部程序及其参数 process.start(programPath, arguments); if (!process.waitForStarted()) { qWarning() << "Failed to start the external application!"; return; } // 等待直到该过程结束为止 bool success = process.waitForFinished(-1); // -1 表示无限期等待 if (!success) { qWarning() << "Error occurred while running the external executable."; } } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); // 配置要启动的目标 EXE 和它的参数列表 QString targetExecutable = QApplication::applicationDirPath() + "/exampleApp.exe"; QStringList args {"arg1", "arg2"}; // 调用自定义函数以启动指定的外部程序 startExternalExe(targetExecutable, args); return app.exec(); } ``` 在这个实例中,我们不仅展示了如何启动一个外部 `.exe` 文件,还包含了对其输出流的监听机制,并解决了潜在的编码兼容性问题(即当输出包含汉字时不会发生乱码现象)。注意这里采用了 UTF-8 编码转换来确保正确显示中文字符[^3]^。 另外,在实际开发过程中,有时还需要动态定位到项目的根目录或者其他特定子文件夹下的工具包地址,这时就可以借助于 `QApplication::applicationDirPath()` 获取当前运行环境的基础路径[^4]^。 最后给出一种典型应用场景片段如下所示: ```cpp QString appName = QCoreApplication::applicationDirPath() + "/tools/tcpServer/TcpServer_Test.exe"; QProcess *toolProcess = new QProcess; toolProcess->start(appName); ``` 此段落描述了一个具体的网络服务器测试脚本被加载的情况说明[^5]^。 --- #### 总结 综上所述,无论是采用轻量级的方式——依靠系统关联自动解析文档类型并通过浏览器或其他预设软件展现内容;还是深入挖掘功能潜力从而构建更加灵活可控的工作流程链路结构模型设计思路方向探索实践验证总结归纳提炼升华形成最终结论呈现给读者朋友们参考学习借鉴模仿创新突破自我极限挑战未知领域开拓进取勇攀高峰不断超越昨天成就辉煌明天! ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值