首页 > 解决方案 > 有没有办法在 .ui 文件中描述函数时在 python 代码中使用 retreanslateUi ?

问题描述

我正在使用 Qt Designer 和 PyQt5 创建一个多语言桌面应用程序。我正在关注这个答案以使我的应用程序动态更改语言。

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

标签: pyqt5qt-designerqt-linguist

解决方案


uic.loadUi

如果您使用 loadUi 方法,它不会实现 retranslateUi 方法,因此如果您使用该方法,则解决方案与上一篇文章相同。

演示.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Demo</class>
 <widget class="QWidget" name="Demo">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>102</width>
    <height>108</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="QComboBox" name="combo"/>
   </item>
   <item>
    <widget class="QPushButton" name="button">
     <property name="text">
      <string>Start</string>
     </property>
    </widget>
   </item>
   <item>
    <widget class="QLabel" name="label">
     <property name="text">
      <string>Hello, World</string>
     </property>
     <property name="alignment">
      <set>Qt::AlignCenter</set>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

主文件

import sys
from PyQt5 import QtCore, QtGui, QtWidgets, uic


class Demo(QtWidgets.QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        uic.loadUi("demo.ui", self)

        self.combo.currentIndexChanged.connect(self.change_func)

        self.trans = QtCore.QTranslator(self)

        options = [
            ("English", ""),
            ("français", "eng-fr"),
            ("中文", "eng-chs"),
        ]

        for i, (text, lang) in enumerate(options):
            self.combo.addItem(text)
            self.combo.setItemData(i, lang)
        self.retranslateUi()

    @QtCore.pyqtSlot(int)
    def change_func(self, index):
        data = self.combo.itemData(index)
        if data:
            self.trans.load(data)
            QtWidgets.QApplication.instance().installTranslator(self.trans)
        else:
            QtWidgets.QApplication.instance().removeTranslator(self.trans)

    def changeEvent(self, event):
        if event.type() == QtCore.QEvent.LanguageChange:
            self.retranslateUi()
        super(Demo, self).changeEvent(event)

    def retranslateUi(self):
        self.button.setText(QtWidgets.QApplication.translate("Demo", "Start"))
        self.label.setText(QtWidgets.QApplication.translate("Demo", "Hello, World"))


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

然后生成.ts:

pylupdate5 main.py  -ts eng-chs.ts
pylupdate5 main.py  -ts eng-fr.ts

然后使用 Qt Linguist 进行翻译。

最后是.qm:

lrelease eng-fr.ts eng-fr.qm
lrelease eng-chs.ts eng-chs.qm

皮尤克

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

pyuic5 demo.ui -o demo_ui.py
pylupdate5 demo_ui.py  -ts eng-chs.ts
pylupdate5 demo_ui.py  -ts eng-fr.ts

然后使用 Qt Linguist 进行翻译。

最后是.qm:

lrelease eng-fr.ts eng-fr.qm
lrelease eng-chs.ts eng-chs.qm

主文件

import sys
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from demo_ui import Ui_Demo

class Demo(QtWidgets.QWidget, Ui_Demo):
    def __init__(self):
        super(Demo, self).__init__()
        self.setupUi(self)

        self.combo.currentIndexChanged.connect(self.change_func)

        self.trans = QtCore.QTranslator(self)

        options = [
            ("English", ""),
            ("français", "eng-fr"),
            ("中文", "eng-chs"),
        ]

        for i, (text, lang) in enumerate(options):
            self.combo.addItem(text)
            self.combo.setItemData(i, lang)
        self.retranslateUi(self)

    @QtCore.pyqtSlot(int)
    def change_func(self, index):
        data = self.combo.itemData(index)
        if data:
            self.trans.load(data)
            QtWidgets.QApplication.instance().installTranslator(self.trans)
        else:
            QtWidgets.QApplication.instance().removeTranslator(self.trans)

    def changeEvent(self, event):
        if event.type() == QtCore.QEvent.LanguageChange:
            self.retranslateUi(self)
        super(Demo, self).changeEvent(event)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

推荐阅读