По ТЗ сделать так, чтобы при нажатой соответствующей 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 ответов

30 просмотров

не уверен что правильно понял, но кажется, как то ты и мудро слишком и слишком сложно делаешь.. определил кол-во входов -> создаешь для каждого входа 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); }

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

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

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Ребят, подскажите, пожалуйста, почему в префиксе к ассетам, которые генерируются через фильтр | theme в шаблоне, стал вдруг появляться index.php? Вот так выглядит ссылка на а...
Виталий
1
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
Карта сайта