我刚刚开始使用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)
正如你所指出的,解决方案是使用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()