当子窗口小部件被隐藏时,QGridLayout不会重新调整大小,也不会重新绘制

时间:2018-02-02 09:16:01

标签: c++ qt

我有一个小部件,QVBoxLayout作为主要布局,QGridLayout作为子布局嵌套在主布局中。有一个切换按钮,用于显示/隐藏网格布局中的某些小部件。更新可见性后,我想调整(最小化)窗口小部件的大小。但是当子窗口小部件被隐藏时,调整大小不能正常工作,窗口小部件大小保持不变,它不会像我期望的那样收缩。此外,窗口小部件未正确重新绘制,一些坏的按钮片段仍然可见。我观察到,如果网格布局是主要布局(即没有垂直布局),则不会发生这种情况,但如果它嵌套在另一个布局中,则表现得很奇怪。任何想法如何解决这个问题?

widget.h:

#pragma once

#include <QWidget>

class QGridLayout;
class QPushButton;

class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
private:
    void updateVisibility();
    QGridLayout *m_layout;
    QPushButton *m_button;
};

widget.cpp:

#include "widget.h"

#include <QGridLayout>
#include <QLabel>
#include <QPushButton>

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    m_layout = new QGridLayout();
    m_layout->addWidget(new QLabel("Label1"), 0, 0);
    m_layout->addWidget(new QLabel("Label2"), 1, 0);

    m_button = new QPushButton("Visible");
    connect(m_button, &QPushButton::clicked, this, &Widget::updateVisibility);
    m_button->setCheckable(true);
    m_button->setChecked(false);

    auto layout = new QVBoxLayout(this);
    layout->addLayout(m_layout);
    layout->addWidget(m_button);
    updateVisibility();
}

void Widget::updateVisibility()
{
    // hide or show Label2
    m_layout->itemAtPosition(1, 0)->widget()->setVisible(m_button->isChecked());
    adjustSize();
}

在:

enter image description here

在按钮上单击2次后:

enter image description here

更新:我将此报告为错误https://bugreports.qt.io/browse/QTBUG-66151,但我希望找到合适的解决方法,直到修复为止。

1 个答案:

答案 0 :(得分:0)

使用Qt 5.5.1或Qt 5.9.4无法在Xubuntu 16.04.3上重现。我确实观察到一些奇怪的行为。如果我将Widget添加到QMainWindow并检查按钮,它将忽略主窗口的布局,直到调整主窗口的大小。 如果我使用Widget作为顶级窗口,它会在第一次单击时变大,然后再从不调整大小,除非用户更改窗口大小。

可能的解决方法:

  • 删除adjustSize()来电,这阻止了我的奇怪行为。
  • 在小部件上调用update()或在adjustSize()之后调度其父级以安排重绘。 (因为我没有绘画文物,所以无法测试。)
  • m_layout->invalidate()之后调用adjustSize()以安排重新布局。在主窗口内修复我的问题。您也可以在小部件的父级上或adjustSize()之前尝试该调用。