计算 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);
但是,以下是您可能不想在生产代码中使用的一些原因:
- 样式表 - 当你的设计师给编辑一个 14px 的边框时会发生什么?
- Resizing - 你必须在每次调整大小时调整它,我发现在实践中这是一件很难跟踪的事情。如果在调整 GUI 大小时它会中断,这不是一个有用的功能。
- Content - 行编辑的宽度,尤其是用户可以输入文本的宽度,在逻辑上与用户可能需要输入的文本长度无关。这可能会成为让您的用户感到沮丧的任意约束。没有人喜欢水平滚动,但有时会有用例。
我创建了一些 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);
但是,以下是您可能不想在生产代码中使用的一些原因:
- 样式表 - 当你的设计师给编辑一个 14px 的边框时会发生什么?
- Resizing - 你必须在每次调整大小时调整它,我发现在实践中这是一件很难跟踪的事情。如果在调整 GUI 大小时它会中断,这不是一个有用的功能。
- Content - 行编辑的宽度,尤其是用户可以输入文本的宽度,在逻辑上与用户可能需要输入的文本长度无关。这可能会成为让您的用户感到沮丧的任意约束。没有人喜欢水平滚动,但有时会有用例。