获取QScrollArea的绝对大小
Get QScrollArea absolute size
我有一个自定义小部件,它是 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 */
}
有办法吗?
或者,如果通过 parentWidget()
函数返回的 QWidget
接口不可能做到这一点,是否有办法从 QScrollArea
获取 QScrollArea
的绝对大小=] 本身?
我完全不明白为什么OP不能得到QScrollArea
的绝对大小。
但是,我认为 OP 的理解中可能缺少某些内容。我准备了以下小样本:
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
时,会打印一些尺寸的小部件。
它做了两次——一次是在滚动条不可见的时候,另一次是在我改变 main window 的大小以便滚动条变得可见之后。
输出:
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
(不考虑 window 装饰)。
qWinMain.childrenRect().size()
返回的边界框大小为 qWinMain
的 children – 它的宽度和高度恰好小 22 个像素,这是有意义的,因为 11 个像素是 [= 的默认边距13=].
qScrollArea.size()
在两种情况下都返回与 qWinMain.childrenRect().size()
完全相同的大小,这是合理的,因为它是唯一的 child.
qScrollArea.viewport().size()
returns QScrollArea
的视口大小 – 该大小取决于滚动条是否可见。没有滚动条,与 qScrollArea
的差异在宽度和高度上只有 2 个像素,但有滚动条时分别更大。
qBtn.size()
returns 独立于其 visual/clipped 区域的按钮大小,因此在两种情况下相等。
所以,无论 OP 对 "absolute size of QScrollArea" 意味着什么——其中一个应该是 OP 正在寻找的。
我有一个自定义小部件,它是 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 */
}
有办法吗?
或者,如果通过 parentWidget()
函数返回的 QWidget
接口不可能做到这一点,是否有办法从 QScrollArea
获取 QScrollArea
的绝对大小=] 本身?
我完全不明白为什么OP不能得到QScrollArea
的绝对大小。
但是,我认为 OP 的理解中可能缺少某些内容。我准备了以下小样本:
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
时,会打印一些尺寸的小部件。
它做了两次——一次是在滚动条不可见的时候,另一次是在我改变 main window 的大小以便滚动条变得可见之后。
输出:
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
(不考虑 window 装饰)。qWinMain.childrenRect().size()
返回的边界框大小为qWinMain
的 children – 它的宽度和高度恰好小 22 个像素,这是有意义的,因为 11 个像素是 [= 的默认边距13=].qScrollArea.size()
在两种情况下都返回与qWinMain.childrenRect().size()
完全相同的大小,这是合理的,因为它是唯一的 child.qScrollArea.viewport().size()
returnsQScrollArea
的视口大小 – 该大小取决于滚动条是否可见。没有滚动条,与qScrollArea
的差异在宽度和高度上只有 2 个像素,但有滚动条时分别更大。qBtn.size()
returns 独立于其 visual/clipped 区域的按钮大小,因此在两种情况下相等。
所以,无论 OP 对 "absolute size of QScrollArea" 意味着什么——其中一个应该是 OP 正在寻找的。