Добавление пользовательских виджетов в QScrollArea в pyqt5 не приводит к появлению полосы прокрутки - PullRequest
0 голосов
/ 05 октября 2018

Пример, показанный ниже, добавляет очень простой пользовательский виджет pyqt5 в QScrollArea.Когда я перемещаю пользовательский виджет «за пределы» области прокрутки, я ожидаю появления полос прокрутки.Очевидно, что это не так.

#!/usr/bin/python3
from PyQt5.QtWidgets import QMainWindow, QWidget, QApplication, QScrollArea
from PyQt5.QtCore import QObject
from PyQt5.QtGui import QPainter, QColor, QPen
import sys

class ExampleWidget(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent=parent)

    def paintEvent(self, e):
        qp = QPainter()
        qp.begin(self)
        self.drawWidget(qp)
        qp.end()

    def drawWidget(self, qp):
        qp.setPen(QColor(255, 0, 0))
        qp.setBrush(QColor(255, 0, 0))
        qp.drawRect(0, 0, 100, 100)

class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(300, 300, 300, 200)
        self.scrollArea = QScrollArea(self)
        self.setCentralWidget(self.scrollArea)
        self.widget = ExampleWidget(self.scrollArea)
        self.widget.setGeometry(250, 150, 100, 100)
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Как сделать так, чтобы полосы прокрутки появлялись после перемещения виджета, чтобы он больше не отображался полностью?

1 Ответ

0 голосов
/ 06 октября 2018

В коде, который выбирает ExampleWidget, является потомком QScrollArea: self.widget = ExampleWidget(self.scrollArea), это не означает, что виджет обрабатывается со свойствами QScrollArea, QScrollArea имеет viewport()это фоновый виджет и QScrollArea показывает только его часть.Поэтому, если вы хотите, чтобы виджет был внутри, вы должны использовать метод setWidget().С другой стороны, что viewport() имеет размер содержимого и как он рассчитывает этот размер?, По умолчанию он использует sizeHint() виджета, а в вашем случае его нет, поэтому он не будет показывать то, что выхочу.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class ExampleWidget(QtWidgets.QWidget):
    def paintEvent(self, e):
        qp = QtGui.QPainter(self)
        self.drawWidget(qp)

    def drawWidget(self, qp):
        qp.setPen(QtGui.QColor(255, 0, 0))
        qp.setBrush(QtGui.QColor(255, 0, 0))
        qp.drawRect(0, 0, 100, 100)

    def sizeHint(self):
        return QtCore.QSize(500, 500)


class Example(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.scrollArea = QtWidgets.QScrollArea()
        self.setCentralWidget(self.scrollArea)
        self.widget = ExampleWidget()
        self.scrollArea.setWidget(self.widget)
        self.show()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

enter image description here

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