注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙漠里de烟雨

原创分享,禁止转载

 
 
 

日志

 
 

Qt c++ 计算Qlabel在定义了setWordWrap(true)后计算字符串所占高度  

2017-05-18 01:29:20|  分类: QT5.x与QML |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
m_content = new QLabel(this);
m_content->setMinimumSize(200,20);
m_content->setWordWrap(true); //自动换行;
QFont font("times", 10);
m_content->setFont(font);
m_content->adjustSize();
m_content->setAlignment(Qt::AlignTop);

int contentWidth = m_content->width();
int rows =  contentRows(content,contentWidth);
int contentHeight = (m_content->fontMetrics().height()+2) * rows;
m_content->resize(contentWidth+3,contentHeight);


int contentRows(const QString &text,int& ctrWidth) //注: 第2个参数为引用;
{
    if(text.isEmpty() || ctrWidth<10 && charWidth<10) //文本为空或窗体太小或字符宽度太小;
        return 1;

    QFontMetrics fm(m_content->font());
    if(fm.width(text) <= ctrWidth) //全部字符串长度<窗体宽度;
        return 1;

    //首先查找最长的单词word,如果窗体长度<最长单词的长度,改变窗体的宽度来适应这个单词;为简化,只以空格为界定符;
    QStringList str = text.split(' ');
    int wordMaxLen = 0;
    for(int i=0;i<str.length();i++)
    {
        QString t = str.at(i);
        t = t.trimmed();
        if(!t.isEmpty())
        {
            int strWidth = fm.width(t);
            if(strWidth>wordMaxLen)
                wordMaxLen = strWidth;
        }
    }
    if(wordMaxLen > ctrWidth)
        ctrWidth = wordMaxLen; //改变窗体的宽度值;
    int lineLen = 0; //从窗体头到当前位置的字符像素长度;
    int wordLen = 0; //单词的像素长度;
    int rows = 1;//开始计算需要多少行;
    for(int i=0;i<text.length();i++)
    {
        QChar ch = text.at(i);
        if(ch == '\n')
        {
            lineLen = 0;
            wordLen = 0;
            rows++;
        }
        else
        {
            lineLen += fm.width(ch);
            if(ch.isSpace()) //为空格;
            {
                wordLen = 0; //遇到空格,则前面的单词结束;
                if(lineLen >= ctrWidth) //最后一个字符为空格则换行;
                {
                    lineLen = 0;
                    rows++;
                }
            }
            else //非空格;
            {
                wordLen += fm.width(ch); //遇到非空格,累记单词长度;
                if(lineLen >= ctrWidth) //最后一个字符为非空格;
                {
                   if(i < text.length()-1) //文本未结束;
                    {
                        rows++;
                        if(text.at(i+1).isSpace()) //下一个为空格;
                        {
                            lineLen = 0;
                            wordLen = 0;
                        }
                        else //完整单词,需要移动到下一行;
                        {
                            lineLen = wordLen;
                        }
                    }
                }
            }
        }
    }
    return rows;
}
  评论这张
 
阅读(12)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017