当前位置: 首页 > news >正文

QT之实现点击按钮启动另一个桌面应用程序

方法一:使用 QProcess (最推荐、最专业)

这是 Qt 框架中专门用于启动和控制外部进程的类。它功能强大、跨平台,并且可以很好地集成到 Qt 的事件循环中。

实现步骤:

  1. 包含头文件:在你的源文件(如 mainwindow.cpp)中包含 QProcess 的头文件。

  2. 创建按钮并连接信号槽:在界面类(如 MainWindow)的构造函数中,设置按钮的点击信号 clicked() 连接到自定义的槽函数。

  3. 在槽函数中启动进程:在槽函数中,使用 QProcess 来启动目标应用程序。

代码示例:

假设你的按钮对象名为 pushButton_StartApp

在 MainWindow 的头文件 (mainwindow.h) 中:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QProcess> // 包含 QProcess 头文件// ... 其他必要的包含,例如根据你的UI文件生成的Ui头文件namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:// 这是一个槽函数声明,用于响应按钮点击void on_pushButton_StartApp_clicked();private:Ui::MainWindow *ui;QProcess *m_process; // 声明一个 QProcess 指针成员变量
};#endif // MAINWINDOW_H

在 MainWindow 的源文件 (mainwindow.cpp) 中:

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);// 初始化 QProcess 对象m_process = new QProcess(this); // ‘this’ 指定父对象,用于自动内存管理// 连接按钮的点击信号到槽函数// 注意:如果你的按钮是使用Qt设计师的“转到槽...”功能自动连接的,// 则不需要下面这行手动连接的代码,系统会自动生成。connect(ui->pushButton_StartApp, &QPushButton::clicked, this, &MainWindow::on_pushButton_StartApp_clicked);
}MainWindow::~MainWindow()
{delete ui;// m_process 由于父对象是this,会随MainWindow一起销毁,无需手动delete
}void MainWindow::on_pushButton_StartApp_clicked()
{// 方法 1A: 使用 startDetached (常用)// 启动一个独立的进程,与原Qt程序无关。即使你的Qt程序关闭,启动的程序也会继续运行。// QString program = "C:/Path/To/Your/Application.exe"; // Windows 绝对路径// QString program = "/usr/bin/gedit"; // Linux 绝对路径// QProcess::startDetached(program);// 例如,启动 Windows 上的记事本// QProcess::startDetached("notepad.exe");// 例如,启动 Linux 上的 gedit 文本编辑器// QProcess::startDetached("/usr/bin/gedit");// 方法 1B: 使用成员 QProcess 对象的 start (更可控)// 可以连接readyRead等信号来获取进程输出,或等待进程结束。QString program = "notepad.exe";// QStringList arguments; // 如果需要命令行参数,可以在这里添加// arguments << "-a" << "somefilename.txt";m_process->start(program);//, arguments); // 启动程序// 可选:检查进程是否成功启动if (!m_process->waitForStarted(3000)) { // 等待3000毫秒// 启动失败处理ui->statusBar->showMessage(tr("Failed to start the application!"), 3000);}
}

方法二:使用 QDesktopServices (适用于打开文件或URL)

如果你的目的不仅仅是启动一个可执行文件,而是希望用系统默认的关联程序打开一个文档、图片、URL链接等,那么 QDesktopServices 是更合适的选择。

#include <QDesktopServices>
#include <QUrl>
#include <QFileInfo>void MainWindow::on_pushButton_StartApp_clicked()
{// 打开一个PDF文件,系统会调用默认的PDF阅读器 (如Acrobat、Edge等)QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("C:/path/to/your/file.pdf").absoluteFilePath()));// 打开一个网址// QDesktopServices::openUrl(QUrl("https://www.qt.io"));// 打开一个图片,系统会调用默认的图片查看器// QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("/home/user/Pictures/image.png").absoluteFilePath()));
}

注意: QDesktopServices 依赖于系统已配置的文件关联,它本身不是用来启动特定 .exe 的。


方法三:使用系统原生 API (不推荐,除非必要)

在极少数情况下,如果 QProcess 无法满足需求,可以调用系统原生 API。但这会牺牲跨平台性。

Windows 示例 (使用 ShellExecute):

#ifdef Q_OS_WIN#include <windows.h>#include <shellapi.h>
#endifvoid MainWindow::on_pushButton_StartApp_clicked()
{
#ifdef Q_OS_WIN// 在 Windows 上使用 ShellExecuteShellExecuteW(nullptr, L"open", L"C:\\Path\\To\\Application.exe", nullptr, nullptr, SW_SHOWNORMAL);
#endif// 对于 Linux 和 macOS,你需要使用其他系统调用,如 fork/exec// 这就是为什么不推荐此方法的原因
}

总结与推荐

方法优点缺点适用场景
QProcess跨平台、功能强大、可控性强需要知道程序的准确路径绝大多数场景的首选,用于启动特定的已知应用程序
QDesktopServices跨平台、使用简单不能指定具体程序,依赖系统关联打开文档、图片、网页等系统关联的文件或链接
系统API功能可能最底层完全不跨平台,代码复杂只有在 QProcess 无法实现的极端特殊情况下使用

最终建议:

直接使用 QProcess。它是 Qt 为这类任务提供的标准解决方案。

  1. 在你的 MainWindow 类中添加一个 QProcess *m_process; 成员变量。

  2. 在构造函数中初始化它:m_process = new QProcess(this);

  3. 在按钮的槽函数中,使用 m_process->start("你的程序路径") 或 QProcess::startDetached("你的程序路径")

  4. 如果程序路径中有空格,请使用双引号将路径括起来,或者将路径和参数分开传入 start 函数。使用 QDir::toNativeSeparators() 可以帮助转换路径分隔符。

    QString path = "C:/Program Files/My App/application.exe";
    m_process->start("\"" + path + "\""); // 方法一:手动加引号// 更好的方法二:将路径和参数分开
    QString program = "C:/Program Files/My App/application.exe";
    QStringList arguments;
    arguments << "-arg1" << "-arg2";
    m_process->start(program, arguments); // Qt 会正确处理带空格的路径

文章转载自:

http://3dg8hHuk.pttrs.cn
http://IMmKJKAj.pttrs.cn
http://IgRfdxGN.pttrs.cn
http://97Znt0zs.pttrs.cn
http://8lKZZQHU.pttrs.cn
http://pMXc3pcR.pttrs.cn
http://rRNbBkbt.pttrs.cn
http://aRM1ArNS.pttrs.cn
http://P9jelEtF.pttrs.cn
http://nZFeBRY9.pttrs.cn
http://foEc7bCW.pttrs.cn
http://EkMyfE08.pttrs.cn
http://IVTdDWKM.pttrs.cn
http://wTDRYrua.pttrs.cn
http://35OuEp6s.pttrs.cn
http://qv3ag5va.pttrs.cn
http://H8APwIkG.pttrs.cn
http://URrPdLa7.pttrs.cn
http://xcoK5gxh.pttrs.cn
http://lxlNF7f5.pttrs.cn
http://IQlxUH6x.pttrs.cn
http://nikMY9g0.pttrs.cn
http://qrCxuXRe.pttrs.cn
http://IRVay37J.pttrs.cn
http://kSAZNGDQ.pttrs.cn
http://4TvJdI7w.pttrs.cn
http://bFVkyZFB.pttrs.cn
http://ysrKRNLb.pttrs.cn
http://FhKJOXTe.pttrs.cn
http://85Kx9ygN.pttrs.cn
http://www.dtcms.com/a/371095.html

相关文章:

  • 贪心算法在医疗影像分割中的应用详解
  • 责任分配矩阵(RAM)
  • Science Advances副主编:如何提高论文投稿接收率?
  • 【目录-单选】鸿蒙HarmonyOS开发者基础
  • C++语法之--多态
  • Spring Cloud Alibaba快速入门02-Nacos
  • 一阶低通滤波:从原理到实践,平滑数据的艺术
  • 2025最新超详细FreeRTOS入门教程:第一章 FreeRTOS移植到STM32
  • 用Python打造逼真的照片桌面:从拖拽到交互的完整实现
  • 【selenium】网页元素找不到?从$(‘[placeholder=“手机号“]‘)说起
  • 深入解析达梦数据库核心技术:检查点、redo、undo、MVCC与内存缓存刷盘
  • 四款主流深度相机在Python/C#开发中的典型案例及技术实现方案
  • 4.存储虚拟化
  • GMSL(Gigabit Multimedia Serial Link)全解析:从车载到工业视觉的高速传输利器
  • 基于51单片机的信号发生器函数发生器设计
  • Python基础(①⑦gRPC)
  • 零压力了解 LoRA 微调原理
  • eclipse 安装 lombok
  • 多次base64编码过滤垃圾字符
  • shell脚本作业
  • 【HEMCO Reference Guide 参考指南第一期】基础示例(Basic examples)
  • 【最新版播放器】完美解码播放器,PureCodec中文播放器,免费使用
  • (论文速读)视觉语言模型评价中具有挑战性的选择题的自动生成
  • 可重复读 是否“100%”地解决幻读?
  • 数据结构与算法1 第一章 绪论
  • Unity的UGUI更改背景以及添加中文字体
  • Linux网络接口命名详解:从eth0到ens33
  • C++零基础第四天:顺序、选择与循环结构详解
  • 南科大适应、协同与规划的完美融合!P³:迈向多功能的具身智能体
  • 机床夹具设计 +选型