标签: qprocess

使用Qprocess运行ping,如果主机可访问,则退出代码始终为2

我正在使用Qprocess执行ping以检查主机是否在线...

问题是,无论是ping可达主机还是无法访问的主机,我从Qprocess->完成信号中接收的退出代码总是2.

我一直在QTimer中ping一个主机(我在Qt应用程序运行的客户端安装了一个文件夹)...

当我在连接到QProcess->完成信号的插槽中捕获ping返回的退出代码时,我总是收到退出代码为2 ..

我不能通过系统(ping)使用直接系统调用,因为它挂起我的应用程序ping时间是活动的...我希望它是异步的所以我切换到QProcess ...

以下是代码段:

//Pinging function called inside a timer with timout 1000        
QString exec="ping";
        QStringList params;
        if(!dBool)
        {
            //params << "-c1 1.1.1.11 -i1 -w1;echo $?";
            params <<" 1.1.1.11 -i 1 -w 1 -c 1";//wont ping
            cout<<"\n\npinging 11 ie wont ping";
        }
        else
        {
            //params << "-c1 1.1.1.1 -i1 -w1;echo $?";
            params <<" 1.1.1.1 -i 1 -w 1 -c 1";//will ping
            cout<<"\n\npinging 1 ie will ping";
        }
        ping->start(exec,params);
// the slot that connects with QProcess->finished signal …
Run Code Online (Sandbox Code Playgroud)

c++ qt ping qprocess

3
推荐指数
1
解决办法
4675
查看次数

Qt - QProcess无效

我尝试启动Internet Explorer,所以我使用下面的代码

QProcess * process=new QProcess(this);
QString temp="C:\\Program Files\\Internet\ Explorer\\iexplore.exe";
process->startDetached(temp.toStdString().c_str());
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

c++ user-interface qt qprocess

3
推荐指数
1
解决办法
1万
查看次数

QProcess失效,无法再次启动

我正在使用QProcess对象列表来跟踪需要以用户定义的间隔启动/停止的某些进程.

我能够启动和停止进程.但是当我使用以下方法(伪代码)停止进程时会出现问题:

process->start("PathToProcess","Some Arguments");
//Do some stuff.
process->terminate();
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试在另一个时间再次启动该过程,我会收到错误:

QProcess::start:  Process is already running
Run Code Online (Sandbox Code Playgroud)

我可以做一个ps -ef | grep processName并发现它确实已经死了,但是它处于一个已经不存在的状态,我认为这会阻止我再次启动它.

我需要做些什么来防止这种失效状态,或者删除失效方法,以便我可以重新开始我的过程而不重建?

c++ qt qprocess

3
推荐指数
1
解决办法
3367
查看次数

如何从QProcess获取错误代码?

我有一个函数A(),我执行其他八个'子函数',其中包括一个QProcess.如何从所有QProcesses获取返回代码?

例:

void Mainclass::A()
{
    B();
    C();
    // ...
    I();
}

void Mainclass::B() 
{
    QString CommandPath = "PathB";
    QProcess *Process = new QProcess(this);

    Process->setWorkingDirectory(MainDir);
    Process->setStandardOutputFile(MainDir + "/geometries");
    Process->start(CommandPath);
    Process->waitForFinished();
    QProcess::ExitStatus Status = Process->exitStatus(); 

    if (Status == 0)
    {
       std::cout << "App executed!" << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现了这个例子,但是我不了解如何自己实现它,因为我在我的应用程序中使用指针对象.

c++ qt qprocess qt-creator

3
推荐指数
1
解决办法
5255
查看次数

在textBrowser中实时显示QProcess输出

我是qt开发的新手,我想将QProcess的输出实时传输到textBrowser.我开始执行一个简单的echo命令,但程序的输出没有显示出来.我究竟做错了什么????

QProcess p;
p.start("echo hye");
QByteArray byteArray = p.readAllStandardOutput();
    QStringList strLines = QString(byteArray).split("\n");
    QString line= p.readAllStandardOutput();
    if(p.state()==QProcess::NotRunning)
        ui->textBrowser->append("not running");
    foreach (QString line, strLines){
    ui->textBrowser->append(line);}
Run Code Online (Sandbox Code Playgroud)

PS我在linux机器上.

编辑:我仍然无法在textBrowser中获取输出.

我更改了Qprocess参数并尝试了waitForStarted()和waitForReadyRead(),以便进程及时启动并且结果可用.

我添加了waitForFinished(),以便当进程超出范围时进程不会终止.

QProcess p;
    p.start("echo", QStringList() << "hye");
    p.waitForStarted();
    QByteArray byteArray = p.readAllStandardOutput();
    QStringList strLines = QString(byteArray).split("\n");
    QString line= p.readAllStandardOutput();
    if(p.state()==QProcess::NotRunning)
        ui->textBrowser->append("not running");
    ui->textBrowser->append(line);
    p.waitForFinished();
Run Code Online (Sandbox Code Playgroud)

qt qprocess qt-creator

3
推荐指数
1
解决办法
1万
查看次数

为什么QProcess信号readyReadStandardOutput()发出两次?

我使用QProcess并将它的readyReadStandardOutput连接到插槽.但是在启动插槽后执行两次.请告诉我,为什么?

{
    myProcess = new QProcess(parent);
    myProcess->start("mayabatch.exe -file "+scene);
    connect(myProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readOutput()));
}

void MainWindow::readOutput()
{
    qDebug()<<"Read";
    QByteArray outData = myProcess->readAllStandardOutput();
    qDebug()<<QString(outData);
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

Read 
"File read in 0 seconds.
" 
Read 
"cacheFi" 
Read 
"le -attachFile -fileName "nClothShape1" -directory ...
Run Code Online (Sandbox Code Playgroud)

最后一个字符串坏了.单词之间出现"Read".

qt signals qprocess

3
推荐指数
1
解决办法
5312
查看次数

在终端MacOS上运行ffmpeg

我对MacOS很陌生,我觉得使用Terminal很容易ffmpeg就像在Window上一样正常运行.

我从http://ffmpegmac.net获得了ffmpeg二进制文件,我尝试在终端中运行可执行文件,它告诉命令没有找到?我现在可以运行它的唯一方法是使用命令:"open ffmpeg",但这样终端在另一个窗口中打开,这不是我所期待的.

有没有办法直接在终端中调用ffmpeg(就像在Windows cmd上运行一样)或者我错过了什么?

macos terminal qt ffmpeg qprocess

3
推荐指数
1
解决办法
3万
查看次数

Qt在文件夹之间创建链接

我必须构建一个小对话框,创建一个文件夹的符号链接.

在Windows中我会使用mklink/D命令.

是否有可能在Qt中创建此类链接?我只看到QFile在文件之间创建链接,并且他们需要以.lnk结尾(http://qt-project.org/doc/qt-4.8/qfile.html#link)另一方面QDir没有提供任何内容.

有什么建议?

最好的问候,理查德

c++ qt qprocess qfile qtcore

3
推荐指数
1
解决办法
1433
查看次数

在Windows上使用pyqt时,QProcess.pid()结果代表什么?

文档QProcess.pid()说:

如果可用,返回正在运行的进程的本机进程标识符.如果当前没有进程正在运行,则返回0.

这是什么意思?

这段代码用来解释我的困惑.我使用的是Python 2.7.9,PyQt 4和Windows 7:

import  sys, os, time
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class testLaunch(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.process = QProcess(self)
        self.process.start('calc')
        self.process.waitForStarted(1000)
        print "PID:", int(self.process.pid())

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = testLaunch()
    main.show()
    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

这将按预期启动Windows计算器应用程序.在任务管理器中,它显示以下内容:

计算器PID

这显示我的PID为8304. print虽然我的申请中的声明显示:

PID: 44353984
Run Code Online (Sandbox Code Playgroud)

这代表了什么?它与任务管理器报告的8304 PID相比如何?

python pyqt qprocess

3
推荐指数
1
解决办法
497
查看次数

从用作进度监视器的QDialog中启动QProcess

我有一个主要的pyqt程序,需要运行带有参数的外部程序。我想将QDialog用作一种状态监视器,它将在执行外部程序时捕获外部程序的标准输出,并将其显示在QDialog内的文本框中。我有以下状态监视器代码:

class ProgressInfo(QtGui.QDialog):
    def __init__(self, cmd, args, parent=None):
        #super(self).__init__(parent)
        QDialog.__init__(self)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.cmd = cmd
        self.args = args
        self.keepGoing = True
        layout = QFormLayout()
        layout.setContentsMargins(10, 10, 10, 10)
        self.output = QtGui.QTextEdit()
        layout.addRow(self.output)
        layout.addRow(self.ui.buttonBox)
        self.setLayout(layout)

        self.ext_process = QtCore.QProcess(self)
        #self.ext_process.waitForFinished(-1)
        #self.ext_process.waitForStarted()
        #self.ext_process.readyRead.connect(self.dataReady)
        self.ext_process.started.connect(self.open)
        self.ext_process.readyReadStandardOutput.connect(self.dataReady)
        self.ext_process.finished.connect(self.onProcessFinished)
        self.ext_process.start(self.cmd, self.args)

    def dataReady(self):
        cursor = self.output.textCursor()
        cursor.movePosition(cursor.End)
        cursor.insertText(str(self.ext_process.readAll()))
        self.output.ensureCursorVisible()

    def onProcessFinished(self):
        cursor = self.output.textCursor()
        cursor.movePosition(cursor.End)
        #cursor.insertText(str(self.ext_process.readAll()))
        cursor.insertText(str(self.ext_process.readAllStandardOutput()))
        self.output.ensureCursorVisible()
Run Code Online (Sandbox Code Playgroud)

然后,我将使用以下命令实例化该命令:

prog='C:/Program Files (x86)/My Program/Execute.exe'
margs=['D:/Data/Input1.txt', 'D:/Data/Input2.txt']
status = ProgressInfo(prog, margs, self)
Run Code Online (Sandbox Code Playgroud)

到目前为止,这还没有奏效。

问题1:仅在取消注释waitForFinished(-1)行之后,外部程序才会运行。

问题2。QDialog框仅在一瞬间打开,然后消失。

问题3.显然,没有显示正在运行的程序的任何异常。 …

python pyqt qprocess qthread

3
推荐指数
1
解决办法
3823
查看次数

标签 统计

qprocess ×10

qt ×8

c++ ×5

pyqt ×2

python ×2

qt-creator ×2

ffmpeg ×1

macos ×1

ping ×1

qfile ×1

qtcore ×1

qthread ×1

signals ×1

terminal ×1

user-interface ×1