在PyQt的网格布局中使具有QPaint的小部件可滚动

2024-04-25 22:05:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始使用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()

在{}中,我用{}画一些东西

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完成的,但我只发现滚动区域是整个网格而不是网格中的一个单元格的例子

我已经感谢你的帮助了。非常感谢。 (欢迎提供任何建议和改进。)

编辑: 我想我快到了。现在我在画的东西周围有滚动条,但我不能滚动。我想我需要在某个地方定一个尺码,但我不知道在哪里。我在{}的{}中添加了这个

        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)

Tags: self内容initdefwidgetqtclassscroll
1条回答
网友
1楼 · 发布于 2024-04-25 22:05:36

正如您所指出的,解决方案是使用QScrollArea,但其视口采用小部件的最小大小,但在您的情况下没有最小大小,因此只需设置minimumSizeHint、minimumSize或fixedSize:

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()

相关问题 更多 >