我有一个小部件,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();
}
在:
在按钮上单击2次后:
更新:我将此报告为错误https://bugreports.qt.io/browse/QTBUG-66151,但我希望找到合适的解决方法,直到修复为止。
答案 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()
之前尝试该调用。