• Qt之命令行参数


    简述

    Qt之进程间通信(QProcess)一节,我们讲解了如何通过QProcess来进行进程间的通信。主要通过启动外部程序,然后通过命令行的方式传递参数。

    这里,我们可以通过Qt Creator来设置命令行参数Arguments,来设置需要用到的信息。也可以用来测试其它进程传参功能。

    设置参数

    选择:项目 -> 构建和运行 -> 运行,在Arguments输入框中输入需要传递的参数。

    为了演示,我传递了一个Json对象:{"UserName":"Qter","Password":"123456"}

    这里写图片描述

    解析

    定义一个结构体,保存命令行参数对应的值,可根据需要,自行扩展。

    struct UserInfo
    {
        QString strUserName;  // 用户名
        QString strPassword;  // 密码
    };

    通过parseArguments来解析命令行参数,主要解析之前设置的Json对象。

    #include <QApplication>
    #include <QJsonDocument>
    #include <QJsonObject>
    #include <qDebug>
    
    UserInfo g_userInfo = {"", ""};
    
    void parseArguments()
    {
        // 获取命令行参数
        QStringList arguments = QCoreApplication::arguments();
    
        qDebug() << "Arguments : " << arguments;
    
        if (arguments.count() < 2)
            return;
    
        QString strJson = arguments.at(1);
    
        qDebug() << "Json : " << strJson;
    
        // 解析Json对象
        QJsonParseError jsonError;
        QJsonDocument doucment = QJsonDocument::fromJson(strJson.toLocal8Bit(), &jsonError);
        if (jsonError.error != QJsonParseError::NoError)
            return;
    
        if (doucment.isObject())
        {
            QJsonObject obj = doucment.object();
            QJsonValue value;
            if (obj.contains("UserName"))
            {
                value = obj.take("UserName");
                if (value.isString())
                    g_userInfo.strUserName = value.toString();
            }
            if (obj.contains("Password"))
            {
                value = obj.take("Password");
                if (value.isString())
                    g_userInfo.strPassword = value.toString();
            }
        }
    }
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        // 解析命令行参数
        parseArguments();
    
        // 测试输出
        qDebug() << "UserName : " << g_userInfo.strUserName;
        qDebug() << "Password : " << g_userInfo.strPassword;
    
        Widget w;
        w.show();
    
        return a.exec();
    }

    输出信息如下:

    Arguments : ("E:\Qt\Test\build-TestArguments-Desktop_Qt_5_5_1_MSVC2013_32bit-Debug\debug\TestArguments.exe", "{"UserName":"Qter","Password":"123456"}")
    Json : "{"UserName":"Qter","Password":"123456"}"
    UserName : "Qter"
    Password : "123456"

    这里,我们也可以使用cmd来进行测试:

    这里写图片描述

    其实,这就是我们所说的进程通信,利用进程cmd.exe启动进程TestArguments.exe并将Json对象传递给它。

    更多参考

  • 相关阅读:
    关于泛型
    共享几个.net工具类
    关于Guid
    自动更新解决方案
    订阅者模式实例
    好久没有blog了,今日就share一个update program的经验
    杀掉相应数据库的进程
    解决IFrame下无法写Cookie问题
    sql处理死锁
    log4net配置及使用方法
  • 原文地址:https://www.cnblogs.com/itrena/p/5938283.html
Copyright © 2020-2023  润新知