crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
_Vitaliy_
  опции профиля:
сообщение 27.8.2014, 19:05
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 59
Регистрация: 20.11.2008
Пользователь №: 428

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




Репутация:   0  


Если да, то откликнитесь, есть несколько вопросов...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 28.8.2014, 9:23
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Да, приходилось немного...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
_Vitaliy_
  опции профиля:
сообщение 28.8.2014, 11:13
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 59
Регистрация: 20.11.2008
Пользователь №: 428

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




Репутация:   0  


Цитата(Steklova Olga @ 28.8.2014, 8:23) *
Да, приходилось немного...

Это замечательно.
Есть несколько графиков (порядка 10) на "плоскости", необходимо реализовать возможность выбора каждого отдельного графика. Сделано через:
 ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);

Реализовать ограничение перемещения по оси OX. Сделано через:
ui->customPlot->axisRect()->setRangeDrag(Qt::Vertical);

Необходимо реализовать:
1. Возможность перемещения произвольного графика по оси OY (остальные графики неподвижны).
2. Первоначально, при отображении графиков, значения на оси OY отсутствуют, при выборе графика, появляется его ось OY со значениями в масштабе выбранного графика.
При снятии выделения графика, значения по оси OY пропадают.
Для пояснения прикладываю изображение (в аттаче).

Сообщение отредактировал _Vitaliy_ - 28.8.2014, 11:14
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 28.8.2014, 20:08
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


При перемещении произвольного графика по оси OY значения оцифровки этого графика не должны меняться?
То есть, если у этого графика были значения в диапазоне 100...400, то при перемещении этого графика вверх или вниз этот диапазон сохраняется на оцифровке?

А это не забыл?
ui->customPlot->axisRect()->setRangeZoom(Qt::Vertical);

Мне не приходилось решать такую задачу.
Может лучше поискать ответ на родном форуме qcustomplot? Смотри тут

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
_Vitaliy_
  опции профиля:
сообщение 28.8.2014, 20:31
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 59
Регистрация: 20.11.2008
Пользователь №: 428

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




Репутация:   0  


Начинаем с простого...
Необходимо реализовать:
1. Возможность перемещения произвольного графика по оси OY (остальные графики неподвижны).
Давайте сначала попробуем "победить" 1-й пункт.
Цитата
То есть, если у этого графика были значения в диапазоне 100...400, то при перемещении этого графика вверх или вниз этот диапазон сохраняется на оцифровке?

да, диапазон должен быть сохранен.
Цитата
Может лучше поискать ответ на родном форуме qcustomplot?
был я там, но до конца тема (моя) не раскрыта (т.е. попробуйте вот-так или так и т.д. но рабочего куска кода я не нашел)...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 29.8.2014, 11:04
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


А как ты рисуешь несколько графиков на одном customPlot? Так?
QCPCurve *gr1 = new QCPCurve(customPlot->xAxis, customPlot->yAxis);
QCPCurve *gr2 = new QCPCurve(customPlot->xAxis, customPlot->yAxis);
customPlot->addPlottable(gr1);
customPlot->addPlottable(gr2);

Если у одного графика значения в диапазоне 100...400 и у другого графика значения в диапазоне 100...400, а рисуешь ты их друг на другом, то по оси OY на самом деле у них разная оцифровка, не так ли? Например, у первого 0+100...0+400, у второго 500+100...500+400.

Цитата(_Vitaliy_ @ 28.8.2014, 20:31) *
попробуйте вот-так или так и т.д. но рабочего куска кода я не нашел
вот и пробуй
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
_Vitaliy_
  опции профиля:
сообщение 29.8.2014, 11:45
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 59
Регистрация: 20.11.2008
Пользователь №: 428

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




Репутация:   0  


Рисую стандартно:
    ui->customPlot->addGraph(ui->customPlot->xAxis, ui->customPlot->yAxis);
    ui->customPlot->graph(0)->setPen(QPen(Qt::green));
    ui->customPlot->graph(0)->setLineStyle(QCPGraph::lsLine);
    ui->customPlot->graph(0)->setName("first graph");

    ui->customPlot->addGraph(ui->customPlot->xAxis2, ui->customPlot->yAxis2);
    ui->customPlot->graph(1)->setPen(QPen(Qt::red));
    ui->customPlot->graph(1)->setLineStyle(QCPGraph::lsLine);
    ui->customPlot->graph(1)->setName("second graph");

    // generate data, just playing with numbers, not much to learn here:
    QVector<double> x(250), y1(250), y2(250);
    for (int i=0; i<250; ++i)
    {
        x[i] = i;
        y1[i] = sin(x[i]/10);
        y2[i] = cos(x[i]/7) + 2;
    }

    // pass data points to graphs:
    ui->customPlot->graph(0)->setData(x, y1);
    ui->customPlot->graph(1)->setData(x, y2);

    // activate top and right axes, which are invisible by default:
    ui->customPlot->xAxis->setVisible(true);
    ui->customPlot->yAxis->setVisible(true);
    ui->customPlot->xAxis2->setVisible(true);
    ui->customPlot->yAxis2->setVisible(true);

    ui->customPlot->graph(0)->rescaleAxes(true);
    ui->customPlot->graph(1)->rescaleAxes(true);
    ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);

    ui->customPlot->axisRect()->setRangeDrag(Qt::Vertical);
    ui->customPlot->axisRect()->setRangeZoom(Qt::Vertical);
    ui->customPlot->replot();

З.Ы. Попробую как Вы предложили...

Попробовал как Вы предложили, эффект тот-же.
Получается что какой график идет первым, тот и является "основным", потому что при выборе второго графика все-равно перемещается первый...
Наверное нужно каким-то образом при выборе второго графика сделать его основным, но я пока это к сожалению не победил...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 29.8.2014, 12:16
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Цитата(_Vitaliy_ @ 28.8.2014, 20:31) *
Цитата
То есть, если у этого графика были значения в диапазоне 100...400, то при перемещении этого графика вверх или вниз этот диапазон сохраняется на оцифровке?

да, диапазон должен быть сохранен.

Смотрю на твои картинки. У синего графика оцифровка -150...-50. Над ним красный с диапазоном 100...300.
Если ты переместишь синий график выше красного, то у синего все равно должна остаться оцифровка -150...-50?

Ты зачем-то указываешь для первого графика customPlot->xAxis, customPlot->yAxis, для второго customPlot->xAxis2, customPlot->yAxis2. Но на картинке у тебя больше двух графиков. (xAxis, yAxis) - это оцифровка слева, (xAxis2, yAxis2) - справа. Судя по картинке, тебе надо, чтобы у всех графиков была оцифровка слева.


Сообщение отредактировал Steklova Olga - 29.8.2014, 12:40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 29.8.2014, 13:15
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Цитата(_Vitaliy_ @ 29.8.2014, 11:45) *
Получается что какой график идет первым, тот и является "основным", потому что при выборе второго графика все-равно перемещается первый...

Ты не прав. Это у тебя не первый график перемещается. У первого графика значения точек-то не изменяются, они сохраняются, график как-бы нарисован на области customPlot'а.
А прокручивается сама область customPlot'а с теми графиками, у которых указано customPlot->xAxis, customPlot->yAxis. Если ты для нескольких графиков укажешь customPlot->xAxis, customPlot->yAxis, то область customPlot'а будет прокручиваться со всеми этими графиками.

А вот если тебе надо, чтобы график именно двигался относительно области customPlot'а, то это совсем другое дело.


Вместо
customPlot->graph(0)->rescaleAxes(true);
customPlot->graph(1)->rescaleAxes(true);
надо писать так:
  // let the ranges scale themselves so graph 0 fits perfectly in the visible area:
  customPlot->graph(0)->rescaleAxes();
  // same thing for graph 1, but only enlarge ranges (in case graph 1 is smaller than graph 0):
  customPlot->graph(1)->rescaleAxes(true);

  // Note: we could have also just called customPlot->rescaleAxes(); instead


Сообщение отредактировал Steklova Olga - 29.8.2014, 13:16
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
_Vitaliy_
  опции профиля:
сообщение 29.8.2014, 13:39
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 59
Регистрация: 20.11.2008
Пользователь №: 428

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




Репутация:   0  


Цитата
А прокручивается сама область customPlot'а с теми графиками, у которых указано customPlot->xAxis, customPlot->yAxis. Если ты для нескольких графиков укажешь customPlot->xAxis, customPlot->yAxis, то область customPlot'а будет прокручиваться со всеми этими графиками.

Я с Вами абсолютно согласен, но мне нужно чтобы эти графики двигались по оси ОУ независимо.

Т.е. при первом отображении формы все графики должны быть "завязаны" в конструкторе на оси xAxis и yAxis и мы можем масштабировать все графики синхронно.

При выборе графика №1, график №2 нужно переназначить на оси xAxis2 и yAxis2 и наоборот при выборе график №2 переназначить на xAxis и yAxis, а график №1 на xAxis2 и yAxis2 чтобы №1 был неподвижен а №2 можно было перемещать или я заблуждаюсь?

Сообщение отредактировал _Vitaliy_ - 29.8.2014, 13:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 29.8.2014, 14:06
Сообщение #11


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


ты не ответил на сообщение #8
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 29.8.2014, 17:34
Сообщение #12


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


graphics()
void MainWindow::graphics()
{
    ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);
    ui->customPlot->axisRect()->setRangeDrag(Qt::Vertical);
    ui->customPlot->axisRect()->setRangeZoom(Qt::Vertical);

    ui->customPlot->addGraph(ui->customPlot->xAxis, ui->customPlot->yAxis);
    ui->customPlot->addGraph(ui->customPlot->xAxis, ui->customPlot->yAxis);
    ui->customPlot->addGraph(ui->customPlot->xAxis, ui->customPlot->yAxis);

    ui->customPlot->graph(0)->setLineStyle(QCPGraph::lsLine);
    ui->customPlot->graph(1)->setLineStyle(QCPGraph::lsLine);
    ui->customPlot->graph(2)->setLineStyle(QCPGraph::lsLine);

    ui->customPlot->graph(0)->setPen(QPen(Qt::red, 5));
    ui->customPlot->graph(1)->setPen(QPen(Qt::yellow, 5));
    ui->customPlot->graph(2)->setPen(QPen(Qt::green, 5));

    ui->customPlot->xAxis->setVisible(true);
    ui->customPlot->yAxis->setVisible(true);
    ui->customPlot->xAxis2->setVisible(true);
    ui->customPlot->yAxis2->setVisible(true);

    ui->customPlot->xAxis->setBasePen(QPen(Qt::black));
    ui->customPlot->yAxis->setBasePen(QPen(Qt::black));
    ui->customPlot->xAxis2->setBasePen(QPen(Qt::black));
    ui->customPlot->yAxis2->setBasePen(QPen(Qt::black));

    QVector<double> x(250), y1(250), y2(250), y3(250);
    for (int i=0; i<250; ++i)
    {
        x[i] = i;
        y1[i] = sin(x[i]/10);
        y2[i] = sin(x[i]/10) + 1.0;
        y3[i] = cos(x[i]/10) + 2.0;
    }

    connect(ui->customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->xAxis2, SLOT(setRange(QCPRange)));
    connect(ui->customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->yAxis2, SLOT(setRange(QCPRange)));

    ui->customPlot->graph(0)->setData(x, y1);
    ui->customPlot->graph(1)->setData(x, y2);
    ui->customPlot->graph(2)->setData(x, y3);

    ui->customPlot->rescaleAxes();

    ui->customPlot->replot();
}
on_btn_green_check_clicked()
void MainWindow::on_btn_green_check_clicked()
{
    disconnect(ui->customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->xAxis2, SLOT(setRange(QCPRange)));
    disconnect(ui->customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->yAxis2, SLOT(setRange(QCPRange)));

    //все графики кроме зеленого переключаем на 2-ю неподвижную оцифровку
    ui->customPlot->graph(0)->setKeyAxis(ui->customPlot->xAxis2);
    ui->customPlot->graph(0)->setValueAxis(ui->customPlot->yAxis2);
    ui->customPlot->graph(1)->setKeyAxis(ui->customPlot->xAxis2);
    ui->customPlot->graph(1)->setValueAxis(ui->customPlot->yAxis2);

    ui->customPlot->xAxis->setBasePen(QPen(Qt::green, 2));
    ui->customPlot->yAxis->setBasePen(QPen(Qt::green, 2));

    ui->customPlot->replot();
}
on_btn_green_uncheck_clicked()
void MainWindow::on_btn_green_uncheck_clicked()
{
    ui->customPlot->yAxis->setRange(ui->customPlot->yAxis2->range()); //можно это не делать (или делать, если нужно)

    connect(ui->customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->xAxis2, SLOT(setRange(QCPRange)));
    connect(ui->customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->yAxis2, SLOT(setRange(QCPRange)));

    //все графики кроме зеленого возвращаем на 1-ю подвижную оцифровку
    ui->customPlot->graph(0)->setKeyAxis(ui->customPlot->xAxis);
    ui->customPlot->graph(0)->setValueAxis(ui->customPlot->yAxis);
    ui->customPlot->graph(1)->setKeyAxis(ui->customPlot->xAxis);
    ui->customPlot->graph(1)->setValueAxis(ui->customPlot->yAxis);

    ui->customPlot->xAxis->setBasePen(QPen(Qt::black));
    ui->customPlot->yAxis->setBasePen(QPen(Qt::black));

    ui->customPlot->replot();
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 29.8.2014, 18:05
Сообщение #13


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


а для оцифровки
on_btn_green_check_clicked()
void MainWindow::on_btn_green_check_clicked()
{
    disconnect(ui->customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->xAxis2, SLOT(setRange(QCPRange)));
    disconnect(ui->customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->yAxis2, SLOT(setRange(QCPRange)));

    //все графики кроме зеленого переключаем на 2-ю неподвижную оцифровку
    ui->customPlot->graph(0)->setKeyAxis(ui->customPlot->xAxis2);
    ui->customPlot->graph(0)->setValueAxis(ui->customPlot->yAxis2);
    ui->customPlot->graph(1)->setKeyAxis(ui->customPlot->xAxis2);
    ui->customPlot->graph(1)->setValueAxis(ui->customPlot->yAxis2);

    ui->customPlot->xAxis->setBasePen(QPen(Qt::green, 2));
    ui->customPlot->yAxis->setBasePen(QPen(Qt::green, 2));

    //dop
//    ui->customPlot->yAxis->setVisible(true);
    ui->customPlot->yAxis->setAutoTicks(false);
    ui->customPlot->yAxis->setAutoTickLabels(false);
    ui->customPlot->yAxis->setAutoSubTicks(false);
    ui->customPlot->yAxis->setTickVector(QVector<double>()
        << 1.0 << 2.0 << 3.0);
    ui->customPlot->yAxis->setTickVectorLabels(QVector<QString>()
        << "1,0" << "2,0" << "3,0");
    //dop

    ui->customPlot->replot();
}
on_btn_green_uncheck_clicked()
void MainWindow::on_btn_green_uncheck_clicked()
{
    ui->customPlot->yAxis->setRange(ui->customPlot->yAxis2->range()); //можно это не делать (или делать, если нужно)

    connect(ui->customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->xAxis2, SLOT(setRange(QCPRange)));
    connect(ui->customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->yAxis2, SLOT(setRange(QCPRange)));

    //все графики кроме зеленого возвращаем на 1-ю подвижную оцифровку
    ui->customPlot->graph(0)->setKeyAxis(ui->customPlot->xAxis);
    ui->customPlot->graph(0)->setValueAxis(ui->customPlot->yAxis);
    ui->customPlot->graph(1)->setKeyAxis(ui->customPlot->xAxis);
    ui->customPlot->graph(1)->setValueAxis(ui->customPlot->yAxis);

    ui->customPlot->xAxis->setBasePen(QPen(Qt::black));
    ui->customPlot->yAxis->setBasePen(QPen(Qt::black));

    //dop
//    ui->customPlot->yAxis->setVisible(false);
    ui->customPlot->yAxis->setAutoTicks(true);
    ui->customPlot->yAxis->setAutoTickLabels(true);
    ui->customPlot->yAxis->setAutoSubTicks(true);
    //dop

    ui->customPlot->replot();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
_Vitaliy_
  опции профиля:
сообщение 29.8.2014, 20:14
Сообщение #14


Студент
*

Группа: Участник
Сообщений: 59
Регистрация: 20.11.2008
Пользователь №: 428

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




Репутация:   0  


Отвечаю на 8 пост.
Цитата
Если ты переместишь синий график выше красного, то у синего все равно должна остаться оцифровка -150...-50?

Да, т.е. синхронно для всех графиков должен работать только "ресайз" по оси ОХ. По оси ОУ для каждого отдельного графика, т.е. выбрали график №N, отмасштабировали (при необходимости), передвинули (при необходимости) масштаб и местоположение этого графика остается неизменным до следующего его выбора.
Цитата
Ты зачем-то указываешь для первого графика customPlot->xAxis, customPlot->yAxis, для второго customPlot->xAxis2, customPlot->yAxis2. Но на картинке у тебя больше двух графиков. (xAxis, yAxis) - это оцифровка слева, (xAxis2, yAxis2) - справа.

про xAxis, yAxis, xAxis2, yAxis2 и их расположение мы в курсе.
Цитата
Судя по картинке, тебе надо, чтобы у всех графиков была оцифровка слева.

При первоначальном открытии окна с графиками видна только ось ОХ и все, при выборе произвольного графика подсвечивается ось OY выбранного графика, и масштаб оси ОУ этого графика соответствует размаху по ОУ этого графика.

на 12-13 пост, сейчас попробую поколдовать, сегодня-завтра отпишусь, но все равно спасибо за соучастие.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
_Vitaliy_
  опции профиля:
сообщение 30.8.2014, 8:23
Сообщение #15


Студент
*

Группа: Участник
Сообщений: 59
Регистрация: 20.11.2008
Пользователь №: 428

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




Репутация:   0  


Доброго времени суток.
Посмотрел Ваши решения, немного недопонял насчет использования
on_btn_green_check_clicked()
кнопок вроде как нет.
На всякий случай прикладываю свою реализацию через
 connect(ui->customPlot, SIGNAL(plottableClick(QCPAbstractPlottable*,QMouseEvent*)),
            this, SLOT(graphClicked(QCPAbstractPlottable*)));

З.ы. хотел 7Z архивом скинуть но что-то система не пропускает, тогда портянка mainwindow.cpp:

Раскрывающийся текст
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    graphics();

    connect(ui->customPlot, SIGNAL(plottableClick(QCPAbstractPlottable*,QMouseEvent*)),
            this, SLOT(graphClicked(QCPAbstractPlottable*)));

}


void MainWindow::graphics()
{
    ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);
    ui->customPlot->axisRect()->setRangeDrag(Qt::Vertical);   // peremeshenie po OY
    ui->customPlot->axisRect()->setRangeZoom(Qt::Vertical);   // mashtab po OX

    ui->customPlot->addGraph(ui->customPlot->xAxis, ui->customPlot->yAxis);
    ui->customPlot->addGraph(ui->customPlot->xAxis, ui->customPlot->yAxis);
    ui->customPlot->addGraph(ui->customPlot->xAxis, ui->customPlot->yAxis);

    ui->customPlot->graph(0)->setLineStyle(QCPGraph::lsLine);
    ui->customPlot->graph(1)->setLineStyle(QCPGraph::lsLine);
    ui->customPlot->graph(2)->setLineStyle(QCPGraph::lsLine);

    ui->customPlot->graph(0)->setPen(QPen(Qt::red, 3));
    ui->customPlot->graph(1)->setPen(QPen(Qt::yellow, 3));
    ui->customPlot->graph(2)->setPen(QPen(Qt::green, 3));

    ui->customPlot->xAxis->setVisible(true);
    ui->customPlot->yAxis->setVisible(false);
    ui->customPlot->xAxis2->setVisible(false);
    ui->customPlot->yAxis2->setVisible(false);

    ui->customPlot->xAxis->setBasePen(QPen(Qt::black));
    ui->customPlot->yAxis->setBasePen(QPen(Qt::black));
    ui->customPlot->xAxis2->setBasePen(QPen(Qt::black));
    ui->customPlot->yAxis2->setBasePen(QPen(Qt::black));

    QVector<double> x(250), y1(250), y2(250), y3(250);
    for (int i=0; i<250; ++i)
    {
        x[i] = i;
        y1[i] = sin(x[i]/10);
        y2[i] = sin(x[i]/7) + 1.0;
        y3[i] = cos(x[i]/5) + 2.0;
    }

//    connect(ui->customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->xAxis2, SLOT(setRange(QCPRange)));
//    connect(ui->customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->yAxis2, SLOT(setRange(QCPRange)));

    ui->customPlot->graph(0)->setData(x, y1);
    ui->customPlot->graph(1)->setData(x, y2);
    ui->customPlot->graph(2)->setData(x, y3);

    ui->customPlot->graph(0)->setName("graph 0");
    ui->customPlot->graph(1)->setName("graph 1");
    ui->customPlot->graph(2)->setName("graph 2");

    ui->customPlot->rescaleAxes();

    ui->customPlot->replot();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::graphClicked(QCPAbstractPlottable *plottable)
{
  ui->statusBar->showMessage(QString("Clicked on graph '%1'.").arg(plottable->name()), 1000);

  qDebug() << plottable->name();


  if (plottable->name() == "graph 0")
  {
      ui->customPlot->yAxis->setVisible(true);

      ui->customPlot->graph(0)->setKeyAxis(ui->customPlot->xAxis);
      ui->customPlot->graph(0)->setValueAxis(ui->customPlot->yAxis);

      ui->customPlot->graph(1)->setKeyAxis(ui->customPlot->xAxis2);
      ui->customPlot->graph(1)->setValueAxis(ui->customPlot->yAxis2);
      ui->customPlot->graph(2)->setKeyAxis(ui->customPlot->xAxis2);
      ui->customPlot->graph(2)->setValueAxis(ui->customPlot->yAxis2);


      ui->customPlot->yAxis->setAutoTicks(false);
      ui->customPlot->yAxis->setAutoTickLabels(false);
      ui->customPlot->yAxis->setAutoSubTicks(false);
      ui->customPlot->yAxis->setTickVector(QVector<double>()
                                           << 1.0 << 2.0 << 3.0);
      ui->customPlot->yAxis->setTickVectorLabels(QVector<QString>()
                                                 << "1,0" << "2,0" << "3,0");

      ui->customPlot->rescaleAxes();
      ui->customPlot->replot();
  }

  if (plottable->name() == "graph 1")
  {
      ui->customPlot->graph(1)->setKeyAxis(ui->customPlot->xAxis);
      ui->customPlot->graph(1)->setValueAxis(ui->customPlot->yAxis);

      ui->customPlot->graph(0)->setKeyAxis(ui->customPlot->xAxis2);
      ui->customPlot->graph(0)->setValueAxis(ui->customPlot->yAxis2);
      ui->customPlot->graph(2)->setKeyAxis(ui->customPlot->xAxis2);
      ui->customPlot->graph(2)->setValueAxis(ui->customPlot->yAxis2);

  }


}


зипом получилось...

Сообщение отредактировал _Vitaliy_ - 30.8.2014, 8:37
Прикрепленные файлы
Прикрепленный файл  na_forum.zip ( 202.71 килобайт ) Кол-во скачиваний: 263
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 1.9.2014, 11:12
Сообщение #16


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Насчет моего кода... Кинь на свое окно рядом с компонентом customPlot две кнопки, к их сигналам clicked() привяжи слоты, текст которых я привела. Это для зеленого графика имитация сигналов "зеленый график выбран", "отмена выбора зеленого графика". Числа 1.0, 2.0, 3.0 относятся именно к зеленому графику, когда к нему привязана моя функция этого графика.
Запускаешь. Не выбирая графиков, можно подвинуть их все вместе или отмасштабировать их все вместе.
Нажимаешь первую кнопку, видишь оцифровку зеленого графика. Например, двигаешь его. В это время остальные графики стоят на месте.
Но когда ты после этого нажимаешь вторую кнопку (как-бы снимая выделение эеленого графика), то этот зеленый график КОНЕЧНО возвращается туда, где он был до нажатия кнопок, а не остается визуально на тех пикселах, куда ты его двигал.
Потому что, пикселы пикселами, а значения-то точек зеленого графика ты не изменил.
customPlot - как прозрачный лист, на котором нарисованы графики. А когда ты одни графики привязывешь к правой оцифровке, а другие - к левой, то получаются два прозрачных листа, один неподвижный, а другой подвижный, но в окне ты видишь их оба сразу.

На твоем месте я посмотрела бы доку по классам
QCPItemPosition, QCPItemAnchor, QCPAbstractPlottable,
enum PositionType { ptAbsolute        ///< Static positioning in pixels, starting from the top left corner of the viewport/widget.
                    ,ptViewportRatio  ///< Static positioning given by a fraction of the viewport size.
                    ,ptAxisRectRatio  ///< Static positioning given by a fraction of the axis rect size (see \ref setAxisRect).
                    ,ptPlotCoords     ///< Dynamic positioning at a plot coordinate defined by two axes (see \ref setAxes).
                  };
и все же задала вопрос на родном форуме qcustomplot. Успехов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
_Vitaliy_
  опции профиля:
сообщение 1.9.2014, 13:08
Сообщение #17


Студент
*

Группа: Участник
Сообщений: 59
Регистрация: 20.11.2008
Пользователь №: 428

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




Репутация:   0  


пока не "победил" адекватное масштабирование... Вы в мой проект не заглядывали?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 1.9.2014, 14:15
Сообщение #18


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


я смотрела "твой" проект - искуроченный тобою мой тестовый пример.
мне надоело повторять десять раз одно и то же, я уже все сказала.
запусти мой пример, но с кнопками - увидишь, что получается.
читай доку по классам. мне по работе они сейчас не нужны, я не буду в них разбираться, чтобы тебе пересказывать. точка.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
_Vitaliy_
  опции профиля:
сообщение 1.9.2014, 14:52
Сообщение #19


Студент
*

Группа: Участник
Сообщений: 59
Регистрация: 20.11.2008
Пользователь №: 428

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




Репутация:   0  


спасибо, честно говоря 17 сообщение я написал не видя Вашего 16, в котором Вы подробно все расписали, а в 18 сообщении вы меня просто "порвали" ...
хорошего кода...

Сообщение отредактировал _Vitaliy_ - 1.9.2014, 15:31
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
skyer_
  опции профиля:
сообщение 14.10.2014, 21:27
Сообщение #20


Новичок


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

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




Репутация:   0  


Приветствую, нужен совет как нарисовать горизонтальные гистограммы на qcustomplot.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 30.10.2014, 20:13
Сообщение #21


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Цитата(skyer_ @ 14.10.2014, 21:27) *
Приветствую, нужен совет как нарисовать горизонтальные гистограммы на qcustomplot.

  QCPCurve *gr1 = new QCPCurve(customPlot->xAxis, customPlot->yAxis);
  QCPCurve *gr2 = new QCPCurve(customPlot->xAxis, customPlot->yAxis);
  customPlot->addPlottable(gr1);
  customPlot->addPlottable(gr2);
  gr1->setPen(QPen(Qt::darkGreen, 50, Qt::SolidLine));
  gr2->setPen(QPen(Qt::darkGreen, 50, Qt::SolidLine));
  int pointCount = 2;
  QVector<double> x(pointCount), y(pointCount);
  x[0] = 0.0; x[1] = 120.0;  y[0] = 20.0; y[1] = y[0];
  gr1->setData(x, y);
  x[0] = 0.0; x[1] = 150.0;  y[0] = 50.0; y[1] = y[0];
  gr2->setData(x, y);
  customPlot->axisRect()->setupFullAxesBox();
  customPlot->xAxis->setRange(0.0, 200.0);
  customPlot->yAxis->setRange(0.0, 100.0);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
skyer_
  опции профиля:
сообщение 1.11.2014, 23:59
Сообщение #22


Новичок


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

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




Репутация:   0  


Цитата(Steklova Olga @ 30.10.2014, 20:13) *
Цитата(skyer_ @ 14.10.2014, 21:27) *
Приветствую, нужен совет как нарисовать горизонтальные гистограммы на qcustomplot.

  QCPCurve *gr1 = new QCPCurve(customPlot->xAxis, customPlot->yAxis);
  QCPCurve *gr2 = new QCPCurve(customPlot->xAxis, customPlot->yAxis);
  customPlot->addPlottable(gr1);
  customPlot->addPlottable(gr2);
  gr1->setPen(QPen(Qt::darkGreen, 50, Qt::SolidLine));
  gr2->setPen(QPen(Qt::darkGreen, 50, Qt::SolidLine));
  int pointCount = 2;
  QVector<double> x(pointCount), y(pointCount);
  x[0] = 0.0; x[1] = 120.0;  y[0] = 20.0; y[1] = y[0];
  gr1->setData(x, y);
  x[0] = 0.0; x[1] = 150.0;  y[0] = 50.0; y[1] = y[0];
  gr2->setData(x, y);
  customPlot->axisRect()->setupFullAxesBox();
  customPlot->xAxis->setRange(0.0, 200.0);
  customPlot->yAxis->setRange(0.0, 100.0);



Благодарю, сейчас буду пробовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.4.2025, 7:13