Qt Designer 및 PyQt5를 사용하여 다국어 데스크톱 앱을 만들고 있습니다. 내 앱이 언어를 동적으로 변경하도록 이 답변 을 따르고 있습니다.
Qt Designer를 통해 .ui 파일을 만들었고 loadUi 를 통해 Python 코드에서 UI를 직접로드하고 있습니다 . 따라서, 함수 retranslateUi가 달리 ui.file 내에서 설명 retranslateUi의 상기 링크 기능 (파이썬 코드에 존재한다). 버튼과 레이블이 많기 때문에 설명 된 함수를 파이썬 코드에 넣고 싶지 않습니다. 이 함수를 코드에서 사용하고 .ui 파일에만 보관하려면 어떻게해야합니까?
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_())
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다