如何将QLineEdit最小宽度设置为3个字符的宽度?
问题
使用示例代码创建的4个QLineEdit文本框可随主窗口水平拉伸,但缩小窗口时无法进一步缩小。这些文本框最多只需容纳3个字符,调用minimumWidth()返回值为0,无法直接调整最小宽度。如何实现可拉伸且最小宽度为当前字体下3个数字字符宽度的QLineEdit?
示例代码:
import sys from PyQt5.QtCore import QSize, Qt from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QHBoxLayout, QWidget, QLineEdit class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("My App") vlay = QVBoxLayout() hbox = QHBoxLayout() self.le1 = QLineEdit("192") self.le2 = QLineEdit("168") self.le3 = QLineEdit("1") self.le4 = QLineEdit("1") print(f"{self.le1.minimumWidth()=}") hbox.addWidget(self.le1) hbox.addWidget(self.le2) hbox.addWidget(self.le3) hbox.addWidget(self.le4) vlay.addLayout(hbox) centralWidget = QWidget() centralWidget.setLayout(vlay) self.setCentralWidget(centralWidget) app = QApplication(sys.argv) window = MainWindow() window.show() app.exec()
解决方案
QLineEdit的默认最小宽度并非由minimumWidth()直接控制,而是由其内部的内容最小尺寸决定。要实现需求,需通过以下两步:
- 计算3个数字字符的宽度:利用
QFontMetrics获取当前字体下3个数字(如"000")的像素宽度,以此作为文本框的最小宽度基准。 - 设置尺寸策略:将QLineEdit的尺寸策略设为
Expanding,确保其能随窗口拉伸,同时绑定计算出的最小宽度。
修改后的完整代码:
import sys from PyQt5.QtCore import QSize, Qt from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QHBoxLayout, QWidget, QLineEdit, QSizePolicy class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("My App") vlay = QVBoxLayout() hbox = QHBoxLayout() # 计算当前字体下3个数字的宽度,额外加边距避免字符贴边 sample_text = "000" font_metrics = QLineEdit().fontMetrics() min_width = font_metrics.width(sample_text) + 8 # 创建文本框并设置属性 line_edits = [ QLineEdit("192"), QLineEdit("168"), QLineEdit("1"), QLineEdit("1") ] for le in line_edits: le.setMinimumWidth(min_width) # 水平方向可拉伸,垂直方向保持固定高度 le.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) hbox.addWidget(le) vlay.addLayout(hbox) centralWidget = QWidget() centralWidget.setLayout(vlay) self.setCentralWidget(centralWidget) app = QApplication(sys.argv) window = MainWindow() window.show() app.exec()
关键细节说明
QFontMetrics.width(sample_text):精准计算指定文本在当前字体下的显示宽度,数字字符宽度一致,用"000"即可代表3个数字的宽度。- 额外添加8像素边距:避免文本框缩到最小时,字符紧贴边框,提升视觉体验。
QSizePolicy.Expanding:让文本框在水平方向上尽可能占据可用空间,实现拉伸效果;垂直方向设为Fixed保持原高度。
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

