Есть ли способ использовать retreanslateUi в коде Python, пока функция описывается в файле .ui?

Я создаю многоязычное настольное приложение, используя Qt Designer и PyQt5. Я следую этому ответу, чтобы мое приложение динамически меняло языки.

Я создал файл .ui с помощью Qt Designer и загружаю пользовательский интерфейс непосредственно в код Python с помощью loadUi. Поэтому функция retranslateUi описана в моем ui.file, в отличие от функции retranslateUi по ссылке выше (она присутствует в коде Python). Я не хотел бы помещать описанную функцию в код Python, потому что там много кнопок и меток. Как я могу использовать эту функцию в своем коде и сохранить ее только в файле .ui?


person sunflower    schedule 05.11.2020    source источник


Ответы (1)


uic.loadUi

Если вы используете метод loadUi, он не реализует метод retranslateUi, поэтому, если вы используете этот метод, решение будет таким же, как и в предыдущем посте.

demo.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>

main.py

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

main.py

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_())
person eyllanesc    schedule 05.11.2020