Qt:了解 QScrollArea::widgetResizable 属性

问题描述

我正在试验 Qt 5 QScrollArea(在 Python 和 PyQt 中,但我相信这个问题同样适用于 C++ Qt)。

QScrollArea::widgetResizableQt documentation 表示“如果此属性设置为 false(认值),滚动区域将遵循其小部件的大小。”我认为“它的小部件”是指在滚动区域中查看的小部件。

然而,在下面的程序中,我在滚动区域内显示一个图像标签,但滚动区域似乎并没有“尊重其小部件的大小”,因为图像从一开始就被部分隐藏了。

文档还说“无论此属性如何,您都可以使用 widget()->resize() 以编程方式调整小部件的大小,滚动区域将自动调整为新大小。”但是,我确实为查看的小部件调用了调整大小,但没有任何反应。

文档还说“如果此属性设置为 true,滚动区域将自动调整小部件的大小,以避免滚动条出现在可以避免的地方,或者利用额外的空间。”但是,我没有看到任何调整大小,即使调整了小部件的大小,也可以避免滚动条。

这是我将属性设置为 TrueFalse 以及是否调用 widget().resize() 所看到的:

enter image description here

显然我在这里遗漏了一些非常基本的东西;是什么?

编辑:问题的主要目的是了解 widgetResizable 的工作原理和作用。使图像适合窗口是次要目标。

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 文件

happyguy.pgn

解决方法

INFO A client connected: d3YK_d77joECEYg= INFO Received a command: commandToSend INFO Inside echo now... INFO Successfully echoed the command. Data: {} INFO Successfully echoed the command. Data: {} 将 imageLabel 的大小调整控制权交给 scrollArea。所以下一行 scrollArea.setWidgetResizable(True) 将被系统覆盖。

一个适用于 Windows 的解决方案(调整主窗口以适应图像大小)。

scrollArea.widget().resize(QSize(10,10))

使用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
,

可调整大小不是可滚动 ...