我创建了一些大小不同的QLineEdit
。
我想设置它们的最大长度以适应它们的宽度。
要更具体一些:例如,宽度为50的,我只允许输入大约7个字符,因为每个字符的大小不同。
如何准确地计算所需的最大长度?
发布于 2016-04-01 11:05:47
您可以根据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);
但是,下面是一些您可能不想在生产代码中使用的原因:
发布于 2016-04-01 10:53:50
使用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()
方法或事件筛选器中这样做。
这样,您将得到一行编辑,只接受宽度不大于实际行编辑宽度的字符串。
https://stackoverflow.com/questions/36353763
复制相似问题