我想在我的程序中添加一个功能。用户应该能够在运行时切换/更改语言-而无需重新启动。想象一下,UI是用英语显示的,他想用德语进行切换。
嗯,我写了一个小例子--不能执行,因为你遗漏了一些翻译文件和ui文件。但我需要你的帮助-合乎逻辑。这是我目前的密码。
import sys
from PyQt4.uic import loadUi
from PyQt4.QtCore import Qt, QFile, QMetaObject
from PyQt4 import QtCore
from PyQt4.QtGui import QMainWindow, QApplication
class Test_Window(QMainWindow):
def __init__(self,
app):
QMainWindow.__init__(self, parent=None)
UI_PATH = QFile("testlangs.ui")
# save reference to app for later
self._app = app
# Load ui dynamically
UI_PATH.open(QFile.ReadOnly)
self.ui = loadUi(UI_PATH, self)
UI_PATH.close()
self.init_current_language()
self.init_connect_menu_item()
def init_current_language(self):
self.current_translator = QtCore.QTranslator(self._app)
self.current_translator.load("langs_en")
self._app.installTranslator(self.current_translator)
def init_connect_menu_item(self):
self.actionDeutsch.triggered.connect(lambda: self.change_language("langs_de"))
self.actionEnglish.triggered.connect(lambda: self.change_language("langs_en"))
# Change the language to German
def change_language(self, language):
self._app.removeTranslator(self.current_translator)
self.current_translator = QtCore.QTranslator(self._app)
self.current_translator.load(language)
self._app.installTranslator(self.current_translator)
self.retranslateUi(self.ui)现在,我有个问题:
首先:我不能调用和执行retranslateUi()-method.“问题”是我在运行时动态地加载ui文件。该方法是生成的ui文件的一部分。这意味着ui文件在py-file中转换。在这里你会找到retranslateUi()-method.
我能做什么?
简单而肮脏的方式如下所示:
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(self._app.translate("MainWindow", "MainWindow", None, self._app.UnicodeUTF8))
self.nameLabel.setText(self._app.translate("MainWindow", "Name", None, self._app.UnicodeUTF8))
self.ageLabel.setText(self._app.translate("MainWindow", "Age", None, self._app.UnicodeUTF8))
self.menuMenu.setTitle(self._app.translate("MainWindow", "File", None, self._app.UnicodeUTF8))
self.menuEdit.setTitle(self._app.translate("MainWindow", "Edit", None, self._app.UnicodeUTF8))
self.menuLanguage.setTitle(self._app.translate("MainWindow", "Language", None, self._app.UnicodeUTF8))
self.actionOpen.setText(self._app.translate("MainWindow", "Open", None, self._app.UnicodeUTF8))
self.actionSave.setText(self._app.translate("MainWindow", "Save", None, self._app.UnicodeUTF8))
self.actionClear.setText(self._app.translate("MainWindow", "Clear", None, self._app.UnicodeUTF8))
self.actionEnglish.setText(self._app.translate("MainWindow", "English", None, self._app.UnicodeUTF8))
self.actionDeutsch.setText(self._app.translate("MainWindow", "Deutsch", None, self._app.UnicodeUTF8))我通过从生成的ui复制此方法来重新实现缺失的方法。这种肮脏的方式很好,但我认为这不是一个优雅的解决方案。
有没有其他优雅的方法来解决这个问题?
发布于 2016-09-27 23:21:32
使用loadUiType加载ui文件,这将为您提供创建子类所需的基类和ui类。与前面的方法一样,这将导致所有子部件成为主窗口的属性,并且还可以调用self.retranslateUi(self)。
from PyQt4.uic import loadUiType
UiClass, BaseClass = loadUiType('testlangs.ui')
class Test_Window(BaseClass, UiClass):
def __init__(self, app):
super(Test_Window, self).__init__(parent=None)
self.setupUi(self)
# save reference to app for later
self._app = app
self.init_current_language()
self.init_connect_menu_item()https://stackoverflow.com/questions/39734775
复制相似问题