有没有办法在 .ui 文件中描述函数时在 python 代码中使用 retreaslateUi ? [英] Is there a way to use retreanslateUi in python code while the function being described in .ui file?

查看:39
本文介绍了有没有办法在 .ui 文件中描述函数时在 python 代码中使用 retreaslateUi ?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm creating a multilanguage desktop app using Qt Designer and PyQt5. I'm following this answer to make my app change languages dynamically.

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

I've created a .ui file via Qt Designer and I'm loading the UI directly in python code via loadUi. Therefore, the function retranslateUi is described in my ui.file unlike the retranslateUi function in link above (it is present in python code). I wouldn't like to put the described function in python code because there's a lot buttons and labels. How can I use this function in my code and to keep it only in .ui file?

推荐答案

uic.loadUi

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

uic.loadUi

If you use the loadUi method it doesn't implement the retranslateUi method so if you use that method then the solution is the same as the previous post.

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>

ma​​in.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 进行翻译.

Then use Qt Linguist to do the translations.

最后是 .qm:

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


pyuic

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


pyuic

On the other hand, if you are using pyuic5 to convert the .py then if the retranslateUi method is implemented so you can use it:

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 进行翻译.

Then use Qt Linguist to do the translations.

最后是 .qm:

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

ma​​in.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_())

这篇关于有没有办法在 .ui 文件中描述函数时在 python 代码中使用 retreaslateUi ?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆