好吧,我一直在寻找如何在谷歌上进行自动更新,但没有成功。
我打算创建一个更新程序(另一个由 QProcess 通过主要 exe 调用的 exe),但这里我有一些问题:
我如何使 QProcess 静音?如果有新版本,我如何在启动进程的窗口上显示通知(我的意思是我已经在 Game.exe 中创建了进程,我想从 Updater.exe 向 Game.exe 发送通知有一个新版本可用。)
感谢您的回答。
好吧,我一直在寻找如何在谷歌上进行自动更新,但没有成功。
我打算创建一个更新程序(另一个由 QProcess 通过主要 exe 调用的 exe),但这里我有一些问题:
我如何使 QProcess 静音?如果有新版本,我如何在启动进程的窗口上显示通知(我的意思是我已经在 Game.exe 中创建了进程,我想从 Updater.exe 向 Game.exe 发送通知有一个新版本可用。)
感谢您的回答。
首先,我从来没有遇到过需要创建除 a 之外的任何东西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
}
}