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);
但它不起作用。
答案 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过滤掉它隐藏的小部件的所有绘制事件,使小部件不被绘制,但小部件在布局中保留其空间。