здравствуйте,
я надеюсь здесь много знатоков Qwt, которые мне могли бы помочь решит следушею проблему:
Я уже всю неделю стараюсь сделать QwtPlotMarker двигаюшимся, что значит если я мышкой нажимаю на QwtPlotMarker и тяну его по плоту, то етот объект должен преследовать мышь и отобразоваться в том месте где я отпушю мышь. К сожалению, я до сих пор не смог ето реализовать. Помогите пожалуйста.
Детали: 1) я исползую QwtPlot, на который я нанес несколько 2) QwtPlotMarker. Дополнительно я исползую QwtPlotPicker которым я как раз хочу выделять объекты и двигать их.
мой код:
...
picker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft,
QwtPicker::PointSelection | QwtPicker::DragSelection,
QwtPlotPicker::CrossRubberBand, QwtPicker::AlwaysOn,
this->canvas());
connect( picker, SIGNAL(moved(const QwtDoublePoint& ) ),
this, SLOT(cursorMoved( const QwtDoublePoint& ) ) );
connect( picker, SIGNAL(selected( const QwtDoublePoint& ) ),
this, SLOT(cursorSelected( const QwtDoublePoint& ) ) );
...
void Plot::cursorSelected(const QwtDoublePoint &Point)
{
//selectedPoint = NULL;
std::cout << "in Plot::cursorSelected, selectedPoint = " << selectedPoint << std::endl;
const QwtPlotItemList& List = itemList();
QwtPlotItemIterator Iter = List.begin();
for ( QwtPlotItemIterator it = List.begin();it != List.end(); ++it )
{
std::cout << "(*it) "<< (*it) << std::endl;
if ( (*it)->rtti() == QwtPlotItem::Rtti_PlotMarker )
{
std::cout << "(*it) if Marker "<< (*it) << std::endl;
QwtPlotMarker *mark = ((QwtPlotMarker*)(*it));
std::cout << "mark->xValue() " << mark->xValue() << "mark->yValue() "<<mark->yValue() << std::endl;
QwtDoubleRect rec = mark->boundingRect();
rec.setHeight(10);
rec.setWidth(10);
std::cout << "mark->boundingRect()" <<rec.width()<<rec.height()<< std::endl;
if(rec.contains(Point)){
std::cout << "MATCH" << std::endl;
selectedPoint = dynamic_cast<QwtPlotMarker*>(mark);
std::cout << "selectedPoint = " << selectedPoint << std::endl;
}
else selectedPoint = NULL;
}
}
}
//##################################################################
void Plot::cursorMoved( const QwtDoublePoint& Point){
std::cout << "in Plot::cursorMoved, selectedPoint = " << selectedPoint << std::endl;
std::cout << "Point.x()= " << Point.x() <<"Point.y()= " << Point.y() << std::endl;
if(selectedPoint){
selectedPoint->setValue( Point);
/* selectedPoint->setXValue( Point.x());
selectedPoint->setYValue( Point.y());*/
std::cout << "selectedPoint->xValue(): " << selectedPoint->xValue() <<"selectedPoint->yValue(): " << selectedPoint->yValue()<< std::endl;
// add another point just for test
PointItem *item = new PointItem(QwtDoubleRect(0.5, 0.5 , 0.0001, 0.0001));
item->setZ(100);
item->attach(this);
this->replot();
}
}