精华内容
下载资源
问答
  • Qt开发 — QProcess执行带管道的shell命令 简述:在嵌入式开发过程中,很容易遇到一些需要开辟新的进程,而新的进程里面又需要强制关闭父进程的操作。不如程序中需要读写SD卡,但是有时程序中又需要格式化SD卡。这就...

    Qt开发 — QProcess执行带管道的shell命令

    简述在嵌入式开发过程中,很容易遇到一些需要开辟新的进程,而新的进程里面又需要强制关闭父进程的操作。不如程序中需要读写SD卡,但是有时程序中又需要格式化SD卡。这就遇到问题,需要在SD卡格式化的进程中,关闭程序以便操作SD卡,否则SD卡被占用无法完成格式化。

    方法一
    编写QT 程序,在程序内部首先kill 操作SD卡的程序,然后在进行SD卡操作。
    
    方法二:
    通过编写shell脚本来实现kill程序 和SD卡格式化
    

    但是如何实现,在程序内启动所编写的 格式化SD卡的程序呢?

    在QT中提供了QProcess 供我们使用来启动一个程序、脚本或者指令
    注意

    QProcess::startDetached(); // 以分离进程的方式启动 没有子父进程关系
    QProcess::start(); // 父死 子亡
    

    因此,我们选用分离进程的方式启动最合理

    启动脚本程序
    QProcess::startDetached("./home/parallels/Documents/beep.sh"); 
    // 或
    QProcess::startDetached("/bin/bash",QStringList()<<"./beep.sh","/home/parallels/Documents/");
    // 没有 /bin/bash时使用 /bin/sh 
    QProcess::startDetached("/bin/sh",QStringList()<<"./beep.sh","/home/parallels/Documents/");
    
    启动程序
    QProcess::startDetached("/home/parallels/Documents/Beep.exe"); 
    
    启动脚本指令
    // killall app
    	QString cmd = "/bin/sh -c \"killall -9 TEST;";
    	cmd += "umount /dev/mmcblk0p1;mkfs.fat /dev/mmcblk0p1;\"";
    	QProcess::startDetached(cmd);
    

    注意指令的执行

    /bin/sh -c "killall -9 TEST;umount /dev/mmcblk0p1;mkfs.fat /dev/mmcblk0p1;"
    //或者
    /bin/bash -c "killall -9 TEST;umount /dev/mmcblk0p1;mkfs.fat /dev/mmcblk0p1;"
    
    展开全文
  • 最近给vivo做的设备需要连接MES生产内网,要求机器根据心跳包返回值来同步服务器...② 编写shell脚本,通过调用shell脚本执行命令行。 新建"systime.sh"脚本,在脚本中写入: #! bin/bash sudo date --s="2020-11-2

    最近给vivo做的设备需要连接MES生产内网,要求机器根据心跳包返回值来同步服务器时间。而这一步操作需要在上位机程序中执行,也就是在Qt中调用命令行或者更改配置文件来设置系统时间。
    树莓派更改系统时间的方法很多,在这里我介绍两种比较方便的:

    ① 使用命令行:sudo date --s=“2020-11-28 14:30:00”

    ② 编写shell脚本,通过调用shell脚本执行命令行。
    新建"systime.sh"脚本,在脚本中写入:

    #! bin/bash
    sudo date --s="2020-11-28 14:30:00"
    exit 0
    // exit 0表示脚本下执行完后自动关闭脚本文件
    

    Qt中如何使用这两种方法来实现通过程序更改系统时间呢,在网上搜索后找到了如下两种方法:

    ① 使用Linux中的system()函数,这个函数需要引用stdlib.h头文件。在system函数中写入字符串形式的命令行,即可执行对应的终端命令,比如system(“sudo reboot”),那么树莓派就会重新启动。或者通过命令行运行脚本system(“systime.sh”)就会运行systime.sh脚本,然后执行脚本里的内容。
    但是如果使用system的方式更改系统时间会有一个问题,因为是根据服务器心跳包的返回值来更改系统时间,这里的时间实际上是一个变量,需要当做参数传入,根据参数来更改时间。如果多次调用system来更改时间,会发现只有第一次的system(命令行)是生效的,之后每一次调用system所执行的都是第一次调用的命令。造成这种情况的原因我无法解释,我的猜想是因为system函数创造的进程没有释放,所以每次调用system()都执行的同一个进程。显然这样是无法满足根据心跳包同步服务器时间的要求的。

    ② 使用QProcess类,Qt中的QProcess类提供了启动外部程序的方法。
    通过start()函数来调用外接程序,或调用命令行,而且也可以手动释放,这样就不存在上述system函数的问题了。

    #include <QProcess>
    QProcess process;
    process.start("sudo date --s=\"2020-11-28 14:30:00\"");
    //process.start("systime.sh");
    process.waitForStarted();
    process.waitForFinished();//以阻塞的方式等待释放
    
    展开全文
  • 这两天在工作遇到要拷贝文件的功能,直接用QFile 的copy()功能拷贝文件速度太慢,所以想到用shell脚本来实现文件copy。...在网上参考了相关的方法,...在Qt中点击按钮关联到执行脚本,使用QProcess 来完成。 本例中...

    这两天在工作遇到要拷贝文件的功能,直接用QFile 的copy()功能拷贝文件速度太慢,所以想到用shell脚本来实现文件copy。需要点击界面上的一个button,执行拷贝文件的脚本,并且将待拷贝文件的文件名 作为参数传递到脚本中。在网上参考了相关的方法,然后实现了这个功能,这里总结一下。

    1.点击按钮实现执行脚本功能

    在Qt中点击按钮关联到执行脚本,使用QProcess 来完成。

    本例中代码如下:

    void UpgradeProgressBar::copyFileToDst()
    {
        QProcess *tpuProcess = new QProcess();
        QString commandProgram = "./copyFile.sh";      //commandProgram 这个变量是待执行脚本的完整路径
        QStringList args;
        args.append(mFileName);                                     //mFileName 是待复制的文件名,作为参数传递给copyFile.sh文件,如果还有其他参数,可以往后加args.append(XX)
        tpuProcess->start(commandProgram,args);      //启动执行脚本文件
    }

    2.脚本接收Qt中传递的参数

    copyFile.sh文件代码如下:

    #! /bin/sh
    touch testfile.txt
    echo "I have $# parameter!"
    echo "First parameter is: $0" >> testfile.txt
    echo $0 >> testfile.txt
    echo $1 >> testfile.txt
    cp $1 /mnt/udisk/
    #echo '12345678'| sudo -S cp $1 /mnt/udisk/
    echo "Copy file finish!"

    其中:

    $# 表示传递参数的个数

    $0 表示第0个参数,一般为./XX.sh

    $1表示第一个参数,这里为mFileName(传递给脚本的文件名)

    $2、 $3... 表示./XX.sh跟在后面的参数。

    展开全文
  • QProcess启动

    2019-10-18 22:36:20
    QProcess可以启动外部exe程序、执行bat批处理脚本执行cmd命令等 启动方式有两种: 一体式 外部程序启动后,将随主程序的退出而退出。 void QProcess::start(const QString &program, const QStringList &...

    QProcess可以启动外部exe程序、执行bat批处理脚本、执行cmd命令等

    启动方式有两种:

    • 一体式

    外部程序启动后,将随主程序的退出而退出。

    void QProcess::start(const QString &program, const QStringList &arguments, OpenMode mode = ReadWrite)

     例:

    QProcess process;
    process.start("C:\\Windows\\System32\cmd.exe");
    // same as process.start("C:\\Windows\\System32\cmd.exe", QStringList());
      ...
    • 分离式

    外部程序启动后,当主程序退出时并不退出,而是继续运行。

    void QProcess::startDetached(const QString & program, const QStringList & arguments, const QString & workingDirectory = QString(), qint64 * pid = 0)

    例:

    QProcess process;
    process.startDetached("C:\\Windows\\System32\cmd.exe");
    // same as process.startDetached("C:\\Windows\\System32\cmd.exe", QStringList());
      ...

     

    展开全文
  • QT 调用执行 linux脚本的三种方法

    千次阅读 2018-10-16 13:51:20
    在linux系统下,Qt执行shell命令的方式有3种: (1)QProcess:execute("ls"); (2)system("ls"); (3)QProcess *process = new QProcess(); process-&gt;start("ls"); 注1...
  • 1.最简单的,我们可以通过system直接启动一个应用程序或者脚本: system("./helloworld"); system("./hello.sh"); 操作简单,但是我们可以很清晰的看到弊端:虽然很顺利的匹出一个进程去执行...
  • 调用waitForStarted执行ok调用waitForBytesWritten,返回值为false,QProcess::ProcessError为5,即QProcess::UnknownError。调用waitForFinished,函数超时,且SqlFormatter.exe进程掉死。网上搜索无...
  • 这个是改进后的,之前waitForFinished()阻塞有点问题,这个是获取结束进程的退出状态后执行 .h文件 #ifndef INFACETEST_H #define INFACETEST_H #include <QMainWindow> #include <QComboBox> #...
  • QT调用Python脚本

    千次阅读 2016-12-05 15:20:30
    QT调用Python脚本用Python写一些小工具,执行某些自动操作还是很方便。脚本已经写好了,有时候需要QT来调用这些脚本执行相应的操作。:QT调用外部程序的方法有好几种,这里不做讨论,我们用其中的一种方法来讲怎么...
  • 经过折腾发现Qt的QProcess是调用不了.vbs脚本文件的。但是是可以调用.exe可执行文件的,于是想到另外一种方法,看是否能够通过.bat文件去间接调用.vbs文件。结果发现QProcess是能够调用.bat文件的,于是我编辑了一下...
  • 在QT中经常要调用外部命令或者是执行shell脚本,并且要对执行结果进行分析。 QProcess runShellProcess =new QProcess(this); //调用过程输出的监控 connect(runShellProcess, SIGNAL(readyRead()), this, ...
  • Qt下编码调用Linux的Shell脚本命令

    千次阅读 2019-03-21 17:20:55
    Linux下编写Qt程序,常会碰到需要执行Shell脚本命令的时候。因为简单调用的一个脚本命令,可以大大简化功能实现的复杂度。 调用Shell脚本命令,Qt环境下常用两种方式: 1)使用QProcess开启一个进程,把脚本命令作为...
  • 最近在做一个深度学习对图片中对象识别效果的检测工具,其...我们可以直接用qt的QProcess调用bash来执行运行脚本的命令,获取结果数据则有两种方式: 一是在python脚本中将结果写到文本中,脚本结束后由qt读取。 ...
  • Qt运行 .bat脚本文件

    2019-10-18 17:21:12
    #include <QProcess> #include <QDir> #include <QString> #include <QDebug>... //cmd.exe /c dir /c是执行完dir命令后关闭命令窗口 p.start("cmd.exe", QStringList() &l...
  • QT应用在windows系统下调用bat脚本,居然报错了。 该BAT脚本,是用来检查svn.exe这个命令行工具...同样的应用可执行文件和bat脚本,在windows7旗舰版和windows10家庭中文版下运行正常! 调试了一段时间,始终没有找...
  • 我是通过编写shell脚本,将更改时间的命令行写在脚本里,使用QProcess调用脚本,这部分在Qt中调用system()和QProcess执行命令行,更改树莓派的系统时间中有说明。 这里主要将通过QFile改写脚本文件,将服务器给的...
  • 这一句话在我的机器上运行是可以的(双击可执行程序),但拿到别的linux系统(中标麒麟)上,双击可执行程序就没有创建文件,用QProcess也不行, 把这句话写成脚本,在程序中把参数传给脚本运行也不行 但是在终端运行这个...
  • ssh远程登陆问题总结

    2019-05-23 11:47:56
    关于QT执行shell脚本的内容不是本次记录的重点,基本思路是使用QT官方提供的QProcess类,关于该类的使用网上有很多教程。近期遇到的问题是,通过QT调用本地的shell脚本在远程机器上执行一个可执行程序,之后再通过QT...
  • 警告:所有的GUI类(比如,QWidget和它的子类),操作系统核心类(比如,QProcess)和网络类都不是线程安全的。 QRegExp使用一个静态缓存并且也不是线程安全的,即使通过使用QMutex来保护的QRegExp对象。 ...
  • 精通Qt4编程(第二版)源代码

    热门讨论 2014-01-19 13:07:18
    \19.1 执行ECMAScript脚本 459 \19.2 QtScript中的信号和槽 460 \19.3 使用JavaScript操作Qt对象 463 \19.4 基于Prototype的继承 467 \19.5 小结 467 \第20章 国际化 468 \20.1 Unicode与字符编码 468 \...
  • 精通qt4编程(源代码)

    热门讨论 2010-03-17 19:10:40
    \19.1 执行ECMAScript脚本 459 \19.2 QtScript中的信号和槽 460 \19.3 使用JavaScript操作Qt对象 463 \19.4 基于Prototype的继承 467 \19.5 小结 467 \第20章 国际化 468 \20.1 Unicode与字符编码 468 \20.1.1 ...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

qprocess执行脚本