我创建了一些QLineEdit
,它们的大小不同。
我想设置那些适合它们宽度的最大长度。
更具体一点:例如,宽度为50,我只允许输入大约7个字符,因为每个字符的大小不同。
如何准确计算所需的最大长度?
答案 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);
但是,以下是您可能不希望在生产代码中使用的一些原因: