2017-09-14 72 views
2

请输入:基本代码。创建25 QPushButtons,包装在QWidget中,其中QVBoxLayoutQWidget)本身就是顶级QVBoxLayout的唯一孩子,该顶级QVBoxLayout处理顶部scroll_area_test-QWidget中的小部件放置。第二个QWidget包装可能听起来多余,但稍后会派上用场。包装在QScrollArea中的小工具未使用可用尺寸

#include <QVBoxLayout> 
#include <QScrollArea> 
#include <QWidget> 
#include <QPushButton> 
#include <QApplication> 

/* 
* This declaration actually lives in its own header file, 
* but for simplicity's sake this code includes it here directly. 
*/ 
class scroll_area_test : public QWidget { 
    Q_OBJECT 

    public: 
    scroll_area_test(); 
}; 

scroll_area_test::scroll_area_test() { 
    QVBoxLayout *top_layout = new QVBoxLayout (this); 

    QWidget *contents = new QWidget (this); 
    top_layout->addWidget (contents); 

    QVBoxLayout* inner_layout = new QVBoxLayout (contents); 

    for (size_t i = 0; i < 25; ++i) { 
    QPushButton *tmp_button = new QPushButton (this); 
    inner_layout->addWidget (tmp_button); 
    } 
} 

int main (int argc, char **argv) { 
    QApplication app (argc, argv); 

    scroll_area_test widget; 
    widget.show(); 

    return (app.exec()); 
} 

这工作正常。它产生一个窗口,上面有25个按钮。鉴于我的显示分辨率足够高,我可以看到整个窗口。一切都很华丽。

Without QScrollArea

别急,如果什么用户的分辨率是比我自己低?窗户太大,不适合他们的屏幕!唉,有这种情况的解决方案。输入:QScrollArea

scroll_area_test::scroll_area_test() { 
    QVBoxLayout *top_layout = new QVBoxLayout (this); 

    QScrollArea *scrolling_area = new QScrollArea (this); 
    scrolling_area->setWidgetResizable (true); 
    scrolling_area->setFocusPolicy (Qt::NoFocus); 
    top_layout->addWidget (scrolling_area); 

    QWidget *contents = new QWidget (this); 
    //contents->setSizePolicy (QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); 

    QVBoxLayout* inner_layout = new QVBoxLayout (contents); 
    //inner_layout->setSizeConstraint (QLayout::SetMinimumSize); 

    for (size_t i = 0; i < 25; ++i) { 
    QPushButton *tmp_button = new QPushButton (this); 
    inner_layout->addWidget (tmp_button); 
    } 

    scrolling_area->setWidget (contents); 
} 

我希望这不会改变我的系统上的布局,因为有足够的空间显示所有小部件。

然而,这就是新的输出:

With QScrollArea

我在做什么错?我希望滚动区域自动调整为其子大小(因此为setWidgetResizable (true)),以最大窗口大小为界。这似乎并非如此。包含小部件的大小没有被正确地考虑到,因此滚动区域是a)。高度小于它应该是b)。宽度大于它应该是,与没有包装QWidgetQScrollArea的外观相比。

我已经玩过大小限制和策略(通过注释代码显示),但这些内容并没有改变任何视觉效果。

N.B .:我在一个非常复杂的情况下遇到了这个问题,但能够将它抽象为这个例子。

回答

0

您需要为您的QScrollArea对象设置尺寸政策。

设置横向和纵向固定的策略,如下所述。

QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); 
scrolling_area->setSizePolicy(sizePolicy); 
+0

谢谢。这样做有点有趣,因为它保持了原始示例中的宽度,但高度仍然太低。此外,通过这种方式,可以调整窗口大小,但不值钱,因为滚动区域不随父窗口小部件一起增长。鉴于滚动区域应始终与父级调整大小,对其使用固定大小的策略听起来不是一个好主意。 – Ionic