首先,我简单的 Qt 应用程序, 我将从一个处理对象开始 :
#include <QtGui>
class LOLProcess : public QMainWindow {
Q_OBJECT
public:
LOLProcess(QWidget *parent = 0);
~LOLProcess();
protected:
void closeEvent(QCloseEvent *);
};
LOLProcess::LOLProcess(QWidget *parent) : QMainWindow(parent) {
}
LOLProcess::~LOLProcess() {
qDebug() << "~LOLProcess()";
}
void LOLProcess::closeEvent(QCloseEvent *) {
qDebug() << "closeEvent()";
}
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
LOLProcess w;
w.show();
return a.exec();
}
现在, Qt 应用程序与 Qprocess 对象:
#include <QtGui>
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
QProcess process;
public slots:
void close_down();
};
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
process.start("../../lolprocess-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK__Release/release/lolprocess.exe");
QTimer::singleShot(3000, this, SLOT(close_down()));
}
void MainWindow::close_down() {
process.terminate();
while (!process.waitForFinished(500)) {
qDebug() << process.readAllStandardError();
qDebug() << process.readAllStandardOutput();
}
qDebug() << process.waitForFinished(5000);
qDebug() << (process.state() == QProcess::Running);
}
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QDir::setCurrent(QCoreApplication::applicationDirPath());
MainWindow w;
w.show();
return a.exec();
}
行为 : 终止 () 导致子进程窗口消失( 从 XP 任务栏 ), 但此进程仍然按照任务栏运行 。 此时 < code> (! process. wait for finished (500)) code> 环会永远存在, 因为 QProcess 对象从未退出 () 。 令人惊讶的是, 我从子进程( 仅打印 < code_ process:: readallStandard... () 调用空字符串) 似乎很奇怪, 因为子进程顶端的窗口关闭让我觉得在子进程 中 接近 Event () 。
将儿童过程与 QProcess:: kill () work, 但我不想使用它, 因为它没有给儿童过程在离开前清理的机会 。
有趣的是,根据 Qt 4.7.4 和 OS X 10.6.x - 终止 (), 同样的代码在 Qt 4.7.4 和 OS X 10.6.x - 终止 () 下正确工作, 使得子进程可以干净地退出, 所以我不确定在 XP 下我做错了什么。 谢谢 。