Я не совсем понимаю, почему ОП не может получить абсолютный размер QScrollArea
.
Однако я предполагаю, что в понимании ОП может быть что-то не так. Я подготовил следующий маленький образец:
A 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
печатаются некоторые размеры виджетов.
Он сделал это дважды & ndash; один раз, когда полосы прокрутки невидимы, и снова после того, как я изменил размер главного окна, чтобы полосы прокрутки стали видимыми.
Выход:
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
& ndash; этот размер зависит от того, видны ли полосы прокрутки или нет. Без полос прокрутки разница в qScrollArea
составляет всего 2 пикселя по ширине и высоте, но для полос прокрутки она соответственно больше.
qBtn.size()
возвращает размер кнопки, который не зависит от видимой / обрезанной области и, следовательно, в обоих случаях равен.
Итак, какой бы OP ни имел в виду «абсолютный размер QScrollArea» & ndash; один из них должен быть OP ищет.