C++ Qwt:将日期/时间标签文本在底轴上居中对齐
对于Qwt,我希望时间和日期都位于底部轴下刻度的中心,但时间仍然位于左侧,如图所示: 我试着用C++ Qwt:将日期/时间标签文本在底轴上居中对齐,c++,label,qwt,C++,Label,Qwt,对于Qwt,我希望时间和日期都位于底部轴下刻度的中心,但时间仍然位于左侧,如图所示: 我试着用 QwtDateScaleDraw::setLabelAlignment(Qt::AlignHCenter|Qt::AlignBottom); 但时间仍然在左边 我尝试将QwtScaleDraw分为以下子类: class MyDateScaleDraw:public QwtDateScaleDraw { public: QwtText label(double value) const ov
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 );
}
const QwtText&QwtAbstractScaleDraw::ticklab(const QFont&font,双值)const
{
QMap::const\u迭代器it=d\u data->labelCache.find(值);
if(it==d_data->labelCache.end())
{
QwtText lbl=标签(值);
lbl.setRenderFlags(0);
lbl.setLayoutAttribute(QwtText::MinimumLayout);
(void)lbl.textSize(font);//初始化内部缓存
it=d_data->labelCache.insert(值,lbl);
}
返回(*it);
}
我想,正是这种方法生成了QwtText标签
第8行似乎将渲染标志设置为“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();
}
void drawLabel(QPainter*painter,双值)常量覆盖
{
QwtText lbl=勾选标签(画师->字体(),值);
if(lbl.isEmpty())
返回;
setRenderFlags(Qt::AlignCenter);//font());
常量QTTransform transform=标签转换(pos,labelSize);
画师->保存();
画家->设置世界变换(变换,真);
lbl.draw(painter,QRect(QPoint(0,0),labelSize.toSize());
画师->还原();
}
要复制到剪贴板,请将视图切换到纯文本模式
而之后的标签才是真正的中心
setRenderFlags方法无法完成此任务强>