获取QScrollArea绝对大小

时间:2019-03-13 10:56:45

标签: qt qwidget qscrollarea

我有一个自定义窗口小部件,它是QScrollArea的子级。 无论滚动条是否显示,我都需要获取QScrollArea的绝对大小。

class MyWidget : public QWidget { /*...*/ };

void
MyWidget::Foo()
{
    auto scrollAreaHeight = parentWidget()->height();
    auto scrollAreaWidth = parentWidget()->width();

    /* height and width change depending on scrollbars 
       being displayed or not */
}

有没有办法做到这一点?

或者,如果通过QWidget函数返回的parentWidget()接口不可能做到这一点,那么有一种方法可以从QScrollArea获得QScrollArea的绝对大小本身?

1 个答案:

答案 0 :(得分:2)

我不完全理解为什么OP无法获得QScrollArea的绝对大小。

但是,我认为OP的理解中可能缺少某些内容。我准备了以下小样本:

一个QWidget和一个QVBoxLayout和一个QScrollArea和一个QPushButton

#!/usr/bin/python3

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QScrollArea, QPushButton

app = QApplication(sys.argv)
qWinMain = QWidget()
qVBox = QVBoxLayout()
qScrollArea = QScrollArea()
qBtn = QPushButton("Consume somehow some space\nConsume somehow some space\nConsume somehow some space\n")
qScrollArea.setWidget(qBtn)
qVBox.addWidget(qScrollArea)
qWinMain.setLayout(qVBox)
qWinMain.show()

def onBtnClicked():
  print("Sizes:")
  print("qWinMain:               ", qWinMain.size())
  print("qWinMain.childrenRect():", qWinMain.childrenRect().size())
  print("qScrollArea:            ", qScrollArea.size())
  print("qScrollArea.viewport(): ", qScrollArea.viewport().size())
  print("qBtn:                   ", qBtn.size())

qBtn.clicked.connect(onBtnClicked)
sys.exit(app.exec_())

单击QPushButton时,将打印一些尺寸的窗口小部件。 它做了两次-一次是在滚动条不可见时,另一次是在我更改主窗口的大小以使滚动条变得可见之后。

Snapshot 1 (with scrollbars not activated) Snapshot 2 (with scrollbars activated)

输出:

Sizes:
qWinMain:                PyQt5.QtCore.QSize(225, 100)
qWinMain.childrenRect(): PyQt5.QtCore.QSize(203, 78)
qScrollArea:             PyQt5.QtCore.QSize(203, 78)
qScrollArea.viewport():  PyQt5.QtCore.QSize(201, 76)
qBtn:                    PyQt5.QtCore.QSize(201, 65)
Sizes:
qWinMain:                PyQt5.QtCore.QSize(120, 92)
qWinMain.childrenRect(): PyQt5.QtCore.QSize(98, 70)
qScrollArea:             PyQt5.QtCore.QSize(98, 70)
qScrollArea.viewport():  PyQt5.QtCore.QSize(82, 54)
qBtn:                    PyQt5.QtCore.QSize(201, 65)

因此,这是如何阅读此内容:

  • qWinMain.size()返回的客户区域大小为qWinMain(不考虑窗户装饰)。
  • qWinMain.childrenRect().size()返回qWinMain的子元素的边框大小–宽度和高度正好缩小了22个像素,这是合理的,因为11个像素是QWidget的默认边距。
  • qScrollArea.size()在两种情况下都返回与qWinMain.childrenRect().size()完全相同的大小,这是合理的,因为它是唯一的孩子。
  • qScrollArea.viewport().size()返回QScrollArea的视口大小–该大小取决于滚动条是否可见。如果没有滚动条,则与qScrollArea的宽度和高度差异仅为2个像素,而带有滚动条的差异分别更大。
  • qBtn.size()返回按钮的大小,该按钮的大小与其视觉/剪切区域无关,因此在两种情况下均相等。

因此,无论OP代表“ QScrollArea的绝对大小”,OP都应在其中寻找其中之一。