📄 qwt_picker.cpp
字号:
transition(e);
}
/*!
Handle mouse double click event for the observed widget.
Empty implementation, does nothing.
\sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
widgetMouseMoveEvent(),
widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
*/
void QwtPicker::widgetMouseDoubleClickEvent(QMouseEvent *me)
{
transition(me);
}
/*!
Handle a wheel event for the observed widget.
Move the last point of the selection in case of isActive() == true
\sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
widgetKeyPressEvent(), widgetKeyReleaseEvent()
*/
void QwtPicker::widgetWheelEvent(QWheelEvent *e)
{
if ( pickRect().contains(e->pos()) )
d_data->labelPosition = e->pos();
else
d_data->labelPosition = QPoint(-1, -1);
updateDisplay();
transition(e);
}
/*!
Handle a key press event for the observed widget.
Selections can be completely done by the keyboard. The arrow keys
move the cursor, the abort key aborts a selection. All other keys
are handled by the current state machine.
\sa QwtPicker, selectionFlags()
\sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
widgetWheelEvent(), widgetKeyReleaseEvent(), stateMachine(),
QwtEventPattern::KeyPatternCode
*/
void QwtPicker::widgetKeyPressEvent(QKeyEvent *ke)
{
int dx = 0;
int dy = 0;
int offset = 1;
if ( ke->isAutoRepeat() )
offset = 5;
if ( keyMatch(KeyLeft, ke) )
dx = -offset;
else if ( keyMatch(KeyRight, ke) )
dx = offset;
else if ( keyMatch(KeyUp, ke) )
dy = -offset;
else if ( keyMatch(KeyDown, ke) )
dy = offset;
else if ( keyMatch(KeyAbort, ke) )
{
if ( d_data->stateMachine )
d_data->stateMachine->reset();
if (isActive())
end(false);
}
else
transition(ke);
if ( dx != 0 || dy != 0 )
{
const QRect rect = pickRect();
const QPoint pos = parentWidget()->mapFromGlobal(QCursor::pos());
int x = pos.x() + dx;
x = qwtMax(rect.left(), x);
x = qwtMin(rect.right(), x);
int y = pos.y() + dy;
y = qwtMax(rect.top(), y);
y = qwtMin(rect.bottom(), y);
QCursor::setPos(parentWidget()->mapToGlobal(QPoint(x, y)));
}
}
/*!
Handle a key release event for the observed widget.
Passes the event to the state machine.
\sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
widgetWheelEvent(), widgetKeyPressEvent(), stateMachine()
*/
void QwtPicker::widgetKeyReleaseEvent(QKeyEvent *ke)
{
transition(ke);
}
/*!
Passes an event to the state machine and executes the resulting
commands. Append and Move commands use the current position
of the cursor (QCursor::pos()).
\param e Event
*/
void QwtPicker::transition(const QEvent *e)
{
if ( !d_data->stateMachine )
return;
QwtPickerMachine::CommandList commandList =
d_data->stateMachine->transition(*this, e);
QPoint pos;
switch(e->type())
{
case QEvent::MouseButtonDblClick:
case QEvent::MouseButtonPress:
case QEvent::MouseButtonRelease:
case QEvent::MouseMove:
{
const QMouseEvent *me = (QMouseEvent *)e;
pos = me->pos();
break;
}
default:
pos = parentWidget()->mapFromGlobal(QCursor::pos());
}
for ( uint i = 0; i < (uint)commandList.count(); i++ )
{
switch(commandList[i])
{
case QwtPickerMachine::Begin:
{
begin();
break;
}
case QwtPickerMachine::Append:
{
append(pos);
break;
}
case QwtPickerMachine::Move:
{
move(pos);
break;
}
case QwtPickerMachine::End:
{
end();
break;
}
}
}
}
/*!
Open a selection setting the state to active
\sa isActive, end(), append(), move()
*/
void QwtPicker::begin()
{
if ( d_data->isActive )
return;
d_data->selection.resize(0);
d_data->isActive = true;
if ( trackerMode() != AlwaysOff )
{
if ( d_data->labelPosition.x() < 0 || d_data->labelPosition.y() < 0 )
{
QWidget *w = parentWidget();
if ( w )
d_data->labelPosition = w->mapFromGlobal(QCursor::pos());
}
}
updateDisplay();
setMouseTracking(true);
}
/*!
\brief Close a selection setting the state to inactive.
The selection is validated and maybe fixed by QwtPicker::accept().
\param ok If true, complete the selection and emit a selected signal
otherwise discard the selection.
\return true if the selection is accepted, false otherwise
\sa isActive, begin(), append(), move(), selected(), accept()
*/
bool QwtPicker::end(bool ok)
{
if ( d_data->isActive )
{
setMouseTracking(false);
d_data->isActive = false;
if ( trackerMode() == ActiveOnly )
d_data->labelPosition = QPoint(-1, -1);
if ( ok )
ok = accept(d_data->selection);
if ( ok )
emit selected(d_data->selection);
else
d_data->selection.resize(0);
updateDisplay();
}
else
ok = false;
return ok;
}
/*!
Append a point to the selection and update rubberband and tracker.
The appended() signal is emitted.
\param pos Additional point
\sa isActive, begin(), end(), move(), appended()
*/
void QwtPicker::append(const QPoint &pos)
{
if ( d_data->isActive )
{
const int idx = d_data->selection.count();
d_data->selection.resize(idx + 1);
d_data->selection[idx] = pos;
updateDisplay();
emit appended(pos);
}
}
/*!
Move the last point of the selection
The moved() signal is emitted.
\param pos New position
\sa isActive, begin(), end(), append()
*/
void QwtPicker::move(const QPoint &pos)
{
if ( d_data->isActive )
{
const int idx = d_data->selection.count() - 1;
if ( idx >= 0 )
{
if ( d_data->selection[idx] != pos )
{
d_data->selection[idx] = pos;
updateDisplay();
emit moved(pos);
}
}
}
}
bool QwtPicker::accept(QwtPolygon &) const
{
return true;
}
/*!
A picker is active between begin() and end().
\return true if the selection is active.
*/
bool QwtPicker::isActive() const
{
return d_data->isActive;
}
//! Return Selected points
const QwtPolygon &QwtPicker::selection() const
{
return d_data->selection;
}
/*!
Scale the selection by the ratios of oldSize and newSize
The changed() signal is emitted.
\param oldSize Previous size
\param newSize Current size
\sa ResizeMode, setResizeMode(), resizeMode()
*/
void QwtPicker::stretchSelection(const QSize &oldSize, const QSize &newSize)
{
const double xRatio =
double(newSize.width()) / double(oldSize.width());
const double yRatio =
double(newSize.height()) / double(oldSize.height());
for ( int i = 0; i < int(d_data->selection.count()); i++ )
{
QPoint &p = d_data->selection[i];
p.setX(qRound(p.x() * xRatio));
p.setY(qRound(p.y() * yRatio));
emit changed(d_data->selection);
}
}
/*!
Set mouse tracking for the observed widget.
In case of enable is true, the previous value
is saved, that is restored when enable is false.
\warning Even when enable is false, mouse tracking might be restored
to true. When mouseTracking for the observed widget
has been changed directly by QWidget::setMouseTracking
while mouse tracking has been set to true, this value can't
be restored.
*/
void QwtPicker::setMouseTracking(bool enable)
{
QWidget *widget = parentWidget();
if ( !widget )
return;
if ( enable )
{
d_data->mouseTracking = widget->hasMouseTracking();
widget->setMouseTracking(true);
}
else
{
widget->setMouseTracking(d_data->mouseTracking);
}
}
/*!
Find the area of the observed widget, where selection might happen.
\return QFrame::contentsRect() if it is a QFrame, QWidget::rect() otherwise.
*/
QRect QwtPicker::pickRect() const
{
QRect rect;
const QWidget *widget = parentWidget();
if ( !widget )
return rect;
if ( widget->inherits("QFrame") )
rect = ((QFrame *)widget)->contentsRect();
else
rect = widget->rect();
return rect;
}
void QwtPicker::updateDisplay()
{
QWidget *w = parentWidget();
bool showRubberband = false;
bool showTracker = false;
if ( w && w->isVisible() && d_data->enabled )
{
if ( rubberBand() != NoRubberBand && isActive() &&
rubberBandPen().style() != Qt::NoPen )
{
showRubberband = true;
}
if ( trackerMode() == AlwaysOn ||
(trackerMode() == ActiveOnly && isActive() ) )
{
if ( trackerPen() != Qt::NoPen )
showTracker = true;
}
}
#if QT_VERSION < 0x040000
QGuardedPtr<PrivateData::PickerWidget> &rw = d_data->rubberBandWidget;
#else
QPointer<PrivateData::PickerWidget> &rw = d_data->rubberBandWidget;
#endif
if ( showRubberband )
{
if ( rw.isNull() )
{
rw = new PrivateData::PickerWidget(
this, w, PrivateData::PickerWidget::RubberBand);
rw->resize(w->size());
}
rw->updateMask();
}
else
delete rw;
#if QT_VERSION < 0x040000
QGuardedPtr<PrivateData::PickerWidget> &tw = d_data->trackerWidget;
#else
QPointer<PrivateData::PickerWidget> &tw = d_data->trackerWidget;
#endif
if ( showTracker )
{
if ( tw.isNull() )
{
tw = new PrivateData::PickerWidget(
this, w, PrivateData::PickerWidget::Text);
tw->resize(w->size());
}
tw->updateMask();
}
else
delete tw;
}
const QWidget *QwtPicker::rubberBandWidget() const
{
return d_data->rubberBandWidget;
}
const QWidget *QwtPicker::trackerWidget() const
{
return d_data->trackerWidget;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -