自动更新程序示例
Posted
技术标签:
【中文标题】自动更新程序示例【英文标题】:Auto Updater Examples 【发布时间】:2011-12-17 09:18:56 【问题描述】:我一直在寻找如何在 google 上进行自动更新,但没有成功。
我打算创建一个更新程序(另一个由 QProcess 调用的 exe,虽然是主要的 exe),但我有一些问题:
如何使 QProcess 保持静音? 如果有新版本,我如何在启动进程的窗口上显示通知(我的意思是我已经在 Game.exe 中创建了进程,我想从 Updater.exe 向 Game.exe 发送通知有一个新版本可用。)
感谢您的回答。
【问题讨论】:
你需要进程间通信,Qt 有一个 D-Bus 类的集合很适合这个。 【参考方案1】:首先,除了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 版本号 “check_for_updates” “忽略更新” “下载更新”最后,在 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
【讨论】:
以上是关于自动更新程序示例的主要内容,如果未能解决你的问题,请参考以下文章
WPF XAML 绑定中的自动字段更新 - 简单示例不起作用