首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >得到QScrollArea的绝对尺寸

得到QScrollArea的绝对尺寸
EN

Stack Overflow用户
提问于 2019-03-13 10:56:45
回答 1查看 1.5K关注 0票数 2

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

代码语言:javascript
运行
复制
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的绝对大小吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-13 14:59:25

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

然而,我认为OP的理解中可能缺少一些东西。我准备了以下小样本:

QWidgetQVBoxLayoutQScrollAreaQPushButton

代码语言:javascript
运行
复制
#!/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时,将打印一些大小的小部件。它做了两次--一次是当滚动条不可见时,另一次是在我更改主窗口的大小之后,使滚动条变得可见。

输出:

代码语言:javascript
运行
复制
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像素,这是QWidget的默认边距,有意义的是11像素。
  • qScrollArea.size()在这两种情况下都返回了与qWinMain.childrenRect().size()完全相同的大小,这是合理的,因为它是独子。
  • qScrollArea.viewport().size()返回QScrollArea的视口大小-这个大小取决于滚动条是否可见。没有滚动条,与qScrollArea的差异仅为2个像素的宽度和高度,但滚动条分别更大。
  • qBtn.size()返回按钮的大小,它独立于其视觉/剪裁区域,因此在这两种情况下都是相等的。

因此,无论OP的意思是“QScrollArea的绝对大小”,其中一个应该是OP正在寻找。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55140220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档