QT开发中文网

qt 用QProcess调用自己写的.exe程序,并传一个文件名过去 ,这边程序怎么启动和传参,同时会重复调用,但是只能调用一个此程序,

可以使用 QProcess 类来启动并传递参数给另一个程序,具体的步骤如下:

  1. 创建一个 QProcess 对象,并设置要启动的程序路径和命令行参数。
QString program = "path/to/your/executable.exe";
QStringList arguments;
arguments << "-filename" << "/path/to/your/file.txt";

QProcess process;
process.start(program, arguments);

在上面的代码中,我们指定了要启动的程序路径为 "path/to/your/executable.exe",并且将文件名作为命令行参数传递给该程序。这里我们假设你的程序支持 -filename 参数来接收文件名。

  1. 在被调用的程序中解析命令行参数,获取传递过来的文件名。

在被调用的程序中可以使用类似以下方式获取传递过来的命令行参数:

#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    QStringList args = app.arguments();
    QString filename;

    for (int i = 0; i < args.size(); ++i) {
        if (args.at(i) == "-filename") {
            filename = args.value(i + 1);
        }
    }

    qDebug() << "Filename:" << filename;

    // Do something with the filename

    return app.exec();
}

在上面的代码中,我们遍历了所有的命令行参数,找到 -filename 参数,并从其后面取出文件名。最后输出文件名供你进一步处理。

  1. 为了防止重复调用,可以在程序启动时检查是否已经有实例在运行,如果有则直接退出。

你可以使用 QLocalSocket 类来实现该功能。示例代码如下:

#include <QCoreApplication>
#include <QDebug>
#include <QLocalServer>
#include <QLocalSocket>

#define SERVER_NAME "MyApp"

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // 检查是否已经有实例在运行
    bool isRunning;
    QLocalSocket socket;
    socket.connectToServer(SERVER_NAME);
    if (socket.waitForConnected(500)) {
        qDebug() << "Another instance of MyApp is already running.";
        isRunning = true;
        return 0;
    } else {
        isRunning = false;
        socket.close();
    }

    // 如果没有实例在运行,则创建服务器并监听
    if (!isRunning) {
        QLocalServer server;
        if (!server.listen(SERVER_NAME)) {
            qDebug() << "Failed to listen on local server:" << server.errorString();
            return 1;
        }

        QObject::connect(&server, &QLocalServer::newConnection, [&]() {
            // 处理客户端请求
            while (server.hasPendingConnections()) {
                QLocalSocket *client = server.nextPendingConnection();

                // 处理客户端传递过来的参数
                QStringList args = app.arguments();
                QString filename;

                for (int i = 0; i < args.size(); ++i) {
                    if (args.at(i) == "-filename") {
                        filename = args.value(i + 1);
                    }
                }

                qDebug() << "Filename:" << filename;

                // Do something with the filename

                client->write("Done.");
                client->flush();
                client->waitForBytesWritten(500);
                client->disconnectFromServer();
            }
        });

        return app.exec();
    }
}

在上面的代码中,我们创建了一个本地服务器,并监听名为 MyApp 的端口。当有客户端连接到该端口时,就会接收到客户端传递过来的参数,并进行相应的处理。

注意,在 Windows 平台上使用 QLocalSocket 类可能会导致一些不兼容问题,请谨慎使用。建议采取其他方式来避免多个实例同时运行的情况。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=3607

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?