我的QT Creator学习笔记(二十一)——Qt国际化和Qt插件

参考文献:《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项目,结果如下

 

 

 

 

     

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值