zoukankan      html  css  js  c++  java
  • 《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插件的例子。

      

  • 相关阅读:
    信息和熵
    【算法】欧几里得算法与青蛙约会oj
    【算法】并查集模板与练习
    Kaggle-房价预测
    【pytorch】pytorch-backward()的理解
    【pytorch】pytorch-LSTM
    【计算机网络】数据链路层总结
    【Code】numpy、pytorch实现全连接神经网络
    【MT】牛津的MT教程
    【计算机网络】物理层基础知识
  • 原文地址:https://www.cnblogs.com/milanleon/p/12095548.html
Copyright © 2011-2022 走看看