как двигать QwtPlotMarker на QwtPlot |
Здравствуйте, гость ( Вход | Регистрация )
как двигать QwtPlotMarker на QwtPlot |
Vitali83 |
25.11.2009, 10:49
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 24.11.2009 Пользователь №: 1257 Спасибо сказали: 0 раз(а) Репутация: 0 |
здравствуйте,
я надеюсь здесь много знатоков Qwt, которые мне могли бы помочь решит следушею проблему: Я уже всю неделю стараюсь сделать QwtPlotMarker двигаюшимся, что значит если я мышкой нажимаю на QwtPlotMarker и тяну его по плоту, то етот объект должен преследовать мышь и отобразоваться в том месте где я отпушю мышь. К сожалению, я до сих пор не смог ето реализовать. Помогите пожалуйста. Детали: 1) я исползую QwtPlot, на который я нанес несколько 2) QwtPlotMarker. Дополнительно я исползую QwtPlotPicker которым я как раз хочу выделять объекты и двигать их. мой код:
|
|
|
Litkevich Yuriy |
25.11.2009, 11:04
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Vitali83 |
25.11.2009, 17:37
Сообщение
#3
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 24.11.2009 Пользователь №: 1257 Спасибо сказали: 0 раз(а) Репутация: 0 |
здесь много знатоков Qwt честно говоря сомнительно, то что многие использовали Qwt, сомнений нет, а вот насколько основательно это уже вопрос.с проблемой движения объектов решенно и тепер я могу их двигать. Проблема состояла в том, что надо было трансформиробать координаты в координаты плота, только тогда можно было выяснить, находиться ли объект под мышкой или нет. тепер другая проблема: я хотел бы исползовать QwtPlotPicker одновременно в модусах PointSelection и RectSelection, но не знаю как тогда параметры поставить. В данный момент я либо могу работать в PointSelection модусе, либо в RectSelection. Не подскажите как ето реализовать? Раскрывающийся текст void Plot::cursorSelected(const QwtDoublePoint &Point) { //selectedPoint = NULL; std::cout << "in Plot::cursorSelected, selectedPoint = " << selectedPoint << std::endl; const QwtPlotItemList& List = itemList(); // get all items from the plot... QwtPlotItemIterator Iter = List.begin(); while(Iter != List.end()) // ... and iterate through them... { if((*Iter)->rtti() == QwtPlotItem::Rtti_PlotMarker){ // ... until you find the item from class QwtPLotMarker QwtPlotMarker *mark = ((QwtPlotMarker*)(*Iter)); double x = this->transform(mark->xAxis(),mark->xValue()); // transform the item's coordinates to plot's coordinates double y = this->transform(mark->yAxis(),mark->yValue()); std::cout << "mark.xValue()=" << mark->xValue() << ", mark.yValue()=" << mark->yValue()<< std::endl; std::cout << "transformed mark coord = " << x << ", " << y<< std::endl; QwtDoublePoint trPoint = QwtDoublePoint(x,y); // create a point consisting of transformed coordinates double xClick = this->transform(mark->xAxis(),Point.x()); // transform the mouse click's coordinates to plot's coordinates double yClick = this->transform(mark->yAxis(),Point.y()); QwtDoubleRect recOfClick(xClick-10, yClick-10, 20,20); // generate a rectangle around the click's position std::cout << "recOfClick(x,y,width, height) =" <<recOfClick.x()<<", " << recOfClick.y() << ", " << recOfClick.width()<< ", "<<recOfClick.height()<< std::endl; if(recOfClick.contains(trPoint)){ // if click's rectangle includes the QwtPlotMarker, then... std::cout << "MATCH" << std::endl; selectedPoint = mark; // ... save the pointer to this item into variable "selectedPoint" std::cout << "selectedPoint = " << selectedPoint << std::endl; const QwtSymbol symbol = selectedPoint->symbol(); QwtSymbol newSymbol = symbol; newSymbol.setBrush(symbol.brush().color().dark(150)); // highlighten the selected item by darken its color selectedPoint->setSymbol(newSymbol); /* replot(); selectedPoint->setSymbol(symbol);*/ } /* else{ selectedPoint = NULL; // at the beginning this pointer should be NULL }*/ } Iter++; } } ... 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!=NULL){ selectedPoint->setValue(Point); // set the new coordinates to the moved item //std::cout << "selectedPoint->xValue(): " << selectedPoint->xValue() <<"selectedPoint->yValue(): " << selectedPoint->yValue()<< std::endl; this->replot(); // replot the plot widget after the selected point was moved } } |
|
|
Litkevich Yuriy |
25.11.2009, 17:53
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Текстовая версия | Сейчас: 28.3.2024, 21:41 |