нужная кривая на графике. Моя мысль по реализации была такой: дать каждой галочке своё имя, соответствующее обычному порядковому номеру, отрисовать все графики, скрыть ненужные, а затем, по необходимости показывать соответствующую кривую.
Объекты, о которых говорится выше, создаются динамически. Графики реализованы на 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), хотя нахожусь я на нулевом.
Может я что-то не правильно делаю, что-то неправильно создаю/подсовываю? Буду благодарен любой подсказке и наведению на мысль
не уверен что правильно понял, но кажется, как то ты и мудро слишком и слишком сложно делаешь.. определил кол-во входов -> создаешь для каждого входа 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); }
Обсуждают сегодня