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

如何将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()直接控制,而是由其内部的内容最小尺寸决定。要实现需求,需通过以下两步:

  1. 计算3个数字字符的宽度:利用QFontMetrics获取当前字体下3个数字(如"000")的像素宽度,以此作为文本框的最小宽度基准。
  2. 设置尺寸策略:将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:20:21