有没有办法在 .ui 文件中描述函数的同时在 python 代码中使用 retreanslateUi ?

sun*_*wer 2 qt-designer pyqt5 qt-linguist

我正在使用 Qt Designer 和 PyQt5 创建多语言桌面应用程序。我正在遵循此答案以使我的应用程序动态更改语言。

我通过 Qt Designer 创建了一个 .ui 文件,并通过loadUi直接在 python 代码中加载 UI 。因此,函数retranslateUi在我的 ui.file 中进行了描述,与上面链接中的retranslateUi函数(它存在于 python 代码中)不同。我不想将所描述的函数放在 python 代码中,因为有很多按钮和标签。如何在我的代码中使用此函数并将其仅保留在 .ui 文件中?

eyl*_*esc 6

uic.loadUi

\n

如果您使用 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>\n
Run Code Online (Sandbox Code Playgroud)\n

主要.py

\n
import 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_())\n
Run Code Online (Sandbox Code Playgroud)\n

然后生成.ts:

\n
pylupdate5 main.py  -ts eng-chs.ts\npylupdate5 main.py  -ts eng-fr.ts\n
Run Code Online (Sandbox Code Playgroud)\n

然后使用 Qt Linguist 进行翻译。

\n

最后是.qm:

\n
lrelease eng-fr.ts eng-fr.qm\nlrelease eng-chs.ts eng-chs.qm\n
Run Code Online (Sandbox Code Playgroud)\n
\n

皮尤克

\n

另一方面,如果您使用 pyuic5 来转换 .py 那么如果实现了 retranslateUi 方法,那么您可以使用它:

\n
pyuic5 demo.ui -o demo_ui.py\npylupdate5 demo_ui.py  -ts eng-chs.ts\npylupdate5 demo_ui.py  -ts eng-fr.ts\n
Run Code Online (Sandbox Code Playgroud)\n

然后使用 Qt Linguist 进行翻译。

\n

最后是.qm:

\n
lrelease eng-fr.ts eng-fr.qm\nlrelease eng-chs.ts eng-chs.qm\n
Run Code Online (Sandbox Code Playgroud)\n

主要.py

\n
pylupdate5 main.py  -ts eng-chs.ts\npylupdate5 main.py  -ts eng-fr.ts\n
Run Code Online (Sandbox Code Playgroud)\n