2011-12-17 20 views
2

嗯,我一直在寻找如何做一个谷歌自动更新,但没有成功。自动更新程序示例

我会计划是建立一个更新(另一个exe文件被称为QProcess中,虽然主要的exe文件),但这里IHAVE一些问题:

我如何让QProcess中沉默? 如果有一个新版本,我如何显示从该进程开始的窗口通知(我的意思是我已经在Game.exe中创建了该进程,我想从Updater发送一个通知到Game.exe。 exe有新版本可用。)

感谢您的答案。

+1

您需要*进程间通信*,Qt有一个D-Bus类的集合,对此很有帮助。 – cmannett85 2011-12-17 10:25:14

回答

0

首先,我从来没有遇到需要创建除QThread之外的其他任何东西来处理我的更新需求。如果一旦用户更新,您想要在用户继续执行主程序时下载,安装并重新启动程序,则QProcess会很有帮助。

当您使用QProcess,你将不得不依赖于信号readyReadStandardError()readyReadStandardOutput()(不过这都可以用一个shell脚本,Python脚本,甚至BAT文件来实现)。然后,您的进程正在调用的应用程序应将其输出发送至stderrstdoutUpdater.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版本号
  • “check_for_updates”
  • “ignore_updates”
  • “download_update”

终于,在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 
    } 
}