• 16651阅读
  • 15回复

Qt 怎样使字体随着外围矩形大小的改变而改变? [复制链接]

上一主题 下一主题
离线lclflash
 

只看楼主 倒序阅读 楼主  发表于: 2010-07-14
我想实现的效果是:当外围矩形的高变化了则字体的高度随着变化,但宽度不变。
一句话,就是字体随着矩形变化。
离线xtfllbl

只看该作者 1楼 发表于: 2010-07-14
字体大小由字号控制,矩形变化时你设置字号就是了,但是你要求字体单方向变化,这个有点难度,考虑一下把字画上去还是怎么的。
上海欢迎您
离线lclflash

只看该作者 2楼 发表于: 2010-07-14
回 1楼(xtfllbl) 的帖子
设置字号只能是字体成比例放大,以前我用VC已经实现过就是改变字体宽和高,但在QT里找了半天还是不知道怎么实现,大家帮帮忙呀!!! 我见过别人用QT已经实现了这个功能,就是不知道原理呀
离线sbtree
只看该作者 3楼 发表于: 2010-07-14
QFont中如下函数可以等比例改变字的大小:
void setPixelSize ( int pixelSize )
void setPointSize ( int pointSize )
void setPointSizeF ( qreal pointSize )
另外void QFont::setStretch ( int factor ) 可以只拉伸宽度,可以将原字体最小缩小到百分之一,最大到40倍
两种情况结合起来,几乎可以做到任意变化
windows 7 + VC++2008 + Qt4.5.2
离线lclflash

只看该作者 4楼 发表于: 2010-07-14
回 3楼(sbtree) 的帖子
我还是不太明白,如果只改变字体高度的话 应该怎么办呀?
离线sbtree
只看该作者 5楼 发表于: 2010-07-15
Re:回 3楼(sbtree) 的帖子
引用第4楼lclflash于2010-07-14 21:16发表的 回 3楼(sbtree) 的帖子 :
我还是不太明白,如果只改变字体高度的话 应该怎么办呀?


依据高度设置好字体大小之后可以得到设置后的文字占据的Rec的t宽度,然后用原始的宽度除以这个宽度到的结果再乘以stretch的返回值,作为新的stretch值传递给setStretch不就可以了吗?
windows 7 + VC++2008 + Qt4.5.2
离线lclflash

只看该作者 6楼 发表于: 2010-07-16
回 5楼(sbtree) 的帖子
十分感谢楼上回答!!!

但是我按着你的方法做的时候,运行结果不太正确 我的代码是这样的,请帮我看看是那的问题

    if(m_Rect.height()>0)///m_Rect 是文本的外围矩形
        {
            textfont.setPixelSize(m_Rect.height());
            QFontMetricsF fm2(textfont);
            qreal fontwidth = fm2.width(QObject::tr("默认文本"));
            qreal temp = m_Rect.width()/fontwidth ;
            qreal stretch = textfont.stretch();
            temp = temp * stretch ;
            textfont.setStretch(temp);
        }
离线sbtree
只看该作者 7楼 发表于: 2010-07-16
  1. QFontMetricsF fm1(textfont);
  2. qreal hRatio(m_rect.height() / m_originalRect.height()), wRatio(1.0); //高度变化比例和宽度变化比例
  3. if(textfont.pixelSize() > 0) textfont.setPixelSize(textfont.pixelSize() * hRatio);
  4. else if(textfont.pointSizeF() > 0) textfont.setPointSizeF(textfont.pointSizeF() * hRatio);
  5. else if(textfont.pointSize() > 0) textfont.setPointSize(textfont.pointSize() * hRatio);
  6. QFontMetricsF fm2(textfont);
  7. wRatio = fm1.width(text) / fm2.width(text);
  8. textfont.setStretch(wRatio * textfont.stretch());
  9. gsti->setFont(textfont);
windows 7 + VC++2008 + Qt4.5.2
离线lclflash

只看该作者 8楼 发表于: 2010-07-17
回 7楼(sbtree) 的帖子
十分感谢!!!
离线lclflash

只看该作者 9楼 发表于: 2010-07-17
回 6楼(lclflash) 的帖子
我试过了,还是不行 问题是当字体大小超过86时setStretch函数就不起作用了,我点阵字体跟矢量字体都试过了,不知道怎么回事。
离线sbtree
只看该作者 10楼 发表于: 2010-07-19
Re:回 6楼(lclflash) 的帖子
引用第9楼lclflash于2010-07-17 15:20发表的 回 6楼(lclflash) 的帖子 :
我试过了,还是不行 问题是当字体大小超过86时setStretch函数就不起作用了,我点阵字体跟矢量字体都试过了,不知道怎么回事。  

你这人看贴不仔细,我在3楼的回复就提醒你了
另外void QFont::setStretch ( int factor ) 可以只拉伸宽度,可以将原字体最小缩小到百分之一,最大到40倍
windows 7 + VC++2008 + Qt4.5.2
离线obama
只看该作者 11楼 发表于: 2010-07-19
例子:
int btFontsize = 1;
    while(true)
    {
        QFont tmp("微软雅黑", btFontsize, QFont::Bold);
        tmp.setPointSize(btFontsize);
        QFontMetricsF fm(tmp);
        qreal pixelsHigh = fm.height();
        if (pixelsHigh == heightOfBt)
            break;

        if (pixelsHigh > heightOfBt)
        {
            --btFontsize;
            break;
        }

        ++btFontsize;
    }
离线sbtree
只看该作者 12楼 发表于: 2010-07-19
引用第11楼obama于2010-07-19 10:30发表的  :
例子:
int btFontsize = 1;
    while(true)
    {
        QFont tmp("微软雅黑", btFontsize, QFont::Bold);
.......

你的方法太野蛮了,而且达不到他的要求。你这样做的最终结果还是等比例变化的,他的要求保持宽度不变,而只改变高度,也就是说每个字符可能被拉得细长,也可能被压成矮胖
windows 7 + VC++2008 + Qt4.5.2
离线obama
只看该作者 13楼 发表于: 2010-07-20
呵呵,我看他的标题直接回复的~
离线null1023

只看该作者 14楼 发表于: 2020-06-09
请问楼主,问题解决了吗?
离线snow_man_0

只看该作者 15楼 发表于: 2020-06-09
文字写在SVG图里,贴图就可以了
快速回复
限100 字节
 
上一个 下一个