哪位高手VS菜鸟能给小弟我个VS下创建的QT工程DEMO,是关于QT国际化的

&&&&Qt开源的飞信,没能看懂
Qt开源的飞信,没能看懂
Qt开源的飞信,没能看懂.请那个高手看懂后能写出一个简单的Qt的飞信库.希望到时能给小弟我共享一下.
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
移动开发下载排行VS 下Qt工程不能生成moc文件的处理办法 - 其他综合 - 红黑联盟
Item Type:将此项改为Custom Build Tool,然后看到左边会变成Custom Build Tool:选择Custom Build Tool->General:类比其他头文件添加指令和输出路
VS 下Qt工程不能生成moc文件的处理办法
选择要moc的类的头文件,鼠标右键,选择property-&Item Type:将此项改为Custom Build Tool,
然后看到左边会变成Custom Build Tool:
选择Custom Build Tool-&General:类比其他头文件添加指令和输出路径:
Command Line:&$(QTDIR)\bin\moc.exe&
&%(FullPath)& -o &.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp&
-DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB
&-I.\GeneratedFiles& &-I.& &-I$(QTDIR)\include& &-I.\GeneratedFiles\$(ConfigurationName)\.& &-I$(QTDIR)\include\QtCore& &-I$(QTDIR)\include\QtGui& &-I$(QTDIR)\include\QtWidgets& &-I.\..\SDK\boost& &-I.\..\inc&
outputs:.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
Additional dependencies:$(QTDIR)\bin\moc.%(FullPath)FinderCheng 的BLOG
用户名:FinderCheng
文章数:123
评论数:1023
访问量:4066234
注册日期:
阅读量:24883
阅读量:251704
阅读量:992053
阅读量:146207
51CTO推荐博文
2D绘图部分基本告一段落,还在想下面的部分要写什么,本来计划先说下view-model的相关问题,但是前面看到有朋友问关于国际化的问题,所以现在先来说说Qt的国际化吧!
Qt中的国际化的方法有很多,常用的有使用QTextCodec类和使用tr()函数。前者将编码名称写到代码里面,除非你使用Unicode编码,否则国际化依然是一个问题;后者就不会有这个问题,并且这也是Qt推荐的做法。因此,我们主要来说使用tr()函数的方法进行应用程序的国际化。
我们先来看一个很简单的MainWindow。为了清楚起见,这里只给出了cpp文件的内容:
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />#include "mainwindow.h" 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" /> 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />MainWindow::MainWindow(QWidget *parent) 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&: QMainWindow(parent) 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />{ 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&QMenuBar *menuBar = new QMenuBar(this); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&QMenu *fileMenu = new QMenu(tr("&File"), menuBar); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&QAction *newFile = new QAction(tr("&New..."), fileMenu); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&fileMenu-&addAction(newFile); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&QAction *openFile = new QAction(tr("&Open..."), fileMenu); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&fileMenu-&addAction(openFile); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&menuBar-&addMenu(fileMenu); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&setMenuBar(menuBar); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" /> 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&connect(openFile, SIGNAL(triggered()), this, SLOT(fileOpen())); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />} 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" /> 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />MainWindow::~MainWindow() 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />{ 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" /> 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />} 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" /> 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />void MainWindow::fileOpen() 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />{ 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&QFileDialog *fileDialog = new QFileDialog(this); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&fileDialog-&setWindowTitle(tr("Open File")); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&fileDialog-&setDirectory("."); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&if(fileDialog-&exec() == QDialog::Accepted) { 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&&&&&&&&&QString path = fileDialog-&selectedFiles()[0]; 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&&&&&&&&&QMessageBox::information(NULL, tr("Path"), tr("You selected\n%1").arg(path)); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&} else { 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&&&&&&&&&QMessageBox::information(NULL, tr("Path"), tr("You didn't select any files.")); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&} 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />}
这是一个很简单的类,运行结果想必大家也都非常清楚:就是一个主窗口,上面有一个菜单栏,一个File菜单,里面有两个菜单项:
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' border="0" alt="" src="/attachment/648328.png" />
之所以把运行图贴出来,是为了大家能够看清,在代码中的&符号实际在界面中显示成为一条下划线,标记出这个菜单或者菜单项的快捷键。按照代码,当我们点击了Open时,会弹出一个打开文件的对话框:
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' border="0" alt="" src="/attachment/776328.png" />
这里的slot里面的代码在前文中已经详细介绍过。也许你会问,为什么要用这种麻烦的写法呢?因为我们曾经说过,使用static函数实际上是直接调用系统的对话框,而这种构造函数法是Qt自己绘制的。这对我们后面的国际化是有一定的影响的。
好了,都已经准备好了,下面开始进行国际化。所谓国际化,实际上不仅仅是把界面中的各种文字翻译成另外的语言,还有一些工作是要进行书写方式、货币等的转换。比如,阿拉伯书写时从右向左的,这些在国际化工作中必须完成。但是在这里,我们只进行最简单的工作,就是把界面的文字翻译成中文。
首先,我们需要在pro文件中增加一行:
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />TRANSLATIONS += myapp.ts
myapp.ts是我们需要创建的翻译文件。这个文件的名字是任意的,不过后缀名需要是ts。然后我们打开命令提示符,进入到工程所在目录,比如我的是E:\My Documents\Workspace\Qt\MyApp,也就是pro文件所在的文件夹,然后输入命令
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />lupdate MyApp.pro
,如果你出现的是命令不存在,请注意将Qt的bin目录添加到环境变量中。此时,如果更新的数目,说明ts文件创建成功:
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' border="0" alt="" src="/attachment/643718.png" />
最后一行是说,找到7个需要翻译的原文字,0个已经存在。也就是说,这个文件是新建的。这时你会在工程目录下找到这个myapp.ts文件。也许你会奇怪,为什么这里还会说已存在的数目呢?因为Qt这个工具很智能的能够识别出已经存在的文字和修改或新增的文字,这样在以后的工作中就不需要一遍遍重复翻译以前的文字了。这也就是为什么这个工具的名字是“lupdate”的原因,因为它是“update”,而不仅仅是生成。
如果你有兴趣的话,可以用记事本打开这个ts文件,这个文件实际上是一个XML文件,结构很清晰。不过,我们要使用专业的翻译工具进行翻译。Qt提供了一个工具,Qt Linguist,你可以在开始菜单的Qt项下面的Tools中找到。用它可以打开我们的ts文件,然后进行我们的翻译工作:
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' border="0" alt="" src="/attachment/216390.png" />
完全翻译完成后保存文件,然后在文件菜单下有个“发布”。点击这个按钮,工程目录下会有一个myapp.qm文件,这就是我们翻译得到的文件。Qt的qm文件实际上是二进制格式的,因此它经过了高度的优化,体积很小。
下面我们要修改main()函数,使之加载这个qm文件:
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />int main(int argc, char *argv[]) 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />{ 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&QApplication a(argc, argv); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&QTranslator qtT 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&qtTranslator.load("myapp.qm"); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&a.installTranslator(&qtTranslator); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&MainW 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&w.resize(800, 600); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&w.show(); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&return a.exec(); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' align="top" src="http://devbean./images/editer/InBlock.gif" />}
注意,QTranslator类实际是在QtCore下面的。代码还是很清晰:创建一个QTranslator对象,然后加载qm文件,然后将这个对象安装到QApplication类。好了,现在大功告成,重新编译后运行下程序吧!
咦?怎么还是英文的?哪里有错误了呢?这里往往令人疑惑,其实,这是由于我们使用load()函数加载qm文件时使用的是相对路径,这样直接load(“myapp.qm”),其实会在当前编译后的exe所在目录下寻找这个qm文件,所以,只要我们把qm文件同exe放在同一目录下,再次运行:
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' border="0" alt="" src="/attachment/783328.png" />
现在,这个界面已经是中文了吧!其实,这一小细节已经说明,qm文件其实是动态加载到exe文件中的,而不是直接编译进去的。这一点为我们进行动态切换语言提供了基础。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
本文收录至博客专题:《》
13:44:51 14:39:45 17:18:47 00:10:46 12:03:34 12:14:58 19:35:02 21:48:52 16:50:55 16:51:48 17:06:22 17:41:48 13:24:11 14:20:12 18:58:49 10:05:58 13:12:06 10:14:43 14:36:37 09:09:39 &&1&
&&页数 ( 1/2 ) &}

我要回帖

更多关于 高手VS菜鸟 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信