参考文献:《Qt Creator 快速入门》第三版 霍亚飞编著
一、国际化
Qt可以使用Qt Linguist工具完成应用程序的翻译工作,生成.qm文件,然后在不同情况下为应用程序安装不同qm文件,实现不同环境不同语言版本。
新建Qt Widget应用。在设计模式下添加"&File“菜单,再为其添加一个”&New"子菜单,并设置快捷键Ctrl+N.然后在构造函数中添加以下代码。
QLabel* label=new QLabel(this);
label->setText(tr("hello Qt"));
label->move(100,50);
QLabel* label2=new QLabel(this);
label->setText(tr("password","mainwindow"));
label->move(100,80);
QLabel* label3=new QLabel(this);
int id=123;
QString name=tr("yafei");
label3->setText(tr("ID is %1,Name is %2").arg(id).arg(name));
label3->resize(150,12);
label3->move(100,120);
国际化的个步骤
1、对所有用户可见的文本使用tr()函数如上面代码。
2、更改项目文件,在最后添加以下代码,其中myI18N_zh_CN.ts为要生产的ts文件名
TRANSLATIONS = myI18N_zh_CN.ts
3、 使用lupdate生产myI18N_us_CN.ts文件。
选择“工具-》外部-》Qt语言家-》更新翻译(lupdate).运行后生产ts文件
4、使用Qt Linguist完成翻译。
电脑开始菜单-》Qt5.9.9下面的Linguist5.9.9启动。打开刚才的ts文件,界面如下图,逐条完成翻译。注意每完成一个翻译要按下Ctrl+Return。
5、使用lrelease生成.qm文件。
在Qt Linguist中使用“文件-》发布”生产myI18N_us_CN.qm文件。也可以使用Qt Creator中的”工具-》外部-》Qt语言家“来完成发布
6、使用.qm文件。
main.cpp的main函数中修改代码如下。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator translator;
translator.load("../myI18N/myI18N_zh_CN.qm");
a.installTranslator(&translator);
MainWindow w;
w.show();
return a.exec();
}
运行效果如下
二、创建Qt插件
1、创建插件
新建Empty qmake Project,名称为plugin。
下面的demo是创建一个过滤字符串中第一个数字的插件,并使用它。
第一步,定义插件类。
往项目中添加C++类,类名为RegExpPlugin。之后将regexpplugin.h改为如下所示。
#ifndef REGEXPPLUGIN_H
#define REGEXPPLUGIN_H
#include <QObject>
#include "regexpinterface.h"
class RegExpPlugin:public QObject,RegExpInterface
{
Q_PLUGIN_METADATA(IID"org.qter.Examples.myplugin.RegexpInterface" File "myplugin.json")
Q_INTERFACES(RegExpInterface)
public:
QString regexp(const QString &message);
};
#endif // REGEXPPLUGIN_H
为了使这个类作为一个插件,它需要同时继承自QObject和RegExpInterfaace。RegExpInterfaace是接口类,用来指明插件要实现的功能。接口类只包含纯虚函数。RegExpInterfaace接口类在regexpinterface.h文件中定义。regexpinterface.h文件在后面要使用插件的项目中。现在把这两个项目放在了同一目录。
Q_PLUGIN_METADATA声明插件的元数据,其中必须指明IID标识符,标志符是具有唯一性的字符串。FILE是格式的插件元数据文件,参数可选,其命名一般使用项目名,内容一般只包含一组大括号。
Q_INTERFACES,使用该宏将接口注册到Qt元对象系统中。最后声明接口中定义的纯虚函数regexp。
第二步,导出插件
导出插件即实现接口类的纯虚函数。更改regexpplugin.cpp文件如下。注意一定要有Q_OBJECT这个宏
#ifndef REGEXPPLUGIN_H
#define REGEXPPLUGIN_H
#include <QObject>
#include "regexpinterface.h"
class RegExpPlugin:public QObject,RegExpInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID"org.qter.Examples.myplugin.RegExpInterface" FILE"myplugin.json")
Q_INTERFACES(RegExpInterface)
public:
virtual QString regexp(const QString &message);
};
#endif // REGEXPPLUGIN_H
第三步、更改项目文件
更改.pro文件内容如下
TEMPLATE = lib
CONFIG +=plugin
INCLUDEPATH +=../regexpwindow
HEADERS = regexpplugin.h
SOURCES = regexpplugin.cpp
TARGET = regexpplugin
DESTDIR = ../plugins
TEMPLATE = lib表明该项目要构建库文件,CONFIG +=plugin告知qmake要创建一个插件。INCLUDEPATH +=../regexpwindow将包含接口类的路径添加进来。TARGET和DESTDIR分别指明了生成的dll文件的名字和路径。
2、使用插件扩展应用程序
新建Qt Widget应用,名称为regexpwindow,路径和前面的plugin项目同一个路径,基类选择Widget,其他保持默认不变。
第一步,定义接口
向项目中添加c++头文件,名字为regexpinterface.h,更改内容如下
#ifndef REGEXPINTERFACE_H
#define REGEXPINTERFACE_H
#include <QString>
#include <QtPlugin>
class RegExpInterface
{
public:
virtual ~RegExpInterface(){}
virtual QString regexp(const QString &message)=0;
};
Q_DECLARE_INTERFACE(RegExpInterface,"org.qter.Examples.myplugin.RegExpInterface")
#endif // REGEXPINTERFACE_H
第二步,加载插件
先进入设计模式设计界面如下,其中显示“无”的objectName改为labelNum。
进入widget.h,添加文件包含#include "regexpinterface.h",定义一个接口对象指针,声明一个加载插件函数,如下
RegExpInterface* interface;
bool loadPlugin();
然后在widget.cppc中实现加载插件的函数,如下
bool Widget::loadPlugin()
{
QDir pluginsDir("../plugins");
//遍历插件目录
foreach(QString fileName,pluginsDir.entryList(QDir::Files))
{
QPluginLoader pluginLoder(pluginsDir.absoluteFilePath(fileName));
QObject* plugin=pluginLoder.instance();
if(plugin)
{
interface=qobject_cast<RegExpInterface*>(plugin);
if(interface)
return true;
}
}
return false;
}
在构造函数中调用加载插件函数,代码如下
if(!loadPlugin())
{
QMessageBox::information(this,"Error","Could not load the plugin");
ui->lineEdit->setEnabled(false);
ui->pushButton->setEnabled(false);
}
最后实现“过滤”按钮的click响应槽函数,代码如下
void Widget::on_pushButton_clicked()
{
QString str=interface->regexp(ui->lineEdit->text());
ui->labelNum->setText(str);
}
第三步,运行程序
先构建创建插件的项目,创建完成后,会生成dll文件如下
然后运行regexpwindow项目,结果如下