crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> как двигать QwtPlotMarker на QwtPlot
Vitali83
  опции профиля:
сообщение 25.11.2009, 10:49
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 24.11.2009
Пользователь №: 1257

Спасибо сказали: 0 раз(а)




Репутация:   0  


здравствуйте,

я надеюсь здесь много знатоков 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();
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.11.2009, 11:04
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Vitali83 @ 25.11.2009, 13:49) *
здесь много знатоков Qwt
честно говоря сомнительно, то что многие использовали Qwt, сомнений нет, а вот насколько основательно это уже вопрос.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Vitali83
  опции профиля:
сообщение 25.11.2009, 17:37
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 24.11.2009
Пользователь №: 1257

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 25.11.2009, 9:04) *
Цитата(Vitali83 @ 25.11.2009, 13:49) *
здесь много знатоков 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  


Цитата(Vitali83 @ 25.11.2009, 20:37) *
в PointSelection модусе
что такое "модус", "модуль"?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 21:41