Qwt:将日期/时间标签文本居中对齐

时间:2018-07-18 18:07:26

标签: c++ label qwt

对于Qwt,我希望时间和日期都位于底轴下方刻度线的中心,但时间仍在左侧,如该图所示:

enter image description here

我尝试使用

QwtDateScaleDraw::setLabelAlignment(Qt::AlignHCenter|Qt::AlignBottom);

但是时间仍然在左边。

我试图像这样子化QwtScaleDraw的子类:

class MyDateScaleDraw:public QwtDateScaleDraw
{
public:
    QwtText label(double value) const override
    {
        QwtText txt=QwtDateScaleDraw::label(value);
        txt.setRenderFlags(Qt::AlignHCenter);
        return txt;
    }
};

但是时间仍然在左侧。

有人知道如何将时间居中吗?

更新:

我在Qwt的源代码中发现了这一点

const QwtText &QwtAbstractScaleDraw::tickLabel(const QFont &font, double value ) const
{
    QMap<double, QwtText>::const_iterator it = d_data->labelCache.find( value );
    if ( it == d_data->labelCache.end() )
    {
        QwtText lbl = label( value );
        lbl.setRenderFlags( 0 );
        lbl.setLayoutAttribute( QwtText::MinimumLayout );

        ( void )lbl.textSize( font ); // initialize the internal cache

        it = d_data->labelCache.insert( value, lbl );
    }

    return ( *it );
}

我猜这是生成QwtText标签的方法。

似乎第8行将渲染标志设置为“ 0”。可能就是为什么更改标签的renderFlags不会更改刻度线下标签的对齐方式。

您怎么看?

1 个答案:

答案 0 :(得分:0)

找到了!!!

代替覆盖方法 Qt代码: 切换视图

label(double value)

要复制到剪贴板,请将视图切换为纯文本模式

我必须重写QwtDateScaleDraw的drawLabel方法:

void drawLabel( QPainter *painter, double value ) const override
        {
                QwtText lbl = tickLabel( painter->font(), value );
                if ( lbl.isEmpty() )
                    return;

                lbl.setRenderFlags(Qt::AlignCenter); //<---- add this line 

                QPointF pos = labelPosition( value );

                QSizeF labelSize = lbl.textSize( painter->font() );

                const QTransform transform = labelTransformation( pos, labelSize );

                painter->save();
                painter->setWorldTransform( transform, true );

                lbl.draw ( painter, QRect( QPoint( 0, 0 ), labelSize.toSize() ) );

                painter->restore();

        }

要复制到剪贴板,请将视图切换为纯文本模式

在标签真正居中之后!

setRenderFlags方法无法完成任务!