По ТЗ сделать так, чтобы при нажатой соответствующей CheckBox показывался

нужная кривая на графике. Моя мысль по реализации была такой: дать каждой галочке своё имя, соответствующее обычному порядковому номеру, отрисовать все графики, скрыть ненужные, а затем, по необходимости показывать соответствующую кривую.

Объекты, о которых говорится выше, создаются динамически. Графики реализованы на QCustomPlot.

Показываю пример:
gridLGraphics = new QGridLayout(ui->gB_graphic_N);
for (unsigned int j = 1; j <= train_data->num_input; j++) {
QCheckBox *checkBox = new QCheckBox;
checkBox->setText("Вход " + QString::number(j));
checkBox->setObjectName(QString::number(j));
connect(checkBox, &QCheckBox::clicked, this, &MainWindow::slotChecked);
gridLGraphics->addWidget(checkBox);
}

for (unsigned int j = 1; j <= train_data->num_input; j++) {
QCustomPlot *customPlot = new QCustomPlot;
QWidget* widget = static_cast<QCustomPlot *> (customPlot);

customPlot->xAxis->setRange(0,train_data->num_data);
customPlot->yAxis->setRange(-1,1);
for(unsigned int i = 0; i < train_data->num_input; i++)
{
customPlot->addGraph();
x.clear();
y.clear();
for (unsigned int k = 0; k < train_data->num_data; k++) {
x.push_back(k);
y.push_back(train_data->input[k][i]);
}
customPlot->graph(i)->addData(x,y);
customPlot->graph(i)->setPen(QColor(rand()%255,rand()%255,rand()%255));
customPlot->replot();

}
ui->tW_grapfics->insertTab(j,widget,"График " + QString::number(j));

}

В общем, вопрос такой: нажатие определенного checkBox'а провожу с помощью обычного слота, подключенного к каждому объекту с помощью сигнала:
QCheckBox *box = (QCheckBox*) sender();
Нажатие отрабатывается нормально, определение кнопки работает верно.
Затем я хочу вытащить из двух (их может быть больше) вкладок QCustomPlot и провести там манипуляции с графиками. Делал это тремя способами:
1. QCustomPlot * plot = static_cast<QCustomPlot*>(ui->tW_grapfics->currentWidget());
plot->graph(box->objectName().toInt())->setVisible(false);
2. QList<QCustomPlot*> plots = ui->tW_grapfics->findChildren<QCustomPlot*>();
plots[0]->graph(2)->setVisible(false);
3. QCustomPlot *plot = qobject_cast<QCustomPlot *> (ui->tW_grapfics->currentWidget());

Один из вариантов (вроде 3ий) отрабатывает, но почему-то не на нулевом (График 1) окошке, а на первом (График 2), хотя нахожусь я на нулевом.

Может я что-то не правильно делаю, что-то неправильно создаю/подсовываю? Буду благодарен любой подсказке и наведению на мысль

3 ответов

12 просмотров

не уверен что правильно понял, но кажется, как то ты и мудро слишком и слишком сложно делаешь.. определил кол-во входов -> создаешь для каждого входа checkBox в одном месте и tab в другом, верно? ну так на этапе создания свяжи каждую пару через QHash (QMap) Так оно надежнее, нагляднее и очевиднее. Поскольку в контейнере ты будешь хранить ссылки на объекты, и у тебя их не сотни тысяч, по ресурсам это будет копейки стоить

Александр Серый
Спасибо! Попробую!

видимо, тут тебе как-то так сделать QCheckBox *box = (QCheckBox*) sender(); if (!box || !m_boxPlotHash.contains(box)) return; QCustomPlot *plot=m_boxPlotHash.value(box); do_some_thing_with_plot Если надо все спрятать, а этот показать, то как-то: QCheckBox *currentBox = (QCheckBox*) sender(); foreach (QCheckBox *box, m_boxPlotHash.keys()) { if (!m_boxPlotHash.contains(box)) continue; QCustomPlot *plot=m_boxPlotHash.value(box); if (!plot) continue; plot->setVisible(box == currentBox); }

Похожие вопросы

Обсуждают сегодня

вопрос: кто как решает вопрос с динамической подгрузкой скриптов для отдельных страниц с включенным turbo router?
Sergei Toroptsev
25
Друзья, за кем?
Magic
12
Всем привет. Кто-то может подсказать, как можно перевести значения Selection поля, если список значений в нем формируется динамически? Я изначально их получаю из selection дру...
Наталья Селезнева
6
ого, спасибо Никит, ты как всегда кладезь нужной инфы! Сейчас пойду копаться, а мне релиз создать как и версию самого плагина? типа 1.0.8?
Alex Blaze
6
Почему Telegram пишет, что объект media не найден, хотя на самом деле я его передаю? Делаю на urllib, без зависимостей, так надо. Вызываю метод sendMediaGroup с таким JSON: ...
Alexey S
1
Сonst magicTgHTML = (text, entities) => { let processedText = text; let offsetShift = 0; entities.forEach(entity => { const { offset, length, type, url, ...
Андрей
1
Чет мне ссыкотно опять Rainlab.User в проект ставить. Кто знает, опять наотъебись все сделали или после обнов пользоваться можно?
Black Cat
10
коллеги привет. уже второй день бьемся об заклад с одной ошибкой, может вы сталкивались с таки странным поведением? есть тестовый сервер, на который паблишим релизную версию W...
Magzhan
11
это группа токсиков или тех кто помогает?
Ибрагим
9
В смысле более затратная? Общая стоимость владения лошадью меньше, чем автомобиля. В среднем.
Sergej R
10
Карта сайта