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

时间:2016-04-01 10:18:54

标签: c++ qt qlineedit

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

我想设置那些适合它们宽度的最大长度。

更具体一点:例如,宽度为50,我只允许输入大约7个字符,因为每个字符的大小不同。

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

2 个答案:

答案 0 :(得分:2)

使用QFontMetrics

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

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

修改

首先,您必须知道QLineEdit何时调整大小。因此,您可以派生自己的类并重新实现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()方法或事件过滤器中执行此操作。

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

答案 1 :(得分:2)

您可以根据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. 调整大小 - 你必须在每次调整大小时调整它,我发现在实践中跟踪是一件非常困难的事情。如果GUI调整大小时它就会中断,这不是一个有用的功能。
  3. 内容 - 行编辑的宽度,尤其是用户可以输入文本的宽度,与用户可能需要输入的文本长度在逻辑上无关。这可能会成为一个让用户感到沮丧的任意约束。没有人喜欢水平滚动,但有时会有用例。