1. 程式人生 > 實用技巧 >QT 國際化不完全

QT 國際化不完全

遇到的問題如下圖所示

明明已經完成了全部的翻譯工作,但是在介面初始化之後這個介面就是死活不能翻譯成英文。

找了半天的原因,後來終於發現問題所在。

由於這個設定介面是一個靜態的單例物件,而且這個設定視窗在主程式視窗初始化的時候就被主程式構造器分配了記憶體地址建立了出來,所以這個視窗就是隨著主程式的開始而誕生,隨著主程式的結束被被銷燬,期間是一直存在的。在主程式構造器中,我添加了根據登錄檔資訊來確定初始化語言設定的程式碼,即在構造器中讀取登錄檔,根據登錄檔設定介面是英文還是中文的程式碼。

這裡十分地重要,問題也就是出現在這個地方。由於之前的構造器中的相關程式碼是這樣的

    mylanguage=myset.value("
language").toInt();//讀取登錄檔中的語言設定的值 set_dialog=SetDialog::getinstance(this);//這是一個靜態的單利物件,這句程式碼必須放在serlanguage()函式的後面,否則設定視窗在初試設定為英文的情況下不會被翻譯為英文 setlanguage(mylanguage);//根據登錄檔中來設定語言

就會出現前面截圖中的情況

這是由於程式中的介面的翻譯工作必須要在所有介面都被建立之前完成,不能在介面生成了之後才執行,也就是說在執行翻譯工作的程式碼執行完成之前就已經生成的介面是不會被翻譯到的!

同理,根據我前面說的那樣,這個設定介面是一個靜態的單例視窗,所以在程式執行的過程中,如果再次點選按鈕進行中英文的切換的話,這個介面仍然不會被翻譯到!


那怎麼辦?

其實也很簡單,只需要在點選按鈕之後,傳送一個訊號,再設計一個槽函式來反應這個訊號就行了,槽函式的內容也很簡單,只需要新增一句程式碼

ui->retranslateUi(this);

由於主程式中已經重新裝載了語言包,所以只需要手動通知這個介面更新翻譯文字就行了,通過訊號槽的機制,哪怕有多個這樣的視窗物件,也不用擔心不能動態轉化的問題。

還需要注意的一點就是,ui->retranslateUi(this);一定要在語言包重新載入了之後再執行,否則依然不會翻譯成功。總之需要特別注意順序就對了。