我使用QThread
从QProcess
启动Linux中的外部GUI应用程序。该过程成功进入起始状态(QProcess::Starting
),然后进入运行状态(QProcess::Running
),然后,之后,进入停止状态(QProcess::NotRunning
,由连接的插槽验证到stateChanged(QProcess::ProcessState)
信号)。 QProcess::errorString()
返回"未知错误。"外部流程仍在运行,但QProcess
对象未显示为正在运行。
大多数应用程序都会发生这种情况,但我发现Dolphin文件管理器和xterm没有出现此行为。可能还有其他工作也可以。我正在使用Qt 5.4.0和Debian 8.2 Jessie,GCC 4.9.2。
有谁知道为什么会这样?不幸的是,我无法发布完整的示例,因为这需要发布几乎整个应用程序。
class RecordingControllerObject : public QObject
{
Q_OBJECT
public:
RecordingControllerObject(QObject *parent = 0)
: QObject(parent)
...
, proc(new QProcess(this))
...
{
...
connect(proc, SIGNAL(stateChanged(QProcess::ProcessState)), SLOT(procStateChanged(QProcess::ProcessState)));
...
}
virtual ~RecordingControllerObject()
{
...
if (proc->state() == QProcess::Running)
{
proc->terminate();
proc->waitForFinished(-1);
}
delete proc;
...
}
...
signals:
...
public slots:
...
void startWatcher(const QString &program, const QStringList &arguments)
{
qDebug("starting watcher\n");
if (proc->state() == QProcess::Running)
proc->kill();
proc->start(program, arguments);
}
private slots:
void readyRead(const QByteArray &buffer)
{
if (proc->isOpen())
proc->write(buffer);
}
void procStateChanged(QProcess::ProcessState state)
{
std::cout << "proc state changed: " << state << std::endl;
std::cout << "proc error: " << proc->errorString().toUtf8().constData() << std::endl;
}
...
private:
...
QProcess *proc;
...
};