【发布时间】:2019-06-14 18:30:39
【问题描述】:
我有一个自定义类,我需要在其中保存新选择的语言并同时更改应用程序语言。基于 QtCreator 中 StackView 示例项目的示例:
//main.cpp
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
qmlRegisterType<CustomClass>("io.qt.CustomClass", 1, 0, "CustomClass");
QTranslator translator;
translator.load(":/EN.qm");
app.installTranslator(&translator);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
//customclass.h
class CustomClass : public QObject
{
Q_OBJECT
public:
explicit CustomClass(QObject *parent = nullptr) : QObject(parent) {}
Q_INVOKABLE void change(){
QTranslator translator;
QApplication::removeTranslator(&translator);
translator.load(":/CZ.qm");
QApplication::installTranslator(&translator);
//QQmlApplicationEngine * engine = qobject_cast<QQmlApplicationEngine *>(qmlEngine(this));
QQmlEngine *engine = QQmlEngine::contextForObject(this)->engine();
engine->retranslate();
}
};
//main.qml
...
CustomClass{id:test}
...
ItemDelegate {
text: qsTr("Page 1")
width: parent.width
onClicked: {
test.change()
drawer.close()
}
}...
//.pro file
QT += quick gui core
...
TRANSLATIONS = EN.ts CZ.ts
...
HEADERS += \
customclass.h
在此示例中,单击第 1 页按钮应更改语言。
我的应用程序基于 StackView,当我使用此代码调用该函数时,一切似乎都正常工作。字符串被翻译。但是,当我在堆栈上推送一个新项目时(比如从菜单中打开一个新部分),那里的字符串在更改之前恢复为原始语言。就像重新翻译只改变当前可见的字符串一样。
有人知道问题出在哪里吗?我怀疑引擎没有被正确获取。这是一个自定义类,我需要注册(qmlRegisterType)才能在 qml 中使用,我不确定如何正确获取引擎(因为引擎是在主函数中创建的)。
【问题讨论】:
-
正如我所说,StackView 与此代码的组合。这还不够吗?我的意思是没有人在这里分享整个项目。它基于来自 Qt Creator 的堆栈移动应用程序模板。
-
1) 还不够,2) 我没有告诉你分享你的项目,看来你没有看过链接的内容,一个MRE是一个项目不一定是你的项目而是一个极简版本(minimal),其任务只是重现问题(reproducible)。
-
扩展了代码,希望现在可以了。展示了最重要的部分。
-
展示你的 .pro....
-
添加了我在那里所做的更改