Qwt:将 date/time 标签文本居中对齐在底轴上
Qwt : align center the date/time label text on an bottom axis
对于 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 不会更改刻度下标签的对齐方式。
你怎么看?
找到了!!!
而不是覆盖方法
代码:
切换视图
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,我希望时间和日期都位于底轴下方刻度线的中心,但时间仍然像这张照片一样位于左侧:
我试过用
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 不会更改刻度下标签的对齐方式。
你怎么看?
找到了!!!
而不是覆盖方法 代码: 切换视图
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 方法无法完成工作!!!