在PyQt的网格布局中使用QPainter使widget可滚动。

问题描述 投票:0回答:1

我刚刚开始使用PyQt,但我在布局和使内容可滚动方面遇到了困难。我有一个 MainWindow 我想放置多个小部件的地方。

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.top = 0
        self.left = 0
        self.width = 500
        self.height = 500

        layout = QtWidgets.QGridLayout()
        layout.addWidget(WidgetOne(), 0, 0)
        layout.addWidget(WidgetTwo(), 1, 1)

        widget = QtWidgets.QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

        self.initMainWindow()

    def initMainWindow(self):
        self.setGeometry(self.top, self.left, self.width, self.height)
        self.show()

而在 WidgetOne 我画的东西与 QPainter

class WidgetOne(QtWidgets.QWidget):
    def __init__(self):
        super(WidgetOne, self).__init__()

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)

        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        painter.setPen(QtCore.Qt.red)
        painter.setBrush(QtCore.Qt.green)
        # draw something
        painter.end()

现在我想做 WidgetOne 我画的东西是可以滚动的。我画的区域比屏幕上的ẁ窗口大,所以我希望能够滚动浏览我画的所有内容。我知道这是通过 QScrollArea 但我只找到了滚动区域是整个网格,而不仅仅是网格的一个单元格的例子。

我已经很感激你的帮助。谢谢(也欢迎任何建议和改进。)

EDIT:我想我已经成功了。现在我在绘制的东西周围有滚动条,但我不能滚动。我想我需要在某个地方设置一个大小,但我不知道在哪里。我把这个加到了 __init__()MainWindow

        self.scroll = QtWidgets.QScrollArea()
        self.scroll.setWidgetResizable(True)
        self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        self.scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        self.scrollWidget = WidgetOne()
        self.scroll.setWidget(self.scrollWidget)

        layout.addWidget(self.scroll, 0, 0)
python pyqt
1个回答
1
投票

正如你所指出的,解决方案是使用QScrollArea,但它的视口会占用widget的最小尺寸,但在你的情况下,没有最小尺寸,所以只需设置最小尺寸Hint,最小尺寸或固定尺寸。

import sys

from PyQt5 import QtCore, QtGui, QtWidgets


class WidgetOne(QtWidgets.QWidget):
    def paintEvent(self, event):
        painter = QtGui.QPainter(self)

        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        painter.setPen(QtCore.Qt.red)
        painter.setBrush(QtCore.Qt.green)

    def minimumSizeHint(self):
        return QtCore.QSize(1000, 1000)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        widget = QtWidgets.QWidget()
        layout = QtWidgets.QGridLayout(widget)

        widget_one = WidgetOne()
        # or
        # widget_one.setFixedSize(1000, 1000)
        # or
        # widget_one.setMinimumSize(1000, 1000)
        scroll = QtWidgets.QScrollArea(widgetResizable=True)
        scroll.setWidget(widget_one)

        layout.addWidget(scroll, 0, 0)
        # layout.addWidget(WidgetTwo(), 1, 1)
        self.setCentralWidget(widget)
        self.resize(500, 500)


def main():
    app = QtWidgets.QApplication.instance()
    if app is None:
        app = QtWidgets.QApplication([])

    w = MainWindow()
    w.show()

    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
© www.soinside.com 2019 - 2024. All rights reserved.