自定义Qt设计器窗口小部件:包含自定义垂直布局的滚动区域

时间:2013-08-12 08:06:08

标签: qt qt4 qwidget qt-designer

我想做一些相当简单的事情:向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

我缺少的是“scrollAreaWidgetContents”小部件,它总是在拖放QScrollArea时创建。我通过在其domXml函数中添加一个小部件(让我们称之为containerWidget)到我的自定义scrollArea来做类似的事情,这使我能够像我想要的那样在我的滚动区域上拖放小部件。

但仍有一些我无法弄清楚:我希望containerWidget有一个customLayout(myCustomLayout)。如果我在domXml函数中添加它,我会在终端中获得以下行:

  

Designer:不支持布局类型“MyCustomLayout”,   违约到网格。

所以这意味着我无法告诉设计师使用我的自定义布局来放置我的小部件,这有点难过:D

有没有办法在这里“欺骗”?

2 个答案:

答案 0 :(得分:3)

有两件事需要考虑:

1)在您从QDesignerCustomWidgetInterface派生的类中覆盖返回 true

的函数
bool isContainer() const { return true; }

这告诉QtDesigner窗口小部件可以包含子节点。 (在Qt中,几乎任何Widget都可以包含任何小部件作为子级,但QtDesigner会尝试以合理的方式限制它 - 例如,您无法将子项添加到QtDesigner中的QLabel中)

2)实现Widget的childEvent。可能在你的情况下,它会将QtDesigner中添加的小部件添加到布局中。

这是我尝试过的核心。我在QtCreator中使用“Qt Widget Plugin”向导创建了一个骨架并进行了一些修改。

不要忘记为QtDesigner的编译器/ Qt版本构建发布,将。plugins \ designer目录中的.dll和.lib文件复制到重启 QtDesigner!

verticalplugin.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 );
        }
    }
}

我希望'这将有助于作为一个起点。

答案 1 :(得分:1)

Qt 4 does not support custom layout plugins for designer,所以我无法实现我想做的事情。我将使用垂直布局,并尝试实现应该在小部件代码中的自定义布局代码中的其他功能。