sun*_*wer 2 qt-designer pyqt5 qt-linguist
我正在使用 Qt Designer 和 PyQt5 创建多语言桌面应用程序。我正在遵循此答案以使我的应用程序动态更改语言。
我通过 Qt Designer 创建了一个 .ui 文件,并通过loadUi直接在 python 代码中加载 UI 。因此,函数retranslateUi在我的 ui.file 中进行了描述,与上面链接中的retranslateUi函数(它存在于 python 代码中)不同。我不想将所描述的函数放在 python 代码中,因为有很多按钮和标签。如何在我的代码中使用此函数并将其仅保留在 .ui 文件中?
如果您使用 loadUi 方法,它不会实现 retranslateUi 方法,因此如果您使用该方法,则解决方案与上一篇文章相同。
\n演示界面
\n<?xml version="1.0" encoding="UTF-8"?>\n<ui version="4.0">\n <class>Demo</class>\n <widget class="QWidget" name="Demo">\n <property name="geometry">\n <rect>\n <x>0</x>\n <y>0</y>\n <width>102</width>\n <height>108</height>\n </rect>\n </property>\n <property name="windowTitle">\n <string>Form</string>\n </property>\n <layout class="QVBoxLayout" name="verticalLayout">\n <item>\n <widget class="QComboBox" name="combo"/>\n </item>\n <item>\n <widget class="QPushButton" name="button">\n <property name="text">\n <string>Start</string>\n </property>\n </widget>\n </item>\n <item>\n <widget class="QLabel" name="label">\n <property name="text">\n <string>Hello, World</string>\n </property>\n <property name="alignment">\n <set>Qt::AlignCenter</set>\n </property>\n </widget>\n </item>\n </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\nRun Code Online (Sandbox Code Playgroud)\n主要.py
\nimport sys\nfrom PyQt5 import QtCore, QtGui, QtWidgets, uic\n\n\nclass Demo(QtWidgets.QWidget):\n def __init__(self):\n super(Demo, self).__init__()\n uic.loadUi("demo.ui", self)\n\n self.combo.currentIndexChanged.connect(self.change_func)\n\n self.trans = QtCore.QTranslator(self)\n\n options = [\n ("English", ""),\n ("fran\xc3\xa7ais", "eng-fr"),\n ("\xe4\xb8\xad\xe6\x96\x87", "eng-chs"),\n ]\n\n for i, (text, lang) in enumerate(options):\n self.combo.addItem(text)\n self.combo.setItemData(i, lang)\n self.retranslateUi()\n\n @QtCore.pyqtSlot(int)\n def change_func(self, index):\n data = self.combo.itemData(index)\n if data:\n self.trans.load(data)\n QtWidgets.QApplication.instance().installTranslator(self.trans)\n else:\n QtWidgets.QApplication.instance().removeTranslator(self.trans)\n\n def changeEvent(self, event):\n if event.type() == QtCore.QEvent.LanguageChange:\n self.retranslateUi()\n super(Demo, self).changeEvent(event)\n\n def retranslateUi(self):\n self.button.setText(QtWidgets.QApplication.translate("Demo", "Start"))\n self.label.setText(QtWidgets.QApplication.translate("Demo", "Hello, World"))\n\n\nif __name__ == "__main__":\n app = QtWidgets.QApplication(sys.argv)\n demo = Demo()\n demo.show()\n sys.exit(app.exec_())\nRun Code Online (Sandbox Code Playgroud)\n然后生成.ts:
\npylupdate5 main.py -ts eng-chs.ts\npylupdate5 main.py -ts eng-fr.ts\nRun Code Online (Sandbox Code Playgroud)\n然后使用 Qt Linguist 进行翻译。
\n最后是.qm:
\nlrelease eng-fr.ts eng-fr.qm\nlrelease eng-chs.ts eng-chs.qm\nRun Code Online (Sandbox Code Playgroud)\n另一方面,如果您使用 pyuic5 来转换 .py 那么如果实现了 retranslateUi 方法,那么您可以使用它:
\npyuic5 demo.ui -o demo_ui.py\npylupdate5 demo_ui.py -ts eng-chs.ts\npylupdate5 demo_ui.py -ts eng-fr.ts\nRun Code Online (Sandbox Code Playgroud)\n然后使用 Qt Linguist 进行翻译。
\n最后是.qm:
\nlrelease eng-fr.ts eng-fr.qm\nlrelease eng-chs.ts eng-chs.qm\nRun Code Online (Sandbox Code Playgroud)\n主要.py
\npylupdate5 main.py -ts eng-chs.ts\npylupdate5 main.py -ts eng-fr.ts\nRun Code Online (Sandbox Code Playgroud)\n