Qwt:将日期/时间标签文本在底部轴上对齐

Posted

技术标签:

【中文标题】Qwt:将日期/时间标签文本在底部轴上对齐【英文标题】:Qwt : align center the date/time label text on an bottom axis 【发布时间】:2018-07-18 18:07:25 【问题描述】:

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

我尝试过使用

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】:

找到了!!!

而不是重写方法 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 方法不能胜任!!!

【讨论】:

以上是关于Qwt:将日期/时间标签文本在底部轴上对齐的主要内容,如果未能解决你的问题,请参考以下文章

如何在水平 UIStackView 中对齐两个标签的底部?

如何从底部对齐 UILabel 文本?

Qwt 关闭轴标签的科学记数法

matplotlib 刻度标签锚 - 右对齐刻度标签(在右侧轴上)并将刻度标签的左(西)侧“剪辑”到轴

自动布局对齐问题

仅在高度不同时将图像垂直对齐到画廊底部