一点一滴成长

导航

《QT Creator快速入门》第九章:国际化、帮助、Qt插件

1、国际化

   Qt国际化需要在代码中对显示的字符串调用tr()方法,完成代码编写后再进行相关的翻译工作。

2、帮助文档

  对话框标题栏上有一个"?"帮助图标,按下它就会进入"What's this"模式,我们可以在UI设计模式下右键对话框窗口选择“改变‘这是什么’”来对帮助对话框进行设计。我们还可以使用Qt Assistant来为程序添加一个类似下面的帮助文档:

 

3、Qt插件

  Qt插件(Qt Plugin)就是一个共享库(dll文件),可以使用它来进行一些功能的扩展。有两种方式来创建插件,一个是用来扩展Qt本身的高级API,如自定义风格、数据库驱动(通过子类化控件基类QStylePlugin、QSqlDriverPlugin重写一些函数并添加一个宏),另一个方式是用来扩展Qt应用程序的低级API。

  可以使用提升窗口部件的方法来在设计模式中使用自定义的部件,比如我们想要设计模式上的一个QPushButton变成从QPushButton派生的myButton类型,方法为右键按钮选择“提升为”->提升的类名称输入myButton->添加->提升。 

 ①、创建扩展Qt本身的插件

  可以在帮助中查看How to Create Qt Plugins关键字来了解怎样创建扩展Qt本身的插件,其中有一个风格插件的例子,用来扩展Qt风格(子类化控件基类QStylePlugin),效果如下所示:

    

 ②、创建扩展Qt应用程序插件

  创建Qt应用程序插件可以先创建一个Empty Project,然后在项目中添加插件类、接口类、然后配置.pro项目文件:

/******定义插件类RegExpPlugin,它需要继承自QObject和该插件所提供功能对应的接口类******/

//regexpplugin.h

#ifndef REGEXPPLUGIN_H
#define REGEXPPLUGIN_H

#include <QObject>
#include "regexpinterface.h"

class RegExpPlugin: public QObject, RegExpInterface
{
    Q_OBJECT
    Q_INTERFACES(RegExpInterface) //在Qt的元对象系统中注册该接口
#if QT_VERSION >= 0x050000 //Qt5使用Q_PLUGIN_METADATA宏
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QGenericPluginFactoryInterface" FILE "untitled18.json")
#endif // QT_VERSION >= 0x050000
public:
    RegExpPlugin(QObject *parent=0);
    virtual ~RegExpPlugin();

    QString regexp(const QString& str)override; //定义接口方法,该方法功能为获得指定字符串中第一个数字字符串
};

#endif // REGEXPPLUGIN_H


//regexpplugin.cpp

#include "regexpplugin.h"
#include <QRegExp>
#include <QtPlugin>

RegExpPlugin::RegExpPlugin(QObject *parent):QObject(parent)
{
}

RegExpPlugin::~RegExpPlugin(){}

QString RegExpPlugin::regexp(const QString& str)
{
    QRegExp rx("\\d+");
    rx.indexIn(str);
    QString s = rx.cap(0);
    return s;
}

#if QT_VERSION < 0x050000 //Qt4使用Q_EXPORT_PLUGIN2宏
Q_EXPORT_PLUGIN2(regexpplugin, RegExpPlugin) //导出该插件,第一个参数为插件名,第二个参数为插件类
#endif // QT_VERSION < 0x050000



/******添加接口(接口就是只包含纯虚函数的类),接口类中包含了插件要实现的函数,这里是regexp()方法******/

//regexpinterface.h

#ifndef REGEXPINTERFACE_H
#define REGEXPINTERFACE_H

#include <QString>
#include <QVariant>

class RegExpInterface
{
public:
    virtual ~RegExpInterface(){}
    virtual QString regexp(const QString& str) = 0;
};

Q_DECLARE_INTERFACE(RegExpInterface, "xsl.RegExpInterface/1.0") //将接口注册到Qt元对象系统

#endif // REGEXPINTERFACE_H



/******配置.pro项目文件******/

HEADERS += \
    regexpplugin.h \
    regexpinterface.h

SOURCES += \
    regexpplugin.cpp

QMAKE_CXXFLAGS += -std=c++11
CONFIG += c++11

TEMPLATE = lib #项目要构建的是库文件而不是exe

CONFIG += plugin #告知qmake要创建一个插件

TARGET = regexpplugin #生成的dll文件名,需要和插件类中Q_EXPORT_PLUGIN2宏的第一个参数相同

DESTDIR = ../plugins #生成dll文件所在的目录

#INCLUDEPATH += ../regexpwindow #添加包含目录
View Code

  使用插件扩展应用程序的话先将接口类头文件添加到项目中,然后使用QPluginLoader对象加载插件,再通过qobject_cast<>获得该接口,然后就可以使用该接口中的方法:

#include <QPluginLoader>
#include <QDir>

void testPlugin()
{
    QDir pluginDir("../plugins"); //打开dll文件所在目录
    foreach(QString fileName, pluginDir.entryList(QDir::Files))
    {
        QPluginLoader pluginLoader(pluginDir.absoluteFilePath(fileName)); //使用QPluginLoader加载插件
        QObject* plugin = pluginLoader.instance();
        if(nullptr != plugin)
        {
            RegExpInterface* regExpInterface = qobject_cast<RegExpInterface*>(plugin); // 获得插件的接口
            if(nullptr != regExpInterface)
            {
               auto numberStr = regExpInterface->regexp("abc123def"); //调用接口中的方法,"123"
            }
        }
    }
}
View Code

  Qt中的Tools分类中有一个综合使用插件扩展应用程序的示例程序Plug and Paint。

 ③、创建自定义的Qt Designer部件

  我们可以创建提供给Qt Designer使用的自定义部件,比如我们创建项目,选择“其他项目”中的“Qt设计师自定义控件”,控件类输入MyDesignerPlugin,基类选择默认的QWidget,其它也为默认,然后就可以通过修改MyDesignerPlugin类来设计自己的自定义部件,代码示例如下,然后我们编译生成Release版本的dll,将这个dll防止Qt安装目录的plugins下的designer目录下,这样我们在开始菜单中打开Qt Designer后就可以看到刚才自定义的部件了,如下图:

#include "mydesignerplugin.h"
#include <QPushButton>
#include <QHBoxLayout>

MyDesignerPlugin::MyDesignerPlugin(QWidget *parent) :
    QWidget(parent)
{
    QPushButton* btn1 = new QPushButton(this);
    QPushButton* btn2 = new QPushButton(this);
    btn1->setText("hello");
    btn2->setText("Qt");
    QHBoxLayout* layout = new QHBoxLayout;
    layout->addWidget(btn1);
    layout->addWidget(btn2);
    setLayout(layout);
}
View Code

  

 

  可以在帮助中查看Creating Custom Widgets for Qt Designer关键字来查看Qt Designer自定义部件的更多内容,也可以在Qt Designer分类中查看创建Qt Designer插件的例子。

  

 

posted on 2020-09-09 14:35  整鬼专家  阅读(325)  评论(0编辑  收藏  举报