查看完整版本: [-- Qt 怎样使字体随着外围矩形大小的改变而改变? --]

QTCN开发网 -> Qt基础编程 -> Qt 怎样使字体随着外围矩形大小的改变而改变? [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

lclflash 2010-07-14 09:13

Qt 怎样使字体随着外围矩形大小的改变而改变?

我想实现的效果是:当外围矩形的高变化了则字体的高度随着变化,但宽度不变。
一句话,就是字体随着矩形变化。

xtfllbl 2010-07-14 10:56
字体大小由字号控制,矩形变化时你设置字号就是了,但是你要求字体单方向变化,这个有点难度,考虑一下把字画上去还是怎么的。

lclflash 2010-07-14 11:31
设置字号只能是字体成比例放大,以前我用VC已经实现过就是改变字体宽和高,但在QT里找了半天还是不知道怎么实现,大家帮帮忙呀!!! 我见过别人用QT已经实现了这个功能,就是不知道原理呀

sbtree 2010-07-14 18:03
QFont中如下函数可以等比例改变字的大小:
void setPixelSize ( int pixelSize )
void setPointSize ( int pointSize )
void setPointSizeF ( qreal pointSize )
另外void QFont::setStretch ( int factor ) 可以只拉伸宽度,可以将原字体最小缩小到百分之一,最大到40倍
两种情况结合起来,几乎可以做到任意变化

lclflash 2010-07-14 21:16
我还是不太明白,如果只改变字体高度的话 应该怎么办呀?

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


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

lclflash 2010-07-16 16:02
十分感谢楼上回答!!!

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

    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 2010-07-16 17:45

  1. QFontMetricsF fm1(textfont);
    qreal hRatio(m_rect.height() / m_originalRect.height()), wRatio(1.0); //高度变化比例和宽度变化比例
    if(textfont.pixelSize() > 0) textfont.setPixelSize(textfont.pixelSize() * hRatio);
    else if(textfont.pointSizeF() > 0) textfont.setPointSizeF(textfont.pointSizeF() * hRatio);
    else if(textfont.pointSize() > 0) textfont.setPointSize(textfont.pointSize() * hRatio);

    QFontMetricsF fm2(textfont);
    wRatio = fm1.width(text) / fm2.width(text);
    textfont.setStretch(wRatio * textfont.stretch());
    gsti->setFont(textfont);

lclflash 2010-07-17 12:41
十分感谢!!!

lclflash 2010-07-17 15:20
我试过了,还是不行 问题是当字体大小超过86时setStretch函数就不起作用了,我点阵字体跟矢量字体都试过了,不知道怎么回事。

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

你这人看贴不仔细,我在3楼的回复就提醒你了
另外void QFont::setStretch ( int factor ) 可以只拉伸宽度,可以将原字体最小缩小到百分之一,最大到40倍

obama 2010-07-19 10:30
例子:
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 2010-07-19 20:38
引用第11楼obama于2010-07-19 10:30发表的  :
例子:
int btFontsize = 1;
    while(true)
    {
        QFont tmp("微软雅黑", btFontsize, QFont::Bold);
.......

你的方法太野蛮了,而且达不到他的要求。你这样做的最终结果还是等比例变化的,他的要求保持宽度不变,而只改变高度,也就是说每个字符可能被拉得细长,也可能被压成矮胖

obama 2010-07-20 08:35
呵呵,我看他的标题直接回复的~

null1023 2020-06-09 15:28
请问楼主,问题解决了吗?

snow_man_0 2020-06-09 22:24
文字写在SVG图里,贴图就可以了


查看完整版本: [-- Qt 怎样使字体随着外围矩形大小的改变而改变? --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled