首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算QLineEdit的最大长度以适应其宽度

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

Stack Overflow用户
提问于 2016-04-01 10:18:53
回答 2查看 2.3K关注 0票数 2

我创建了一些大小不同的QLineEdit

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-01 11:05:47

您可以根据myLineEdit的宽度设置一个限制,这样通过这样做,它将能够满足所有字符的限制:

代码语言:javascript
运行
复制
#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. 样式表-当您的设计人员给编辑一个14 the边框时会发生什么?
  2. 调整大小--你必须在每一次调整尺寸时调整它,我发现在实践中这是一件很难跟踪的事情。如果GUI在调整大小时中断,那么它就不是一个有用的特性。
  3. 内容-行编辑的宽度,尤其是用户可以输入文本的宽度,在逻辑上与用户可能需要输入的文本长度无关。这可能成为一个任意的限制,使您的用户感到沮丧。没有人喜欢水平滚动,但有时会有用例。
票数 2
EN

Stack Overflow用户

发布于 2016-04-01 10:53:50

使用QFontMetrics

代码语言:javascript
运行
复制
QFontMetrics fm(QApplication::font());  // You can use any font here.

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

编辑:

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

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

代码语言:javascript
运行
复制
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()方法):

代码语言:javascript
运行
复制
lineEdit->setValidator(new CLengthValidator(lineEdit, lineEdit->font()));

现在,每次调整行编辑的大小时,都必须使用当前行编辑宽度作为参数调用CLengthValidator::setMaxValidWidth()方法。您将在重新实现的QLineEdit::resizeEvent()方法或事件筛选器中这样做。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36353763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档