TL; DRなし関連するウィジェットプラグインでのQt Designerで拡張子を登録する
私はQtのデザイナー拡張子を登録したいが、どのウィジェットプラグインを必要としないので、次のいずれかの私の問題を解決することができます。
- は、どのように私はウィジェットボックス内の任意のウィジェットを公開しないのQt Designerでプラグインを作成するのですが、それは拡張子を登録することができますか?
QDesignerCustomWidgetInterface
のサブクラス化せずにエクステンションを登録するにはどうすればよいですか?
私はQtのデザイナーのためのプラグインのセットに取り組んでいます。これらのプラグインはカスタムウィジェットをデザイナーに公開します。
CCommonWidget
|-> CLabel
|-> CPushButton
...
CCommonWidget
は、すべてのウィジェットのためのいくつかの共通プロパティを定義する:すべてのウィジェット(数十)のような、一般的なクラス(CCommonWidget
)から継承します。拡張子(例えば、QDesignerTaskMenuExtension
)を使ってQt Designerに公開したいと思います。
私はCLabel
プラグインでテストを開始しました。ここでは、2つの関連するメソッド:
// Register the extensions in Qt Designer
void CLabelPlugin::initialize(QDesignerFormEditorInterface *formEditor)
{
if (m_initialized) return;
auto extensionManager = formEditor->extensionManager();
Q_ASSERT(extensionManager);
extensionManager->registerExtensions(new CLabelPluginFactory(extensionManager), Q_TYPEID(QDesignerTaskMenuExtension));
m_initialized = true;
}
// The factory creates the menu extension if the widget is a CLabel
QObject* CLabelPluginFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const
{
if (iid != Q_TYPEID(QDesignerTaskMenuExtension)) return nullptr;
if (auto label = dynamic_cast<CLabel*>(object))
return new CLabelPluginMenu(label, parent);
return nullptr;
}
それは完璧に働いたと私はプラグインの残りの部分にアイデアを拡張しようとしていました。コードをコピー/ペーストするのではなく、CCommonPlugin
で始まり、すべての人にそれを継承させるようにしました。可能な限り再利用可能なようにそれを作るために、私は変更createExtension
方法:私はプラグインを(CLabelPlugin
)が拡張工場、CCommonWidget
から継承する他のウィジェットを登録した場合でもことを理解ここ
QObject* CCommonPluginFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const
{
if (iid != Q_TYPEID(QDesignerTaskMenuExtension)) return nullptr;
if (auto label = dynamic_cast<CCommonWidget*>(object))
return new CCommnPluginMenu(label, parent);
return nullptr;
}
メニューが表示されます! (私がそれを発見するとかなり明白でしたが、私はそれについて考えなかった)。
今では、私はすべてのプラグイン(何十)を変更することがなかったが、ちょうど新しい1、拡張工場を登録するダミー共通のプラグインを作成するので、簡単でした。
私が最初に作成したダミープラグイン:
class CPluginCommon : public QObject, public QDesignerCustomWidgetInterface {
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
explicit CPluginCommon(QObject* parent=0);
public: // QDesignerCustomWidgetInterface
QWidget* createWidget(QWidget* parent) { return nullptr; }
QString group() const { return QString(); }
QIcon icon() const { return QIcon(); }
QString includeFile() const { return QString(); }
bool isContainer() const { return false; }
QString name() const { return QString(); }
QString toolTip() const { return QString(); }
QString whatsThis() const { return QString(); }
virtual bool isInitialized() const override {
return m_initialized;
}
virtual void initialize(QDesignerFormEditorInterface *formEditor) override;
private:
bool m_initialized;
};
をしかし、空白のウィジェットはQtのデザイナーのウィジェットボックスに表示されます。私は空のウィジェットを望んでいない、私は望むウィジェットなし!
別のオプションは、プラグインのこれらの種類を使用することはありませんが、私はQDesignerCustomWidgetInterface
ない延長を登録する方法を見つけるのに苦労していますが、私は見つけることができるすべてはQDesignerCustomWidgetInterface::initialize(QDesignerFormEditorInterface *formEditor)
内の拡張機能マネージャを取得することです(formEditor->extensionManager()
を使用して)。