首先,我将从QProcess对象开始的简单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();
}
现在,带有QProcess对象的Qt应用程序:
#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();
}
行为:terminate()导致子进程的窗口消失(并从XP任务栏中消失),但该进程仍然按照taskman运行。 while (!process.waitForFinished(500))
永远循环,因为QProcess对象永远不会发出finished()。令人惊讶的是,我没有从子进程中获取stdin或stderr(它只打印QProcess::readAllStandard...()
调用的空字符串)这看起来很奇怪,因为子进程的顶部窗口关闭让我觉得在子进程中调用了closeEvent()过程
使用QProcess :: kill()终止子进程有效,但我不想使用它,因为它不会让子进程有机会在退出之前进行清理。
有趣的是,这个相同的代码在Qt 4.7.4和OS X 10.6.x下正常工作 - terminate()导致子进程干净地退出,所以我不确定我在XP下做错了什么。感谢。
答案 0 :(得分:2)
立即尝试:
#include <QtGui>
class LOLProcess : public QMainWindow {
Q_OBJECT
public:
LOLProcess(QWidget *parent = 0);
~LOLProcess();
protected:
void closeEvent(QCloseEvent *);
public slots:
void lastWindowClosed();
};
LOLProcess::LOLProcess(QWidget *parent) : QMainWindow(parent) {
}
LOLProcess::~LOLProcess() {
qDebug() << "~LOLProcess()";
}
void LOLProcess::closeEvent(QCloseEvent *) {
qDebug() << "closeEvent()";
}
void LOLProcess::lastWindowClosed (){
QApplication::quit();
}
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
LOLProcess w;
QObject::connect(&a, SIGNAL(lastWindowClosed()), &w, SLOT(lastWindowClosed()));
w.show();
return a.exec();
}
这不应该是必要的。看起来像qt中的一些非常奇怪的怪癖/错误 - 当我有更多时间我会进一步调查它。