📄 qwt_picker.cpp
字号:
{
if ( d_data->enabled != enabled )
{
d_data->enabled = enabled;
QWidget *w = parentWidget();
if ( w )
{
if ( enabled )
w->installEventFilter(this);
else
w->removeEventFilter(this);
}
updateDisplay();
}
}
/*!
\return true when enabled, false otherwise
\sa setEnabled, eventFilter()
*/
bool QwtPicker::isEnabled() const
{
return d_data->enabled;
}
/*!
Set the font for the tracker
\param font Tracker font
\sa trackerFont(), setTrackerMode(), setTrackerPen()
*/
void QwtPicker::setTrackerFont(const QFont &font)
{
if ( font != d_data->trackerFont )
{
d_data->trackerFont = font;
updateDisplay();
}
}
/*!
\return Tracker font
\sa setTrackerFont(), trackerMode(), trackerPen()
*/
QFont QwtPicker::trackerFont() const
{
return d_data->trackerFont;
}
/*!
Set the pen for the tracker
\param pen Tracker pen
\sa trackerPen(), setTrackerMode(), setTrackerFont()
*/
void QwtPicker::setTrackerPen(const QPen &pen)
{
if ( pen != d_data->trackerPen )
{
d_data->trackerPen = pen;
updateDisplay();
}
}
/*!
\return Tracker pen
\sa setTrackerPen(), trackerMode(), trackerFont()
*/
QPen QwtPicker::trackerPen() const
{
return d_data->trackerPen;
}
/*!
Set the pen for the rubberband
\param pen Rubberband pen
\sa rubberBandPen(), setRubberBand()
*/
void QwtPicker::setRubberBandPen(const QPen &pen)
{
if ( pen != d_data->rubberBandPen )
{
d_data->rubberBandPen = pen;
updateDisplay();
}
}
/*!
\return Rubberband pen
\sa setRubberBandPen(), rubberBand()
*/
QPen QwtPicker::rubberBandPen() const
{
return d_data->rubberBandPen;
}
/*!
\brief Return the label for a position
In case of HLineRubberBand the label is the value of the
y position, in case of VLineRubberBand the value of the x position.
Otherwise the label contains x and y position separated by a ',' .
The format for the string conversion is "%d".
\param pos Position
\return Converted position as string
*/
QwtText QwtPicker::trackerText(const QPoint &pos) const
{
QString label;
switch(rubberBand())
{
case HLineRubberBand:
label.sprintf("%d", pos.y());
break;
case VLineRubberBand:
label.sprintf("%d", pos.x());
break;
default:
label.sprintf("%d, %d", pos.x(), pos.y());
}
return label;
}
/*!
Draw a rubberband , depending on rubberBand() and selectionFlags()
\param painter Painter, initialized with clip rect
\sa rubberBand(), RubberBand, selectionFlags()
*/
void QwtPicker::drawRubberBand(QPainter *painter) const
{
if ( !isActive() || rubberBand() == NoRubberBand ||
rubberBandPen().style() == Qt::NoPen )
{
return;
}
const QRect &pRect = pickRect();
const QwtPolygon &pa = d_data->selection;
if ( selectionFlags() & PointSelection )
{
if ( pa.count() < 1 )
return;
const QPoint pos = pa[0];
switch(rubberBand())
{
case VLineRubberBand:
QwtPainter::drawLine(painter, pos.x(),
pRect.top(), pos.x(), pRect.bottom());
break;
case HLineRubberBand:
QwtPainter::drawLine(painter, pRect.left(),
pos.y(), pRect.right(), pos.y());
break;
case CrossRubberBand:
QwtPainter::drawLine(painter, pos.x(),
pRect.top(), pos.x(), pRect.bottom());
QwtPainter::drawLine(painter, pRect.left(),
pos.y(), pRect.right(), pos.y());
break;
default:
break;
}
}
else if ( selectionFlags() & RectSelection )
{
if ( pa.count() < 2 )
return;
QPoint p1 = pa[0];
QPoint p2 = pa[int(pa.count() - 1)];
if ( selectionFlags() & CenterToCorner )
{
p1.setX(p1.x() - (p2.x() - p1.x()));
p1.setY(p1.y() - (p2.y() - p1.y()));
}
else if ( selectionFlags() & CenterToRadius )
{
const int radius = qwtMax(qwtAbs(p2.x() - p1.x()),
qwtAbs(p2.y() - p1.y()));
p2.setX(p1.x() + radius);
p2.setY(p1.y() + radius);
p1.setX(p1.x() - radius);
p1.setY(p1.y() - radius);
}
#if QT_VERSION < 0x040000
const QRect rect = QRect(p1, p2).normalize();
#else
const QRect rect = QRect(p1, p2).normalized();
#endif
switch(rubberBand())
{
case EllipseRubberBand:
QwtPainter::drawEllipse(painter, rect);
break;
case RectRubberBand:
QwtPainter::drawRect(painter, rect);
break;
default:
break;
}
}
else if ( selectionFlags() & PolygonSelection )
{
if ( rubberBand() == PolygonRubberBand )
painter->drawPolyline(pa);
}
}
/*!
Draw the tracker
\param painter Painter
\sa trackerRect(), trackerText()
*/
void QwtPicker::drawTracker(QPainter *painter) const
{
const QRect textRect = trackerRect(painter);
if ( !textRect.isEmpty() )
{
QwtText label = trackerText(d_data->labelPosition);
if ( !label.isEmpty() )
{
#if defined(Q_WS_MAC)
#if QT_VERSION >= 0x040000
// Antialiased fonts are broken on the Mac.
painter->save();
painter->setRenderHint(QPainter::TextAntialiasing, false);
#else
QFont fnt = label.usedFont(painter->font());
fnt.setStyleStrategy(QFont::NoAntialias);
label.setFont(fnt);
#endif
#endif
label.draw(painter, textRect);
#if defined(Q_WS_MAC)
#if QT_VERSION >= 0x040000
painter->restore();
#endif
#endif
}
}
}
QRect QwtPicker::trackerRect(QPainter *painter) const
{
if ( trackerMode() == AlwaysOff ||
(trackerMode() == ActiveOnly && !isActive() ) )
{
return QRect();
}
if ( d_data->labelPosition.x() < 0 || d_data->labelPosition.y() < 0 )
return QRect();
QwtText text = trackerText(d_data->labelPosition);
if ( text.isEmpty() )
return QRect();
QRect textRect(QPoint(0, 0), text.textSize(painter->font()));
const QPoint &pos = d_data->labelPosition;
int alignment = 0;
if ( isActive() && d_data->selection.count() > 1
&& rubberBand() != NoRubberBand )
{
const QPoint last =
d_data->selection[int(d_data->selection.count()) - 2];
alignment |= (pos.x() >= last.x()) ? Qt::AlignRight : Qt::AlignLeft;
alignment |= (pos.y() > last.y()) ? Qt::AlignBottom : Qt::AlignTop;
}
else
alignment = Qt::AlignTop | Qt::AlignRight;
const int margin = 5;
int x = pos.x();
if ( alignment & Qt::AlignLeft )
x -= textRect.width() + margin;
else if ( alignment & Qt::AlignRight )
x += margin;
int y = pos.y();
if ( alignment & Qt::AlignBottom )
y += margin;
else if ( alignment & Qt::AlignTop )
y -= textRect.height() + margin;
textRect.moveTopLeft(QPoint(x, y));
int right = qwtMin(textRect.right(), pickRect().right() - margin);
int bottom = qwtMin(textRect.bottom(), pickRect().bottom() - margin);
textRect.moveBottomRight(QPoint(right, bottom));
int left = qwtMax(textRect.left(), pickRect().left() + margin);
int top = qwtMax(textRect.top(), pickRect().top() + margin);
textRect.moveTopLeft(QPoint(left, top));
return textRect;
}
/*!
\brief Event filter
When isEnabled() == true all events of the observed widget are filtered.
Mouse and keyboard events are translated into widgetMouse- and widgetKey-
and widgetWheel-events. Paint and Resize events are handled to keep
rubberband and tracker up to date.
\sa event(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
*/
bool QwtPicker::eventFilter(QObject *o, QEvent *e)
{
if ( o && o == parentWidget() )
{
switch(e->type())
{
case QEvent::Resize:
{
const QResizeEvent *re = (QResizeEvent *)e;
if ( d_data->resizeMode == Stretch )
stretchSelection(re->oldSize(), re->size());
if ( d_data->rubberBandWidget )
d_data->rubberBandWidget->resize(re->size());
if ( d_data->trackerWidget )
d_data->trackerWidget->resize(re->size());
break;
}
case QEvent::Leave:
widgetLeaveEvent(e);
break;
case QEvent::MouseButtonPress:
widgetMousePressEvent((QMouseEvent *)e);
break;
case QEvent::MouseButtonRelease:
widgetMouseReleaseEvent((QMouseEvent *)e);
break;
case QEvent::MouseButtonDblClick:
widgetMouseDoubleClickEvent((QMouseEvent *)e);
break;
case QEvent::MouseMove:
widgetMouseMoveEvent((QMouseEvent *)e);
break;
case QEvent::KeyPress:
widgetKeyPressEvent((QKeyEvent *)e);
break;
case QEvent::KeyRelease:
widgetKeyReleaseEvent((QKeyEvent *)e);
break;
case QEvent::Wheel:
widgetWheelEvent((QWheelEvent *)e);
break;
default:
break;
}
}
return false;
}
/*!
Handle a mouse press event for the observed widget.
Begin and/or end a selection depending on the selection flags.
\sa QwtPicker, selectionFlags()
\sa eventFilter(), widgetMouseReleaseEvent(),
widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
*/
void QwtPicker::widgetMousePressEvent(QMouseEvent *e)
{
transition(e);
}
/*!
Handle a mouse move event for the observed widget.
Move the last point of the selection in case of isActive() == true
\sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
widgetMouseDoubleClickEvent(),
widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
*/
void QwtPicker::widgetMouseMoveEvent(QMouseEvent *e)
{
if ( pickRect().contains(e->pos()) )
d_data->labelPosition = e->pos();
else
d_data->labelPosition = QPoint(-1, -1);
if ( !isActive() )
updateDisplay();
transition(e);
}
/*!
Handle a leave event for the observed widget.
\sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
widgetMouseDoubleClickEvent(),
widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
*/
void QwtPicker::widgetLeaveEvent(QEvent *)
{
d_data->labelPosition = QPoint(-1, -1);
if ( !isActive() )
updateDisplay();
}
/*!
Handle a mouse relase event for the observed widget.
End a selection depending on the selection flags.
\sa QwtPicker, selectionFlags()
\sa eventFilter(), widgetMousePressEvent(),
widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
*/
void QwtPicker::widgetMouseReleaseEvent(QMouseEvent *e)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -