问题

Qt 中有很多控件都支持右键点击显示菜单,比如QLineEdit 、 QTextEdit ,QSpinBox 、 QTextBrowser 等控件右击都会显示菜单, 但是默认菜单文字都是英文,当然我们也可以屏蔽菜单, 也可以显示,要是显示中文的话就要加载另外的翻译文件

对于QLineEditQScrollBar QSpinBox 等控件需要加载qt_zh_CN.qm翻译文件,这个文件在Qt的安装目录的translations文件夹下。

对于QTextEditQPlainTextEdit QTextBrowser 等控件需要加载qt_zh_CN**.qm翻译文件,在Qt**的安装目录中找不到此文件,需要自己生成。

Qt 在通过加载安装目录的translations文件夹下qt_zh_CN.qm翻译文件无法解决QTextEditQPlainTextEditQTextBrowser 等控件的右键翻译失效问题。

问题分析

qt_zh_CN.qmQTextEdit归属于QTextControl,而qtbase中生成的QTextEdit归属于QWidgetTextControl因此翻译失效。
Qt 中控件右击菜单的翻译 - 图1

解决办法

打开qt-everywhere-opensource-src\qtbase\src\widgets目录,用Qt Creator打开widgets.pro文件,添加一行:
TRANSLATIONS += zh_CN.ts
然后在Qt Creator的系统菜单中,选择:工具->外部->Qt语言家->更新翻译,就会在widgets.pro所在目录下生成一个zh_CN.ts文件,用Qt Linguist打开zh_CN.ts,找到QWidgetTextControl,翻译相关选项,然后选择:文件->发布,就会在zh_CN.ts所在目录生产一个zh_CN.qm文件,将zh_CN.qm文件放入资源文件下,然后在main函数中加载

  1. QTranslator p;
  2. p.load(":/zh_CN.qm");
  3. a.installTranslator(&p);

即可解决。

其他

关于在控件中右键点击显示菜单,这里主要是contextMenuPolicy这个属性来控制。如果不想显示菜单可以设置为NoContextMenu,这样就屏蔽了右击显示菜单功能,也可以通过在contextMenuEvent(QContextMenuEvent * e)事件中进行处理。