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

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://www.xdnf.cn/news/20255.html

相关文章:

  • 【开题答辩全过程】以 停车场管理系统的设计与实现为例,包含答辩的问题和答案
  • 点晴模切ERP与MES系统整合:模切工厂数字化转型关键
  • 内网后渗透攻击--linux系统(横向移动)
  • Python趣味入门:打印与计算初体验
  • 垃圾收集器分类
  • 「数据获取」《中国电力统计年鉴》(1993-2024)(含中国电力年鉴)
  • 分布式数据库的历史演变与核心原理
  • SpringBoot配置文件
  • 【CSP-S】数据结构 ST 表详解
  • 植物大战僵尸融合版安装包,下载安装教程
  • PCDN工作原理的详细步骤
  • Netty从0到1系列之EventLoopGroup
  • Kafka面试精讲 Day 10:事务机制与幂等性保证
  • CUDA默认流的同步行为
  • 项目升级--kafka消息队列的应用
  • 状压 dp --- 数据范围小
  • 雪球科技Java开发工程师笔试题
  • happen-before原则
  • WSL Ubuntu Docker 代理自动配置教程
  • LeetCode 139. 单词拆分 - 动态规划解法详解
  • 【软考架构】第二章 计算机系统基础知识:计算机网络
  • 主数据系统是否对于企业是必需的?
  • 最大似然估计:损失函数的底层数学原理
  • 基本数据类型和包装类的区别?
  • 2025年大数据专业人士认证发展路径分析
  • MySQL运维补充
  • 【目录-判断】鸿蒙HarmonyOS开发者基础
  • 敏捷scrum管理实战经验总结
  • 贪心算法应用:化工反应器调度问题详解
  • 【LLIE专题】SIED:看穿0.0001lux的极致黑暗