1. 程式人生 > 實用技巧 >《QT Creator快速入門》第九章:國際化、幫助、Qt外掛

《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外掛的例子。