Qt:理解 QScrollArea::widgetResizable 属性
Qt: Understanding QScrollArea::widgetResizable property
我正在试验 Qt 5 QScrollArea
(在 Python 和 PyQt 中,但我相信这个问题同样适用于 C++ Qt)。
QScrollArea::widgetResizable
的 Qt documentation 表示“如果此 属性 设置为 false(默认值),则滚动区域会遵循其小部件的大小。”通过“它的小部件”,我假设它的意思是在滚动区域中查看的小部件。
然而,在下面的程序中,我在滚动区域内显示了一个图像标签,但滚动区域似乎并没有“尊重其小部件的大小”,因为图像从一开始就被部分隐藏了。
文档还说“不管这个 属性,您可以使用 widget()->resize()
以编程方式调整小部件的大小,滚动区域将自动调整为新的大小。”但是,我确实为查看的小部件调用调整大小,但没有任何反应。
文档还说“如果此 属性 设置为 true,滚动区域将自动调整小部件的大小,以避免在可以避免的地方出现滚动条,或者利用额外的 space。”但是,我没有看到任何调整大小,即使调整了小部件的大小也可以避免滚动条。
这是我将 属性 设置为 True
或 False
以及是否调用 widget().resize()
所看到的:
显然我一定遗漏了一些非常基本的东西;这是什么?
编辑:问题的主要目的是理解widgetResizable
是如何工作的以及它做了什么。使图像适合 window 是次要目标。
from PyQt5.QtCore import QSize
from PyQt5.QtGui import QImage, QPalette, QPixmap
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel, QScrollArea
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
image = QImage("happyguy.png")
imageLabel = QLabel()
imageLabel.setPixmap(QPixmap.fromImage(image))
scrollArea = QScrollArea()
scrollArea.setBackgroundRole(QPalette.Dark)
scrollArea.setWidget(imageLabel)
scrollArea.setWidgetResizable(True)
scrollArea.widget().resize(QSize(10, 10))
self.setCentralWidget(scrollArea)
app = QApplication([])
w = MainWindow()
w.show()
app.exec_()
这是 happyguy.pgn
文件:
可调整大小 不是 可滚动 ...
scrollArea.setWidgetResizable(True)
将imageLabel的调整大小控制权交给scrollArea。所以下一行 scrollArea.widget().resize(QSize(10, 10))
将被系统覆盖。
解决方案适用于 windows(调整主要 window 以适应图像大小)。
from PyQt5.QtGui import QImage, QPalette, QPixmap
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel, QScrollArea, QFrame
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
image = QImage("happyguy.png")
imageLabel = QLabel()
imageLabel.setPixmap(QPixmap.fromImage(image))
scrollArea = QScrollArea()
scrollArea.setFrameShape(QFrame.NoFrame)
scrollArea.setBackgroundRole(QPalette.Dark)
scrollArea.setWidget(imageLabel)
self.setCentralWidget(scrollArea)
self.resize(image.size())
app = QApplication([])
w = MainWindow()
w.show()
app.exec_()
或使用QScrollArea.setMinimumSize
from PyQt5.QtGui import QImage, QPalette, QPixmap
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel, QScrollArea, QFrame
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
image = QImage("happyguy.png")
imageLabel = QLabel()
imageLabel.setPixmap(QPixmap.fromImage(image))
scrollArea = QScrollArea()
scrollArea.setFrameShape(QFrame.NoFrame)
scrollArea.setBackgroundRole(QPalette.Dark)
scrollArea.setWidget(imageLabel)
scrollArea.setMinimumSize(image.size())
self.setCentralWidget(scrollArea)
app = QApplication([])
w = MainWindow()
w.show()
app.exec_()
我正在试验 Qt 5 QScrollArea
(在 Python 和 PyQt 中,但我相信这个问题同样适用于 C++ Qt)。
QScrollArea::widgetResizable
的 Qt documentation 表示“如果此 属性 设置为 false(默认值),则滚动区域会遵循其小部件的大小。”通过“它的小部件”,我假设它的意思是在滚动区域中查看的小部件。
然而,在下面的程序中,我在滚动区域内显示了一个图像标签,但滚动区域似乎并没有“尊重其小部件的大小”,因为图像从一开始就被部分隐藏了。
文档还说“不管这个 属性,您可以使用 widget()->resize()
以编程方式调整小部件的大小,滚动区域将自动调整为新的大小。”但是,我确实为查看的小部件调用调整大小,但没有任何反应。
文档还说“如果此 属性 设置为 true,滚动区域将自动调整小部件的大小,以避免在可以避免的地方出现滚动条,或者利用额外的 space。”但是,我没有看到任何调整大小,即使调整了小部件的大小也可以避免滚动条。
这是我将 属性 设置为 True
或 False
以及是否调用 widget().resize()
所看到的:
显然我一定遗漏了一些非常基本的东西;这是什么?
编辑:问题的主要目的是理解widgetResizable
是如何工作的以及它做了什么。使图像适合 window 是次要目标。
from PyQt5.QtCore import QSize
from PyQt5.QtGui import QImage, QPalette, QPixmap
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel, QScrollArea
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
image = QImage("happyguy.png")
imageLabel = QLabel()
imageLabel.setPixmap(QPixmap.fromImage(image))
scrollArea = QScrollArea()
scrollArea.setBackgroundRole(QPalette.Dark)
scrollArea.setWidget(imageLabel)
scrollArea.setWidgetResizable(True)
scrollArea.widget().resize(QSize(10, 10))
self.setCentralWidget(scrollArea)
app = QApplication([])
w = MainWindow()
w.show()
app.exec_()
这是 happyguy.pgn
文件:
可调整大小 不是 可滚动 ...
scrollArea.setWidgetResizable(True)
将imageLabel的调整大小控制权交给scrollArea。所以下一行 scrollArea.widget().resize(QSize(10, 10))
将被系统覆盖。
解决方案适用于 windows(调整主要 window 以适应图像大小)。
from PyQt5.QtGui import QImage, QPalette, QPixmap
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel, QScrollArea, QFrame
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
image = QImage("happyguy.png")
imageLabel = QLabel()
imageLabel.setPixmap(QPixmap.fromImage(image))
scrollArea = QScrollArea()
scrollArea.setFrameShape(QFrame.NoFrame)
scrollArea.setBackgroundRole(QPalette.Dark)
scrollArea.setWidget(imageLabel)
self.setCentralWidget(scrollArea)
self.resize(image.size())
app = QApplication([])
w = MainWindow()
w.show()
app.exec_()
或使用QScrollArea.setMinimumSize
from PyQt5.QtGui import QImage, QPalette, QPixmap
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel, QScrollArea, QFrame
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
image = QImage("happyguy.png")
imageLabel = QLabel()
imageLabel.setPixmap(QPixmap.fromImage(image))
scrollArea = QScrollArea()
scrollArea.setFrameShape(QFrame.NoFrame)
scrollArea.setBackgroundRole(QPalette.Dark)
scrollArea.setWidget(imageLabel)
scrollArea.setMinimumSize(image.size())
self.setCentralWidget(scrollArea)
app = QApplication([])
w = MainWindow()
w.show()
app.exec_()