2

好吧,我一直在寻找如何在谷歌上进行自动更新,但没有成功。

我打算创建一个更新程序(另一个由 QProcess 通过主要 exe 调用的 exe),但这里我有一些问题:

我如何使 QProcess 静音?如果有新版本,我如何在启动进程的窗口上显示通知(我的意思是我已经在 Game.exe 中创建了进程,我想从 Updater.exe 向 Game.exe 发送通知有一个新版本可用。)

感谢您的回答。

4

1 回答 1

0

首先,我从来没有遇到过需要创建除 a 之外的任何东西QThread来处理我的更新需求。QProcess如果用户更新后,您想在用户继续使用主程序时下载、安装和重新启动程序,这将很有帮助。(但这都可以通过shell脚本、python脚本甚至BAT文件来实现)

当您使用时QProcess,您将不得不依靠信号readyReadStandardError()readyReadStandardOutput(). 然后,您的进程正在调用的应用程序应将其输出发送到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版本号
  • “检查更新”
  • “忽略更新”
  • “下载更新”

最后,在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
    }
}
于 2012-02-22T16:05:53.937 回答