2

私はかなり単純なことをしたい: Qt デザイナーにカスタム ウィジェットを追加します。これは、基本的にカスタム垂直レイアウトを含む scrollArea になります (プロジェクトのオブジェクトを処理するために、垂直レイアウトにいくつかのコードを追加しました)。アイデアは、画面の横にある垂直メニューを表すことです

これまでに行ったこと

カスタム ウィジェット プラグインとカスタム レイアウトを作成しました。

私のカスタム ウィジェット コードは次のようになります。

#include "menuwidget.h"

MenuWidget::MenuWidget(QWidget *parent) :
        QScrollArea(parent)
{
    this->setWidgetResizable(true);
    QWidget* layoutHoldingWidget= new QWidget(this);
    layout= new MenuLayout();
    layout->setSizeConstraint(QLayout::SetMinAndMaxSize);
    layout->addStretch(1);
    layoutHoldingWidget->setLayout(layout);
    this->setWidget(layoutHoldingWidget);
}

(コンストラクターコードで)レイアウトに手動でいくつかのボタンを追加すると

for(int i =0;i<20;i++)
    layout->addWidget(new QPushButton(this));

それは機能し、いくつかのボタンを含む scrollArea を見ることができます。これはほとんど私が望むものです。

私が欲しいもの

これらのボタンを Qt デザイナーを介して直接追加できるようにしたいと考えています。ユーザーは最初に空の MenuWidget をメイン ウィンドウにドラッグし、次にカスタム ウィジェットに QPushButtons を通常の垂直レイアウトとまったく同じようにドラッグします。

それは可能ですか?どうすればそのようなことができますか?

ありがとうございました !:)

編集 1

私が欠けていたのは、QScrollArea をドラッグ アンド ドロップすると常に作成される「scrollAreaWidgetContents」ウィジェットでした。ウィジェット (containerWidget と呼びましょう) を domXml 関数でカスタム scrollArea に追加することで、同様のことを行いました。これにより、スクロール エリアにウィジェットをドラッグ アンド ドロップできます。

しかし、まだ理解できないことがあります: containerWidget に customLayout (myCustomLayout) を持たせたいのです。domXml 関数に追加すると、ターミナルに次の行が表示されます。

デザイナー: レイアウト タイプ 'MyCustomLayout' はサポートされていません。デフォルトはグリッドです。

つまり、カスタム レイアウトを使用してウィジェットを配置するようにデザイナーに指示することはできません。これはちょっと悲しいことです:D

ここで「チート」する方法はありますか?

4

2 に答える 2

3

考慮すべき点が 2 つあります。

1) QDesignerCustomWidgetInterface から派生したクラスでtrueを返す関数を上書きします。

bool isContainer() const { return true; }

これは、ウィジェットに子を含めることができることを QtDesigner に伝えます。(Qt では、ほぼすべてのウィジェットに任意のウィジェットを子として含めることができますが、QtDesigner は賢明な方法でそれを制限しようとします。たとえば、QtDesigner で QLabel に子を追加することはできません)。

2) ウィジェットの childEvent を実装します。おそらくあなたの場合、QtDesignerに追加されたウィジェットをレイアウトに追加します。

これを試すために実装したコアを次に示します。QtCreator の「Qt Widget Plugin」ウィザードを使用してスケルトンを作成し、少し修正しました。

QtDesigner のコンパイラ/Qt バージョン用にreleaseとしてビルドし、\plugins\designer ディレクトリに .dll および .lib ファイルをコピーして、QtDesigner を再起動することを忘れないでください。

垂直プラグイン.cpp

//all other functions remained as created by QtCreator wizard
bool VerticalMenuPlugin::isContainer() const
{
    return true;
}

VerticalMenu.h

#ifndef VERTICALMENU_H
#define VERTICALMENU_H

#include <QtGui/QWidget>
#include <QtGui/QVBoxLayout>

class VerticalMenu : public QWidget
{
    Q_OBJECT

protected:
    virtual void childEvent ( QChildEvent * event );
public:
    VerticalMenu(QWidget *parent = 0);
};

#endif

VerticalMenu.cpp

#include "verticalmenu.h"
#include <QChildEvent>

VerticalMenu::VerticalMenu(QWidget *parent) :
    QWidget(parent)
{
    setLayout (new QVBoxLayout);
}

void VerticalMenu::childEvent ( QChildEvent * event )
{
    if ( event->added() )
    {
        QWidget * newChild = qobject_cast<QWidget *>(event->child());
        if ( newChild )
        {
            layout()->addWidget( newChild );
        }
    }
}

出発点として役立つことを願っています。

于 2013-08-14T09:28:09.013 に答える
1

Qt 4 は designerのカスタム レイアウト プラグインをサポートしていないため、やりたいことが実現できませんでした。代わりに垂直レイアウトを使用し、ウィジェット コードのカスタム レイアウト コードにあるはずだった追加機能を実装しようとします。

于 2013-08-14T09:15:09.210 に答える