如何在QGridLayout中强制小部件不等间隔?

时间:2015-04-21 23:54:02

标签: c++ qt

qGridLayout.addWidget(button1,    3,0,1,1, Qt::AlignBottom);
//qGridLayout.addWidget(button2,    3,1,1,1, Qt::AlignBottom);
// is there a way to make button1/3/4 stay at cell 1/3/4
// even if button2 is hidden
qGridLayout.addWidget(button3,    3,2,1,1, Qt::AlignBottom);
qGridLayout.addWidget(button4,    3,3,1,1, Qt::AlignBottom);

我遇到的问题是,当我隐藏button2时,button1/3/4会自动等间隔。

我试过

qGridLayout.addItem(new QSpacerItem,3,1,1,1, Qt::AlignBottom);

但它不起作用。

2 个答案:

答案 0 :(得分:0)

qGridLayout.addItem(new QSpacerItem((1, 
                                     1, 
                                     QSizePolicy::Expanding, 
                                     QSizePolicy::Preferred),
                    3,1,1,4, 
                    Qt::AlignTop);

我目前的解决方案是在按钮行上方添加一个间隔项,以强制它有4个等间距的单元格(即使按钮2被隐藏,第二个单元格也不会缩小到任何值)。

不将间隔物直接放入按钮2的位置的原因是当按钮2显示并与间隔物共存时间隔物将破坏布局。

答案 1 :(得分:0)

您的解决方案对我来说很合适。但是,如果您希望在不向网格布局添加新行的情况下完成此操作,则可以使用以下类。

class Hider : public QObject
{    
public:
    Hider(QObject* pParent = 0) : QObject(pParent) {}
    bool eventFilter(QObject* pObject, QEvent* pEvent)
    {
        return pEvent->type() == QEvent::Paint;
    }

    void hide(QWidget* pWidget)
    {
        pWidget->installEventFilter(this);
        pWidget->update();
    }

    void unhide(QWidget* pWidget)
    {
        pWidget->removeEventFilter(this);
        pWidget->update();
    }
};

Hider对象保留为类变量。如果要隐藏按钮,

hider->hide(button2);

当你想再次显示按钮时,

hider->unhide(button2);

Hider过滤掉它隐藏的小部件的所有绘制事件,使小部件不被绘制,但小部件在布局中保留其空间。