【问题标题】:Get size of QScrollArea viewport before showing在显示之前获取 QScrollArea 视口的大小
【发布时间】:2016-06-11 15:53:47
【问题描述】:

我有一个自定义 QDialog,它由一个 QStackedWidget 和 QScrollArea 小部件组成,用于堆叠小部件的每个页面。

我想为 QDialog 设置大小提示,使对话框足够大,以至于在首次显示对话框时滚动区域的滚动条不可见(即确保 QScrollArea 视口的大小 = 子项的大小提示滚动区域中的小部件)。目前,QDialog 的默认 sizeHint() 实现高度不足,这会导致在首次加载时显示垂直滚动条。

我认为这可以通过为 QDialog 重新实现 sizeHint() 来实现,由此对话框的大小提示将根据 QScrollArea 视口大小所需的量进行调整,以等于滚动区域(用于堆叠布局的第一页)。不幸的是,在 sizeHint() 中,QScrollArea 视口的大小被设置为 QStackedWidget (640x480) 的默认大小,并且只有在显示 QDialog 时才会更新为正确的大小。

有没有什么方法可以在QScrollArea视口显示之前得到正确的大小,或者有什么方法可以达到想要的效果,调整对话框的大小提示,防止滚动条在第一次显示的时候就显示出来(除了对对话框大小进行硬编码)。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    你的对话组成如下:

    我有一个由 QStackedWidget 和 QScrollArea 组成的自定义 QDialog 堆叠小部件的每个页面的小部件。

    棘手的部分是回答:

    有没有办法获得正确大小的 QScrollArea 视口 在显示之前?

    好吧,在切换到某个页面之前,您可以估计滚动区域视口是否设置正确,或者您可以只测量滚动区域内的内容。我通常会强制小部件从滚动区域要求一定的高度,如下所示:

    wdgetInScrollArea->setMinimumSize( widgetInScrollArea->sizeHint() );
    wdgetInScrollArea->adjustSize(); // sometimes it is needed
    

    滚动区域视口提示更“足够”:

    qDebug() << scrollArea->viewPortSizeHint(); // report
    

    我没有看到代码,但通常这里甚至不需要进行任何自定义事件处理,只需像这样准备所有嵌套的小部件。

    【讨论】:

    • 感谢 AlexcanderVX。我最终在我的 QDialog 类中重新实现了 showEvent 以获得滚动区域视口的正确大小。然后我取 scrollAreaViewport 的大小和 widgetInScrollArea 最小大小提示之间的差异来调整对话框的大小,然后再显示它(使视口的大小 = 滚动区域中小部件的最小大小提示)。
    • @karl_simmons,当然,该建议已被您采纳,需要更多工作。但是,如果答案有帮助,您可能可以投票并接受它,以便其他人认为它是有帮助的。我也会尝试从您的解决方案中添加答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多