好吧,我一直在寻找如何在谷歌上做一个自动更新程序,但没有成功。
我打算创建一个更新程序(由QProcess调用的另一个exe,虽然是主程exe)但是这里有一些问题:
如何让QProcess保持沉默? 如果有新版本,我如何在窗口上显示进程启动的通知(我的意思是我在Game.exe中创建进程,我想从Updater.exe向Game.exe发送通知这是一个新版本。)
感谢您的回答。
答案 0 :(得分:0)
首先,我从未遇到过需要创建QThread
以外的任何内容来处理我的更新需求。如果用户更新后,您希望在用户继续使用主程序时下载,安装和重新启动程序,QProcess
会很有用。 (但这可以通过shell脚本,python脚本,甚至是BAT文件来实现)
使用QProcess
时,您必须依赖信号readyReadStandardError()
和readyReadStandardOutput()
。然后,您的进程正在调用的应用程序应将其输出发送到 stderr 或 stdout 。 Updater.exe 应该写入这些文件中的任何一个。
我想你的更新程序可以使用QNetworkAccessManager::finished(QNetworkReply *reply)
。调用此插槽时,请执行更好的操作:
void Updater::replyFinished(QNetworkReply *reply){
QString r(reply->readAll());
if(r.contains(SERVER_REPLY_UPDATE_AVAILABLE)){
qDebug() << "yes";
}else{
qDebug() << "no";
QApplication::quit();
}
}
如果 Updater.exe 将成为一个完整的GUI应用程序,除非需要,否则不要调用show()
方法,它应该显示在后台运行。我更喜欢一个剧本,但你了解我。
然后您的 Game.exe 会设置QProcess
。您可以在QProcess::start()
函数中将参数传递给流程。
有助于指导更新过程的好参数将是:
最后,在 Game.exe :
中...
connect(process,SIGNAL(readyReadStandardError()),this,SLOT(readProcessReply()));
...
void Game::readProcessReply(){
QString r(process->readAllStandardError());
if(r.contains("yes")){
//show your dialog here
}else{
//do nothing
}
}