PyQt中sizeHint返回值异常求助:固定尺寸按钮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
相关产品推荐
相关产品推荐

