[fix] prevented QTranslator leak, fixed #315

This commit is contained in:
DuckSoft 2020-02-09 06:47:36 +08:00
parent 38d94d73d2
commit 531915d2c7
No known key found for this signature in database
GPG Key ID: 7A3A9FA6E4FD4A8D
7 changed files with 34 additions and 18 deletions

View File

@ -143,6 +143,7 @@ Qv2rayAddSource(common, _, HTTPRequestHelper, cpp, hpp)
Qv2rayAddSource(common, _, LogHighlighter, cpp, hpp) Qv2rayAddSource(common, _, LogHighlighter, cpp, hpp)
Qv2rayAddSource(common, _, QJsonModel, cpp, hpp) Qv2rayAddSource(common, _, QJsonModel, cpp, hpp)
Qv2rayAddSource(common, _, QvHelpers, cpp, hpp) Qv2rayAddSource(common, _, QvHelpers, cpp, hpp)
Qv2rayAddSource(common, _, QvTranslator, hpp)
Qv2rayAddSource(components, autolaunch, QvAutoLaunch, cpp, hpp) Qv2rayAddSource(components, autolaunch, QvAutoLaunch, cpp, hpp)
Qv2rayAddSource(components, pac, QvGFWPACConverter, cpp) Qv2rayAddSource(components, pac, QvGFWPACConverter, cpp)
Qv2rayAddSource(components, pac, QvPACHandler, cpp, hpp) Qv2rayAddSource(components, pac, QvPACHandler, cpp, hpp)

View File

@ -22,5 +22,5 @@ namespace Qv2ray
inline base::config::Qv2rayConfig GlobalConfig = base::config::Qv2rayConfig(); inline base::config::Qv2rayConfig GlobalConfig = base::config::Qv2rayConfig();
inline base::QvStartupOptions StartupOption = base::QvStartupOptions(); inline base::QvStartupOptions StartupOption = base::QvStartupOptions();
// //
inline QTranslator *Qv2rayTranslator; inline std::unique_ptr<QTranslator> Qv2rayTranslator;
} }

View File

@ -160,13 +160,6 @@ namespace Qv2ray::common
return QString::fromStdString(_name); return QString::fromStdString(_name);
} }
QTranslator *getTranslator(const QString &lang)
{
QTranslator *translator = new QTranslator();
translator->load(lang + ".qm", ":/translations/");
return translator;
}
/// This returns a file name without extensions. /// This returns a file name without extensions.
void DeducePossibleFileName(const QString &baseDir, QString *fileName, const QString &extension) void DeducePossibleFileName(const QString &baseDir, QString *fileName, const QString &extension)
{ {

View File

@ -7,7 +7,6 @@
namespace Qv2ray::common namespace Qv2ray::common
{ {
QTranslator *getTranslator(const QString &lang);
QStringList GetFileList(QDir dir); QStringList GetFileList(QDir dir);
QString Base64Encode(QString string); QString Base64Encode(QString string);
QString Base64Decode(QString string); QString Base64Decode(QString string);

View File

@ -0,0 +1,21 @@
#pragma once
#include <QString>
#include <QTranslator>
#include <memory>
namespace Qv2ray::common
{
class QvTranslator
{
public:
QvTranslator(const QString &lang)
{
QTranslator *translator = new QTranslator();
translator->load(lang + ".qm", ":/translations/");
this->pTranslator.reset(translator);
}
public:
std::unique_ptr<QTranslator> pTranslator;
};
} // namespace Qv2ray::common

View File

@ -11,6 +11,7 @@
#include "ui/w_MainWindow.hpp" #include "ui/w_MainWindow.hpp"
#include "common/QvHelpers.hpp" #include "common/QvHelpers.hpp"
#include "common/CommandArgs.hpp" #include "common/CommandArgs.hpp"
#include "common/QvTranslator.hpp"
#ifdef Q_OS_UNIX #ifdef Q_OS_UNIX
// For unix root user check // For unix root user check
@ -222,7 +223,7 @@ int main(int argc, char *argv[])
std::unique_ptr<QCoreApplication> consoleApp(new QCoreApplication(argc, argv)); std::unique_ptr<QCoreApplication> consoleApp(new QCoreApplication(argc, argv));
// //
// Install a default translater. From the OS/DE // Install a default translater. From the OS/DE
consoleApp->installTranslator(getTranslator(QLocale::system().name())); consoleApp->installTranslator(QvTranslator(QLocale::system().name()).pTranslator.get());
QvCommandArgParser parser; QvCommandArgParser parser;
QString errorMessage; QString errorMessage;
@ -280,10 +281,10 @@ int main(int argc, char *argv[])
// Not duplicated. // Not duplicated.
// Install a default translater. From the OS/DE // Install a default translater. From the OS/DE
auto _lang = QLocale::system().name(); auto _lang = QLocale::system().name();
Qv2rayTranslator = getTranslator(_lang); Qv2rayTranslator = std::move(QvTranslator(_lang).pTranslator);
// //
// Do not install en-US as it's the default language. // Do not install en-US as it's the default language.
bool _result_ = _qApp.installTranslator(Qv2rayTranslator); bool _result_ = _qApp.installTranslator(Qv2rayTranslator.get());
LOG(UI, "Installing a tranlator from OS: " + _lang + " -- " + (_result_ ? "OK" : "Failed")) LOG(UI, "Installing a tranlator from OS: " + _lang + " -- " + (_result_ ? "OK" : "Failed"))
// //
LOG("LICENCE", NEWLINE "This program comes with ABSOLUTELY NO WARRANTY." NEWLINE LOG("LICENCE", NEWLINE "This program comes with ABSOLUTELY NO WARRANTY." NEWLINE
@ -350,7 +351,7 @@ int main(int argc, char *argv[])
// Load config object from upgraded config QJsonObject // Load config object from upgraded config QJsonObject
auto confObject = StructFromJsonString<Qv2rayConfig>(JsonToString(conf)); auto confObject = StructFromJsonString<Qv2rayConfig>(JsonToString(conf));
// Remove system translator, for loading custom translations. // Remove system translator, for loading custom translations.
qApp->removeTranslator(Qv2rayTranslator); qApp->removeTranslator(Qv2rayTranslator.get());
LOG(INIT, "Removed system translations") LOG(INIT, "Removed system translations")
if (confObject.uiConfig.language.isEmpty()) { if (confObject.uiConfig.language.isEmpty()) {
@ -359,9 +360,9 @@ int main(int argc, char *argv[])
confObject.uiConfig.language = "en-US"; confObject.uiConfig.language = "en-US";
} }
Qv2rayTranslator = getTranslator(confObject.uiConfig.language); Qv2rayTranslator = std::move(QvTranslator(confObject.uiConfig.language).pTranslator);
if (qApp->installTranslator(Qv2rayTranslator)) { if (qApp->installTranslator(Qv2rayTranslator.get())) {
LOG(INIT, "Successfully installed a translator for " + confObject.uiConfig.language) LOG(INIT, "Successfully installed a translator for " + confObject.uiConfig.language)
} else { } else {
// Do not translate these..... // Do not translate these.....

View File

@ -12,6 +12,7 @@
#include "core/kernel/KernelInteractions.hpp" #include "core/kernel/KernelInteractions.hpp"
#include "components/plugins/toolbar/QvToolbar.hpp" #include "components/plugins/toolbar/QvToolbar.hpp"
#include "components/autolaunch/QvAutoLaunch.hpp" #include "components/autolaunch/QvAutoLaunch.hpp"
#include <common/QvTranslator.hpp>
#define LOADINGCHECK if(!finishedLoading) return; #define LOADINGCHECK if(!finishedLoading) return;
#define NEEDRESTART if(finishedLoading) IsConnectionPropertyChanged = true; #define NEEDRESTART if(finishedLoading) IsConnectionPropertyChanged = true;
@ -233,11 +234,11 @@ void PreferencesWindow::on_buttonBox_accepted()
this->exec(); this->exec();
} else { } else {
if (CurrentConfig.uiConfig.language != GlobalConfig.uiConfig.language) { if (CurrentConfig.uiConfig.language != GlobalConfig.uiConfig.language) {
qApp->removeTranslator(Qv2rayTranslator); qApp->removeTranslator(Qv2rayTranslator.get());
Qv2rayTranslator = getTranslator(CurrentConfig.uiConfig.language); Qv2rayTranslator = std::move(QvTranslator(CurrentConfig.uiConfig.language).pTranslator);
// Install translator // Install translator
if (!qApp->installTranslator(Qv2rayTranslator)) { if (!qApp->installTranslator(Qv2rayTranslator.get())) {
LOG(UI, "Failed to translate UI to: " + CurrentConfig.uiConfig.language) LOG(UI, "Failed to translate UI to: " + CurrentConfig.uiConfig.language)
} else { } else {
messageBus.EmitGlobalSignal(QvMessage::RETRANSLATE); messageBus.EmitGlobalSignal(QvMessage::RETRANSLATE);