Taro3

View on GitHub

プラグインを Qt Designer に公開する

これで FilterWidget クラスが完成し、使えるようになりました。あとはFilterWidgetをQt Designerのプラグインシステムに登録しなければなりません。このグルーコードはQDesignerCustomWidgetInterfaceの子クラスを使って作っています。

FilterPluginDesignerという名前のC++クラスを新規作成し、FilterPluginDesigner.hをこのように更新します。

#include <QtUiPlugin/QDesignerCustomWidgetInterface>
class FilterPluginDesigner : public QObject, public QDesignerCustomWidgetInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID
        "org.masteringqt.imagefilter.FilterWidgetPluginInterface")
    Q_INTERFACES(QDesignerCustomWidgetInterface)

public:
    FilterPluginDesigner(QObject* parent = 0);
};

FilterPluginクラスは2つのクラスを継承しています。

QDesignerCustomWidgetInterfaceクラスには、2つの新しいマクロが導入されています。

Qt Designer がプラグインを検出できるようになりました。プラグイン自体についての情報を提供する必要があります。FilterPluginDesigner.hを更新します。

class FilterPluginDesigner : public QObject, public QDesignerCustomWidgetInterface
{
    ...
    FilterPluginDesigner(QObject* parent = 0);

    QStringname() const override;
    QStringgroup() const override;
    QStringtoolTip() const override;
    QStringwhatsThis() const override;
    QStringincludeFile() const override;
    QIconicon() const override;
    boolisContainer() const override;
    QWidget* createWidget(QWidget* parent) override;
    boolisInitialized() const override;
    void initialize(QDesignerFormEditorInterface* core) override;

private:
    boolmInitialized;
};

見た目よりも圧倒的に少ないです。これらの関数の本体は通常一行で構成されています。ここに最も簡単な関数の実装を示します。

QStringFilterPluginDesigner::name() const
{
    return "FilterWidget";
}

QStringFilterPluginDesigner::group() const
{
    return "Mastering Qt5";
}

QStringFilterPluginDesigner::toolTip() const
{
    return "A filtered picture";
}

QStringFilterPluginDesigner::whatsThis() const
{
    return "The filter widget applies an image effect";
}

QIconFilterPluginDesigner::icon() const
{
    returnQIcon(":/icon.jpg");
}

boolFilterPluginDesigner::isContainer() const
{
    return false;
}

ご覧のように、これらの関数についてはあまり説明することはありません。これらの関数のほとんどは、単に QString 値を返し、Qt Designer UI の適切な場所に表示されます。ここでは、最も興味深いものだけを取り上げます。まずは includeFile() から始めましょう。

QStringFilterPluginDesigner::includeFile() const
{
    return "FilterWidget.h";
}

この関数は uic (User Interface Compiler) から呼び出され、.ui ファイルに対応するヘッダを生成します。createWidget()の続きです。

QWidget* FilterPluginDesigner::createWidget(QWidget* parent)
{
    return new FilterWidget(parent);
}

この関数は、Qt Designer と FilterWidget の橋渡しをします。.ui ファイルに FilterWidget クラスを追加すると、Qt Designer は createWidget() 関数を呼び出して FilterWidget クラスのインスタンスを作成し、その内容を表示します。また、FilterWidget がアタッチされる parent 要素も提供します。

最後に initialize() で終わりにしましょう。

voidFilterPluginDesigner::initialize(QDesignerFormEditorInterface*)
{
    if (mInitialized)
        return;

    mInitialized = true;
}

この関数では何もしていません。しかし、QDesignerFormEditorInterface*パラメータは説明する価値があります。Qt Designer が提供するこのポインタは、関数を介して Qt Designer のいくつかのコンポーネントにアクセスすることができます。

これらのパネルについては、第 1 章「Qt入門」で説明しました。ウィジェットプラグインがこれらの領域に介入する必要がある場合、この関数は Qt Designer の動作をカスタマイズするためのエントリーポイントとなります。


戻る