计算 QLineEdit 的最大长度以适应其宽度

Calculate max length of QLineEdit to suit its width

我创建了一些 QLineEdit,它们有不同的大小。

我想设置它们的最大长度以适应它们的宽度。

具体一点:比如宽度为50,我只允许输入7个字符左右,因为每个字符的大小不一样。

如何准确计算所需的最大长度?

使用 QFontMetrics:

QFontMetrics fm(QApplication::font());  // You can use any font here.

int stringWidth = fm.width("Some string");

编辑:

首先,您必须知道 QLineEdit 何时调整大小。因此,您可以派生自己的 class 并重新实现 resizeEvent() 方法,或者您可以使用 事件过滤器 .

然后创建一个特殊的验证器:

class CLengthValidator : public  QValidator
{
public:
    CLenghtValidator(QObject* parent, const QFont & font) 
        :    QValidator(parent), m_maxw(0), m_fm(font)
    {}

    void setMaxValidWidth(int width)
    {
        m_maxw = width;
    }

    State validate(QString & input, int & pos) const override
    {
        int stringWidth = m_fm.width(input);
        if (stringWidth <= m_maxw)
            return Acceptable;
        else
            return Invalid;
    }

private:
    int m_maxw;
    QFontMetrics m_fm;
}

将验证器设置为您的行编辑(使用 QLineEdit::setValidator() 方法):

lineEdit->setValidator(new CLengthValidator(lineEdit, lineEdit->font()));

现在,每次调整行编辑大小时,您都必须以当前行编辑宽度作为参数调用CLengthValidator::setMaxValidWidth()方法。您将在重新实现的 QLineEdit::resizeEvent() 方法或事件过滤器中执行此操作。

这样你将得到一个行编辑,只接受宽度不大于实际行编辑宽度的字符串。

您可以根据 myLineEdit 的宽度设置一个限制,这样它将能够容纳所有不超过该限制的字符:

#include <QFontMetrics>
#include <QLineEdit>

QLineEdit myLineEdit;

// get max character width of the line edit's font
int maxWidth = QFontMetrics(myLineEdit->font()).maxWidth();

// find the character limit based on the max width
int charlimit = myLineEdit.width() / maxWidth;

// set the character limit on the line edit
myLineEdit->setMaxLength(charlimit);

但是,以下是您可能不想在生产代码中使用的一些原因:

  1. 样式表 - 当你的设计师给编辑一个 14px 的边框时会发生什么?
  2. Resizing - 你必须在每次调整大小时调整它,我发现在实践中这是一件很难跟踪的事情。如果在调整 GUI 大小时它会中断,这不是一个有用的功能。
  3. Content - 行编辑的宽度,尤其是用户可以输入文本的宽度,在逻辑上与用户可能需要输入的文本长度无关。这可能会成为让您的用户感到沮丧的任意约束。没有人喜欢水平滚动,但有时会有用例。