簡體   English   中英

將自定義窗口小部件添加到pyqt5中的QScrollArea不會使滾動條出現

[英]Adding custom widgets to a QScrollArea in pyqt5 does not make scrollbar appear

下面顯示的示例將一個非常簡單的自定義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_())

一旦移動了小部件,如何使其不再完全可見,如何使滾動條出現?

在示例ExampleWidgetExampleWidget的子代的QScrollAreaself.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_())

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM