《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项目文件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/******定义插件类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 #添加包含目录
使用插件扩展应用程序的话先将接口类头文件添加到项目中,然后使用QPluginLoader对象加载插件,再通过qobject_cast<>获得该接口,然后就可以使用该接口中的方法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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" } } } }
Qt中的Tools分类中有一个综合使用插件扩展应用程序的示例程序Plug and Paint。
③、创建自定义的Qt Designer部件
我们可以创建提供给Qt Designer使用的自定义部件,比如我们创建项目,选择“其他项目”中的“Qt设计师自定义控件”,控件类输入MyDesignerPlugin,基类选择默认的QWidget,其它也为默认,然后就可以通过修改MyDesignerPlugin类来设计自己的自定义部件,代码示例如下,然后我们编译生成Release版本的dll,将这个dll防止Qt安装目录的plugins下的designer目录下,这样我们在开始菜单中打开Qt Designer后就可以看到刚才自定义的部件了,如下图:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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); }
可以在帮助中查看Creating Custom Widgets for Qt Designer关键字来查看Qt Designer自定义部件的更多内容,也可以在Qt Designer分类中查看创建Qt Designer插件的例子。