Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2022, 17:41   #1
Roberttt
Пользователь
 
Регистрация: 30.05.2018
Сообщений: 56
По умолчанию Как по клику мыши выбрать определенный график в QCustomPlot

Здравствуйте!
Не нашел ничего похожего в гугле, поэтому решил создать эту тему. Проблема в том, что не получается сделать вещь, которая встречается во многих ПО, в которых есть отрисовка графиков, а именно при двойном клике мыши для одного из графиков должно выводиться окно с настройками для этого графика. Не получается часть, которая выбирает из всех графиков именно тот, на который два раза кликнет пользователь.
И подскажите, пожалуйста, можно ли вообще решить эту задачу с помощью qcustomplot или нужно именно средствами qt. Все, что мне приходит на ум - просто сравнивать координаты курсора с координатами точек каждого графика.
Код:
void MainWindow::handlerPlottableDoubleClick(QCPAbstractPlottable *plottable, int dataIndex, QMouseEvent *event)
{
    QList<QCPAbstractPlottable *> selected;
    QPointF posCursor = event->localPos();
    QPointF posPlot;

    if (event->button() == Qt::LeftButton)
    {
        if (ui->widget->graph(0)->selectTest(posCursor, true))
        {
            ...
        }
    }
}
Roberttt вне форума Ответить с цитированием
Старый 20.02.2022, 08:05   #2
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Можно попробовать использовать область MouseArea.
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Старый 20.02.2022, 16:08   #3
Roberttt
Пользователь
 
Регистрация: 30.05.2018
Сообщений: 56
По умолчанию

У меня получилось решить этот вопрос с помощью сравнения возвращаемого функцией selectTest значения с 0 и 0.5;

Код:
void MainWindow::handlerPlottableDoubleClick(QCPAbstractPlottable *plottable, int dataIndex, QMouseEvent *event)
{
    QPoint pos = event->pos();
    QVariant details;

    if (event->button() == Qt::LeftButton)
    {
        if (ui->widget->graph(0)->selectTest(pos, false, &details) <= 0.5
                && ui->widget->graph(0)->selectTest(pos, false, &details) >= 0)
        {
            QColor colorPen = QColorDialog::getColor("Select color a pen");
            if (colorPen.isValid())
                ui->widget->graph(0)->setPen(QPen(colorPen, 1));
        }
        else if (ui->widget->graph(1)->selectTest(pos, false, &details) <= 0.5
                    && ui->widget->graph(1)->selectTest(pos, false, &details) >= 0)
        {
            QColor colorPen = QColorDialog::getColor("Select color a pen");
            if (colorPen.isValid())
                ui->widget->graph(1)->setPen(QPen(colorPen, 1));
        }
}
Но теперь непонятно, как сделать подобный обход, но для неограниченного числа графиков? Пробовал использовать цикл, но в этом случае программа вылетает.
Roberttt вне форума Ответить с цитированием
Старый 06.03.2022, 18:23   #4
Roberttt
Пользователь
 
Регистрация: 30.05.2018
Сообщений: 56
По умолчанию

решил вот таким способом:

В коде используются списки:
1. QList <QWidget *> widgetList;
2. QList <QCPGraph *> graph;

Код:
void MainWindow::handlerPlottableDoubleClick(QCPAbstractPlottable *plottable, int dataIndex, QMouseEvent *event)
{
    QPoint pos = event->pos();
    QVariant details;

    if (event->button() == Qt::LeftButton)
    {
        if (!graph.isEmpty())
        {
            for (QWidget *w : widgetList)
            {
                if (w->objectName() == "widget")
                {
                    for (QCPGraph *g : graph)
                    {
                        if (g->selectTest(pos, false, &details) <= 0.5 && g->selectTest(pos, false, &details) >= 0)
                        {
                            QColor colorPen = QColorDialog::getColor("Select color a pen");
                            if (colorPen.isValid())
                                g->setPen(QPen(colorPen, 1));
                        }
                    }
                }
                else if (w->objectName() == "widget_2")
                {
                    for (QCPGraph *g : graph)
                    {
                        if (g->selectTest(pos, false, &details) <= 0.5 && g->selectTest(pos, false, &details) >= 0)
                        {
                            QColor colorPen = QColorDialog::getColor("Select color a pen");
                            if (colorPen.isValid())
                                g->setPen(QPen(colorPen, 1));
                        }
                    }
                }
            }
        }
    }
}
Roberttt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение игрока по клику мыши на С++ builder Razuvai C++ Builder 1 24.03.2022 15:03
автофильтр по клику мыши Iskin Microsoft Office Excel 16 17.10.2019 09:11
Как нарисовать квадрат по клику мыши? dekuk C# (си шарп) 3 05.07.2012 15:50
Как повернуть на определенный угол график Gamst Общие вопросы Delphi 4 01.02.2012 16:19
Закрытие окна по клику мыши tumanovalex Qt и кроссплатформенное программирование С/С++ 2 29.05.2011 19:29