动态语言切换(续)-designer中的retranslateUi(带源码)

前篇动态语言切换文中提到了动态切换语言的一点技巧。其实在desigener设计UI的时候也考虑到了这一点。

在将xxx.ui文件转换为ui_xxx.h文件的系统,uic工具为.h文件添加了retranslateUi(QWidget *) 这样的一个函数,就是专门做的一个重新设>置翻译文件的操作,不需要关闭或者隐藏任何一个窗体。

我们来看一个简单的hello.ui文件

 

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>LangForm</class>
<widget class="QWidget" name="LangForm">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>378</width>
<height>110</height>
</rect>
</property>
<property name="windowTitle">
<string>Lang Switch</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="EnButton">
<property name="text">
<string>Display English</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="CnButton">
<property name="text">
<string>Display Chinese</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

这个文件在一个QWidget和两个QPushButton里都有和text相关的属性。我们来看这3个text在ui_hello.h中retranslateUi()函数中是怎样的

void retranslateUi(QWidget *LangForm)
{
    LangForm->setWindowTitle(
        QApplication::translate("LangForm", "Lang Switch", 0, QApplication::UnicodeUTF8));
    EnButton->setText(
        QApplication::translate("LangForm", "Display English", 0, QApplication::UnicodeUTF8));
    CnButton->setText(
        QApplication::translate("LangForm", "Display Chinese", 0, QApplication::UnicodeUTF8));
    Q_UNUSED(LangForm);
} // retranslateUi

所以在写动态语言切换程序时,只要把翻译语言加载进来,然后再调用retranslateUi()函数就可以实现用designer设计ui文件的动态无缝切换
了。

演示代码如下: hello.ui文件前面贴过,不再重复

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "ui_hello.h"

class Widget:public QWidget,public Ui::LangForm
{
Q_OBJECT
public:
    Widget(QWidget *parent=0);
private slots:
    void loadChinese();
    void loadEnglish();
private:
    bool lang_is_english;
};

#endif
//widget.cpp
#include <QtGui>
#include "widget.h"

Widget::Widget(QWidget *parent)
:QWidget(parent)
{
    setupUi(this);
    connect(CnButton,SIGNAL(clicked()),SLOT(loadChinese()));
    connect(EnButton,SIGNAL(clicked()),SLOT(loadEnglish()));
    lang_is_english=true;
}

void Widget::loadChinese()
{
    if(!lang_is_english)
    return;
    QTranslator translator;
    translator.load("i18n_zh");
    qApp->installTranslator(&translator);
    lang_is_english=false;
    retranslateUi(this);
}

void Widget::loadEnglish()
{
    if(lang_is_english)
    return;
    QTranslator translator;
    qApp->installTranslator(&translator);
    lang_is_english=true;
    retranslateUi(this);
}
//main.cpp
#include <QApplication>
#include <QWidget>

#include "widget.h"

int main(int argc, char *argv[])
{
    QApplication app(argc,argv);

    Widget *ww=new Widget;
    ww->show();

    return app.exec();
}
//i18n.pro
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += widget.h
FORMS += hello.ui
SOURCES += main.cpp widget.cpp
TRANSLATIONS += i18n_zh.ts
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'aaa.ui' # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! import sys, os from PyQt5 import QtCore, QtWidgets, QtGui from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5 import QtCore, QtGui, QtWidgets class U_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1204, 836) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.tableWidget = QtWidgets.QTableWidget(self.centralwidget) self.tableWidget.setGeometry(QtCore.QRect(80, 240, 1041, 371)) self.tableWidget.setAutoScrollMargin(9) self.tableWidget.setRowCount(9) self.tableWidget.setColumnCount(8) self.tableWidget.setObjectName("tableWidget") item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(2, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(3, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(4, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(5, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(6, item) item = Q

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值