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

2022年01月13日 阅读数:2
这篇文章主要向大家介绍个人QT Creator学习笔记(二十一)——Qt国际化和Qt插件,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

参考文献:《Qt Creator 快速入门》第三版 霍亚飞编著c++

1、国际化

Qt可使用Qt Linguist工具完成应用程序的翻译工做,生成.qm文件,而后在不一样状况下为应用程序安装不一样qm文件,实现不一样环境不一样语言版本。json

新建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);

国际化的个步骤 函数

一、对全部用户可见的文本使用tr()函数如上面代码。工具

二、更改项目文件,在最后添加如下代码,其中myI18N_zh_CN.ts为要生产的ts文件名ui

TRANSLATIONS = myI18N_zh_CN.ts

三、 使用lupdate生产myI18N_us_CN.ts文件。this

选择“工具-》外部-》Qt语言家-》更新翻译(lupdate).运行后生产ts文件插件

四、使用Qt Linguist完成翻译。翻译

电脑开始菜单-》Qt5.9.9下面的Linguist5.9.9启动。打开刚才的ts文件,界面以下图,逐条完成翻译。注意每完成一个翻译要按下Ctrl+Return。设计

五、使用lrelease生成.qm文件。

在Qt Linguist中使用“文件-》发布”生产myI18N_us_CN.qm文件。也可使用Qt Creator中的”工具-》外部-》Qt语言家“来完成发布

 

六、使用.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();
}

 运行效果以下

2、建立Qt插件

     一、建立插件

      新建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文件的名字和路径。

二、使用插件扩展应用程序

新建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项目,结果以下