📄 qwt_scale_widget.cpp
字号:
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
* Qwt Widget Library
* Copyright (C) 1997 Josef Wilgen
* Copyright (C) 2002 Uwe Rathmann
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the Qwt License, Version 1.0
*****************************************************************************/
// vim: expandtab
#include <qpainter.h>
#include <qevent.h>
#include "qwt_painter.h"
#include "qwt_color_map.h"
#include "qwt_scale_widget.h"
#include "qwt_scale_map.h"
#include "qwt_math.h"
#include "qwt_paint_buffer.h"
#include "qwt_scale_div.h"
#include "qwt_text.h"
class QwtScaleWidget::PrivateData
{
public:
PrivateData():
scaleDraw(NULL)
{
colorBar.colorMap = NULL;
colorBar.width = 10;
}
~PrivateData()
{
delete scaleDraw;
delete colorBar.colorMap;
}
QwtScaleDraw *scaleDraw;
int borderDist[2];
int minBorderDist[2];
int scaleLength;
int margin;
int penWidth;
int titleOffset;
int spacing;
QwtText title;
struct t_colorBar
{
bool isEnabled;
int width;
QwtDoubleInterval interval;
QwtColorMap *colorMap;
} colorBar;
};
/*!
\brief Create a scale with the position QwtScaleWidget::Left
\param parent Parent widget
*/
QwtScaleWidget::QwtScaleWidget(QWidget *parent):
QWidget(parent)
{
initScale(QwtScaleDraw::LeftScale);
}
#if QT_VERSION < 0x040000
/*!
\brief Create a scale with the position QwtScaleWidget::Left
\param parent Parent widget
\param name Object name
*/
QwtScaleWidget::QwtScaleWidget(QWidget *parent, const char *name):
QWidget(parent, name)
{
initScale(QwtScaleDraw::LeftScale);
}
#endif
/*!
\brief Constructor
\param align Alignment.
\param parent Parent widget
*/
QwtScaleWidget::QwtScaleWidget(
QwtScaleDraw::Alignment align, QWidget *parent):
QWidget(parent)
{
initScale(align);
}
//! Destructor
QwtScaleWidget::~QwtScaleWidget()
{
delete d_data;
}
//! Initialize the scale
void QwtScaleWidget::initScale(QwtScaleDraw::Alignment align)
{
d_data = new PrivateData;
#if QT_VERSION < 0x040000
setWFlags(Qt::WNoAutoErase);
#endif
d_data->borderDist[0] = 0;
d_data->borderDist[1] = 0;
d_data->minBorderDist[0] = 0;
d_data->minBorderDist[1] = 0;
d_data->margin = 4;
d_data->penWidth = 0;
d_data->titleOffset = 0;
d_data->spacing = 2;
d_data->scaleDraw = new QwtScaleDraw;
d_data->scaleDraw->setAlignment(align);
d_data->scaleDraw->setLength(10);
d_data->colorBar.colorMap = new QwtLinearColorMap();
d_data->colorBar.isEnabled = false;
d_data->colorBar.width = 10;
const int flags = Qt::AlignHCenter
#if QT_VERSION < 0x040000
| Qt::WordBreak | Qt::ExpandTabs;
#else
| Qt::TextExpandTabs | Qt::TextWordWrap;
#endif
d_data->title.setRenderFlags(flags);
d_data->title.setFont(font());
QSizePolicy policy(QSizePolicy::MinimumExpanding,
QSizePolicy::Fixed);
if ( d_data->scaleDraw->orientation() == Qt::Vertical )
policy.transpose();
setSizePolicy(policy);
#if QT_VERSION >= 0x040000
setAttribute(Qt::WA_WState_OwnSizePolicy, false);
#else
clearWState( WState_OwnSizePolicy );
#endif
}
void QwtScaleWidget::setTitle(const QString &title)
{
if ( d_data->title.text() != title )
{
d_data->title.setText(title);
layoutScale();
}
}
/*!
\brief Give title new text contents
\param title New title
\sa QwtScaleWidget::title
\warning The title flags are interpreted in
direction of the label, AlignTop, AlignBottom can't be set
as the title will always be aligned to the scale.
*/
void QwtScaleWidget::setTitle(const QwtText &title)
{
QwtText t = title;
const int flags = title.renderFlags() & ~(Qt::AlignTop | Qt::AlignBottom);
t.setRenderFlags(flags);
if (t != d_data->title)
{
d_data->title = t;
layoutScale();
}
}
/*!
Change the alignment
\param alignment New alignment
\sa QwtScaleWidget::alignment
*/
void QwtScaleWidget::setAlignment(QwtScaleDraw::Alignment alignment)
{
#if QT_VERSION >= 0x040000
if ( !testAttribute(Qt::WA_WState_OwnSizePolicy) )
#else
if ( !testWState( WState_OwnSizePolicy ) )
#endif
{
QSizePolicy policy(QSizePolicy::MinimumExpanding,
QSizePolicy::Fixed);
if ( d_data->scaleDraw->orientation() == Qt::Vertical )
policy.transpose();
setSizePolicy(policy);
#if QT_VERSION >= 0x040000
setAttribute(Qt::WA_WState_OwnSizePolicy, false);
#else
clearWState( WState_OwnSizePolicy );
#endif
}
if (d_data->scaleDraw)
d_data->scaleDraw->setAlignment(alignment);
layoutScale();
}
/*!
\return position
\sa QwtScaleWidget::setPosition
*/
QwtScaleDraw::Alignment QwtScaleWidget::alignment() const
{
if (!scaleDraw())
return QwtScaleDraw::LeftScale;
return scaleDraw()->alignment();
}
/*!
Specify distances of the scale's endpoints from the
widget's borders. The actual borders will never be less
than minimum border distance.
\param dist1 Left or top Distance
\param dist2 Right or bottom distance
\sa QwtScaleWidget::borderDist
*/
void QwtScaleWidget::setBorderDist(int dist1, int dist2)
{
if ( dist1 != d_data->borderDist[0] || dist2 != d_data->borderDist[1] )
{
d_data->borderDist[0] = dist1;
d_data->borderDist[1] = dist2;
layoutScale();
}
}
/*!
\brief Specify the margin to the colorBar/base line.
\param margin Margin
\sa QwtScaleWidget::margin
*/
void QwtScaleWidget::setMargin(int margin)
{
margin = qwtMax( 0, margin );
if ( margin != d_data->margin )
{
d_data->margin = margin;
layoutScale();
}
}
/*!
\brief Specify the distance between color bar, scale and title
\param spacing Spacing
\sa QwtScaleWidget::spacing
*/
void QwtScaleWidget::setSpacing(int spacing)
{
spacing = qwtMax( 0, spacing );
if ( spacing != d_data->spacing )
{
d_data->spacing = spacing;
layoutScale();
}
}
/*!
\brief Specify the width of the scale pen
\param width Pen width
\sa QwtScaleWidget::penWidth
*/
void QwtScaleWidget::setPenWidth(int width)
{
if ( width < 0 )
width = 0;
if ( width != d_data->penWidth )
{
d_data->penWidth = width;
layoutScale();
}
}
/*!
\brief Change the alignment for the labels.
\sa QwtScaleDraw::setLabelAlignment(), QwtScaleWidget::setLabelRotation()
*/
#if QT_VERSION < 0x040000
void QwtScaleWidget::setLabelAlignment(int alignment)
#else
void QwtScaleWidget::setLabelAlignment(Qt::Alignment alignment)
#endif
{
d_data->scaleDraw->setLabelAlignment(alignment);
layoutScale();
}
/*!
\brief Change the rotation for the labels.
See QwtScaleDraw::setLabelRotation().
\sa QwtScaleDraw::setLabelRotation(), QwtScaleWidget::setLabelFlags()
*/
void QwtScaleWidget::setLabelRotation(double rotation)
{
d_data->scaleDraw->setLabelRotation(rotation);
layoutScale();
}
/*!
\brief Set a scale draw
sd has to be created with new and will be deleted in
QwtScaleWidget::~QwtScale or the next call of QwtScaleWidget::setScaleDraw.
*/
void QwtScaleWidget::setScaleDraw(QwtScaleDraw *sd)
{
if ( sd == NULL || sd == d_data->scaleDraw )
return;
if ( d_data->scaleDraw )
sd->setAlignment(d_data->scaleDraw->alignment());
delete d_data->scaleDraw;
d_data->scaleDraw = sd;
layoutScale();
}
/*!
scaleDraw of this scale
\sa QwtScaleDraw::setScaleDraw
*/
const QwtScaleDraw *QwtScaleWidget::scaleDraw() const
{
return d_data->scaleDraw;
}
/*!
scaleDraw of this scale
\sa QwtScaleDraw::setScaleDraw
*/
QwtScaleDraw *QwtScaleWidget::scaleDraw()
{
return d_data->scaleDraw;
}
/*!
\return title
\sa QwtScaleWidget::setTitle
*/
QwtText QwtScaleWidget::title() const
{
return d_data->title;
}
/*!
\return start border distance
\sa QwtScaleWidget::setBorderDist
*/
int QwtScaleWidget::startBorderDist() const
{
return d_data->borderDist[0];
}
/*!
\return end border distance
\sa QwtScaleWidget::setBorderDist
*/
int QwtScaleWidget::endBorderDist() const
{
return d_data->borderDist[1];
}
/*!
\return margin
\sa QwtScaleWidget::setMargin
*/
int QwtScaleWidget::margin() const
{
return d_data->margin;
}
/*!
\return distance between scale and title
\sa QwtScaleWidget::setMargin
*/
int QwtScaleWidget::spacing() const
{
return d_data->spacing;
}
/*!
\return Scale pen width
\sa QwtScaleWidget::setPenWidth
*/
int QwtScaleWidget::penWidth() const
{
return d_data->penWidth;
}
/*!
\brief paintEvent
*/
void QwtScaleWidget::paintEvent(QPaintEvent *e)
{
const QRect &ur = e->rect();
if ( ur.isValid() )
{
#if QT_VERSION < 0x040000
QwtPaintBuffer paintBuffer(this, ur);
draw(paintBuffer.painter());
#else
QPainter painter(this);
draw(&painter);
#endif
}
}
/*!
\brief draw the scale
*/
void QwtScaleWidget::draw(QPainter *painter) const
{
painter->save();
QPen scalePen = painter->pen();
scalePen.setWidth(d_data->penWidth);
painter->setPen(scalePen);
#if QT_VERSION < 0x040000
d_data->scaleDraw->draw(painter, colorGroup());
#else
d_data->scaleDraw->draw(painter, palette());
#endif
painter->restore();
if ( d_data->colorBar.isEnabled && d_data->colorBar.width > 0 &&
d_data->colorBar.interval.isValid() )
{
drawColorBar(painter, colorBarRect(rect()));
}
QRect r = rect();
if ( d_data->scaleDraw->orientation() == Qt::Horizontal )
{
r.setLeft(r.left() + d_data->borderDist[0]);
r.setWidth(r.width() - d_data->borderDist[1]);
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -