You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt中sizeHint返回值异常求助:固定尺寸按钮sizeHint值不变

QPushButton的sizeHint返回值异常问题:固定尺寸不影响返回值

我尝试编写一个简单的类,实现主窗口随中心部件调整大小的功能。但发现QPushButton的sizeHint()返回值存在异常:无论设置何种固定尺寸,甚至修改按钮文本,sizeHint()始终返回相同的PyQt5.QtCore.QSize(112, 34),与按钮实际尺寸不符。

相关代码

from PyQt5.QtWidgets import QApplication, QTextEdit, QMainWindow, QVBoxLayout, QPushButton, QWidget, QSizePolicy


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

        self.layout = QVBoxLayout(self)
        self.layout.activate()
        # add a button

        self.button = QPushButton("Hello Wolrd", self)
        self.button.setFixedSize(600, 200)  # 设置宽度600像素,高度200像素
        self.button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.button.clicked.connect(self.resize_fun)
        self.layout.addWidget(self.button)

        container = QWidget()
        container.setLayout(self.layout)
        self.setCentralWidget(container)

        print(self.button.sizeHint())

    def resize_fun(self):
        self.button.setFixedSize(200, 100)
        print(self.button.sizeHint())

app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
window.resize_fun()

输出结果

点击按钮前:PyQt5.QtCore.QSize(112, 34)
点击按钮后:PyQt5.QtCore.QSize(112, 34)


问题原因与解决方法

原因分析

sizeHint()返回的是控件的推荐尺寸,由控件内容(文本、图标)和样式规则决定,和手动设置的固定尺寸没有关联。调用setFixedSize()只是强制控件显示为指定尺寸,但不会改变控件内部计算的推荐尺寸值。

解决方法

如果需要获取按钮的实际显示尺寸,应使用以下方法替代sizeHint():

  • self.button.size():返回控件当前的实际尺寸(QSize对象)
  • self.button.width() / self.button.height():分别获取宽度和高度数值

另外,原代码存在布局绑定错误:初始化时将QVBoxLayout直接绑定到MainWindow实例,之后又将该布局重新设置给container widget,这会导致布局归属混乱。正确做法是直接为container创建布局,修改后的代码如下:

from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QPushButton, QWidget, QSizePolicy


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

        container = QWidget()
        self.layout = QVBoxLayout(container)  # 直接为container创建布局

        self.button = QPushButton("Hello World", self)
        self.button.setFixedSize(600, 200)
        self.button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.button.clicked.connect(self.resize_fun)
        self.layout.addWidget(self.button)

        self.setCentralWidget(container)

        # 输出实际尺寸而非推荐尺寸
        print(self.button.size())

    def resize_fun(self):
        self.button.setFixedSize(200, 100)
        # 输出实际尺寸
        print(self.button.size())

app = QApplication([])
window = MainWindow()
window.show()
app.exec_()

修改后运行输出:

点击按钮前:PyQt5.QtCore.QSize(600, 200)
点击按钮后:PyQt5.QtCore.QSize(200, 100)


内容的提问来源于stack exchange,提问作者Wolfgang Wenzel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:27:46