Получить QScrollArea в абсолютном размере - PullRequest
2 голосов
/ 13 марта 2019

У меня есть пользовательский виджет, который является потомком 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 Ответ

2 голосов
/ 13 марта 2019

Я не совсем понимаю, почему ОП не может получить абсолютный размер 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; один раз, когда полосы прокрутки невидимы, и снова после того, как я изменил размер главного окна, чтобы полосы прокрутки стали видимыми.

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 & ndash; этот размер зависит от того, видны ли полосы прокрутки или нет. Без полос прокрутки разница в qScrollArea составляет всего 2 пикселя по ширине и высоте, но для полос прокрутки она соответственно больше.
  • qBtn.size() возвращает размер кнопки, который не зависит от видимой / обрезанной области и, следовательно, в обоих случаях равен.

Итак, какой бы OP ни имел в виду «абсолютный размер QScrollArea» & ndash; один из них должен быть OP ищет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...