您的位置:首页 > 产品设计 > UI/UE

Qt GUI设计 界面语言动态切换(1)

2012-07-30 17:14 666 查看
今天写个用Qtdesigner设计器设计的界面实现语言动态切换,程序的界面如下



我想实现下拉语言选择的combox实现语言的切换,其实现的代码如下

.pro文件

TRANSLATIONS
=hellotr_CH.ts\

hellotr_EN.ts

QT+=coregui


TARGET=hellotr

TEMPLATE=app



SOURCES+=main.cpp\

dialog.cpp


HEADERS+=dialog.h


FORMS+=dialog.ui




OTHER_FILES+=\

hellotr_EN.qm\

hellotr_CH.qm



做了两个语言文件,一个英文-英文,一个英文-中文。

在建好工程,程序代码写完后编译会在工程的源文件目录下生成两个文件hellotr_CH.ts\

hellotr_EN.ts

在Qtcreator中工具->外部->Qt预言家,更新lupdate,后

打开Qt库的bin文件夹中有个可执行文件linguist,在这个软件中打开上面的两个文件,翻译,最后保存,发布,编译工程后,工具->外部->Qt语言家,release发布,只执行程序

注意:*.qm文件要拷贝到build目录下执行

voidDialog::switchlanguage(int
flag)

{

qDebug("flag=%d",flag);

QTranslatortranslator(qApp);

boolb=false;

if(flag==0)

{

//chinese


b=translator.load("hellotr_CH.qm");

if(b==false)

qDebug("loaderr!");

else

qDebug("chineseloadok");

qApp->installTranslator(&translator);

//this->ui->retranslateUi(this);

}

elseif(flag==1)

{

//english

b=translator.load("hellotr_EN.qm");

if(b==false)

qDebug("loaderr!");

else

qDebug("englishloadok");

qApp->installTranslator(&translator);

this->ui->retranslateUi(this);

}


}


voidDialog::to_chinese(void){
qDebug("tochineseclicked");
QTranslatortranslator(qApp);
boolb=false;
b=translator.load("hellotr_CH.qm");
if(b==false)
qDebug("loaderr!");
else
qDebug("chineseloadok");
qApp->installTranslator(&translator);
this->ui->retranslateUi(this);
}
voidDialog::to_english(void)
{
qDebug("to_englishclicked");
QTranslatortranslator(qApp);
boolb=false;
b=translator.load("hellotr_EN.qm");
if(b==false)
qDebug("loaderr!");
else
qDebug("englishloadok");
qApp->installTranslator(&translator);
this->ui->retranslateUi(this);
}

早构造函数中已经定义的槽函数连接

connect(this->ui->pushButton_chinese,SIGNAL(clicked()),SLOT(to_chinese()));

connect(this->ui->pushButton_english,SIGNAL(clicked()),this,SLOT(to_english()));

connect(this->ui->comboBox,SIGNAL(currentIndexChanged(int)),SLOT(switchlanguage(int)));

当我点击界面的英语,或者汉语时可以切换到英语或者汉语,但是当用combox来切换语言不能执行,不知道为什么

现象是我选择英语后它会显示英语那个文档加载成功,但是紧接着combox回到index为-1,0,接着测试,在点击按钮的时候也会这样,输出

tochineseclicked

chineseloadok
flag=-1
flag=0
最后一句句屏蔽发现是this->ui->retranslateUi(this)这句话引起的,

追踪这个函数

voidretranslateUi(QDialog
*Dialog)

{

Dialog->setWindowTitle(QApplication::translate("Dialog","Dialog",0,QApplication::UnicodeUTF8));

pushButton->setText(QApplication::translate("Dialog","hello",0,QApplication::UnicodeUTF8));

pushButton_2->setText(QApplication::translate("Dialog","close",0,QApplication::UnicodeUTF8));

comboBox->clear();

comboBox->insertItems(0,QStringList()

<<QApplication::translate("Dialog","chinese",0,QApplication::UnicodeUTF8)

<<QApplication::translate("Dialog","english",0,QApplication::UnicodeUTF8)

);


constbool__sortingEnabled=listWidget->isSortingEnabled();

listWidget->setSortingEnabled(false);

QListWidgetItem*___qlistwidgetitem=listWidget->item(0);

___qlistwidgetitem->setText(QApplication::translate("Dialog","item1",0,QApplication::UnicodeUTF8));

QListWidgetItem*___qlistwidgetitem1=listWidget->item(1);

___qlistwidgetitem1->setText(QApplication::translate("Dialog","item2",0,QApplication::UnicodeUTF8));

QListWidgetItem*___qlistwidgetitem2=listWidget->item(2);

___qlistwidgetitem2->setText(QApplication::translate("Dialog","item3",0,QApplication::UnicodeUTF8));

QListWidgetItem*___qlistwidgetitem3=listWidget->item(3);

___qlistwidgetitem3->setText(QApplication::translate("Dialog","item4",0,QApplication::UnicodeUTF8));

listWidget->setSortingEnabled(__sortingEnabled);


pushButton_english->setText(QApplication::translate("Dialog","to_english",0,QApplication::UnicodeUTF8));

pushButton_chinese->setText(QApplication::translate("Dialog","to_chinese",0,QApplication::UnicodeUTF8));

}//retranslateUi

再看看combox函数


voidQComboBox::currentIndexChanged(intindex)[signal]

ThissignalissentwheneverthecurrentIndexinthecomboboxchangeseitherthroughuserinteractionorprogrammatically.
Theitem'sindexispassedor-1ifthecomboboxbecomesemptyorthecurrentIndexwas
reset.


voidQComboBox::activated(intindex)[signal]

Thissignalissentwhentheuserchoosesaniteminthecombobox.Theitem'sindexispassed.Notethatthissignalissentevenwhenthechoiceisnotchanged.Ifyouneedtoknowwhenthechoiceactuallychanges,usesignalcurrentIndexChanged().

原因应该是在于

comboBox->insertItems(0,
QStringList()

<<QApplication::translate("Dialog","chinese",0,QApplication::UnicodeUTF8)

<<QApplication::translate("Dialog","english",0,QApplication::UnicodeUTF8)

);

但是具体的我不知道怎么办

无奈,最后换成


activated(intindex)

信号,程序可以运行了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: