Qt C++ настраиваемый график из таблицы sqlite

введите описание изображения здесьЯ новичок в Qt Creator C++. Я разработал приложение, в котором данные отображаются в tableView, извлекая их из базы данных Sqlite, пока здесь я не достиг успеха, но теперь я хочу построить график на пользовательском графике, указав значения для осей x и y из базы данных, которая у меня есть извлек его и отобразил в виджете tableView. Пример: данные из моей базы данных похожи на время и температуру. Теперь я хочу указать значения для оси X во времени и оси Y в температуре, пожалуйста, помогите мне в коде - я могу построить график в обычном режиме, как показано в приведенном ниже коде, как мне добавить значения базы данных по осям x и y.

void MainWindow::makePlot()
{
    QVector<double> x(100), y(101); 

//    x[0]=1;Here I want the application to take the values from tableView,like 
              Time on X axis and Temp on Y axis. 
//    x[1]=2;
//    x[2]=3;
//    x[3]=4;

//    y[0]=1;
//    y[1]=2;
//    y[2]=3;
//    y[3]=4;

    ui->customPlot->addGraph();
    ui->customPlot->graph(0)->setData(x, y);
    ui->customPlot->xAxis->setLabel("Time");
    ui->customPlot->yAxis->setLabel("Temp");
    ui->customPlot->xAxis->setRange(1, 15);
    ui->customPlot->yAxis->setRange(1, 15);
    ui->customPlot->replot();

}

Here is the code that displays the Database in tableView on push button.
void MainWindow::on_pushButton_clicked()
{
    MainWindow conn;
    QSqlQueryModel * modal=new QSqlQueryModel();
    conn.connOpen();
    QSqlQuery* qry=new QSqlQuery(conn.mydb);
    qry->prepare("select * from empdata");
    qry->exec();
    modal->setQuery(*qry);
    ui->tableView->setModel(modal);
    conn.connClose();
    qDebug() <<(modal->rowCount());
}[![enter image description here][1]][1]

вывод вышеуказанного кода

Пожалуйста, помогите мне.. Заранее спасибо..

введите здесь описание изображения


person Manu Manohara    schedule 16.07.2018    source источник
comment
@eyllanesc.. спасибо за беспокойство ... Я создал это в базе данных браузера sqlite, где я задал переменную Time как NUMERIC, и я вручную задаю данные как 10:20 и 10:25 и так далее, так что я думаю формат времени не должен быть проблемой, верно?   -  person Manu Manohara    schedule 16.07.2018


Ответы (1)


В этом решении я предполагаю, что таблица создается следующим образом (в качестве базы данных используется sqlite):

create table empdata (id INTEGER PRIMARY KEY AUTOINCREMENT, 
                      time DATETIME, 
                      temperature REAL)

Я также буду использовать QSqlTableModel в качестве модели, если вы хотите использовать QSqlQueryModel, логика аналогична.

QSqlTableModel *model=new QSqlTableModel;
model->setTable("empdata");
model->select();
ui->tableView->setModel(model);

ui->customPlot->xAxis->setLabel("Time");
ui->customPlot->yAxis->setLabel("Temp");
QSharedPointer<QCPAxisTickerDateTime> dateTicker(new QCPAxisTickerDateTime);
dateTicker->setDateTimeFormat("dd/MM/yyyy hh:mm:ss");
ui->customPlot->xAxis->setTicker(dateTicker);

QVector<QCPGraphData> timeData(model->rowCount());

for(int i=0; i< model->rowCount(); ++i){
    timeData[i].key = model->index(i, model->fieldIndex("time")).data().toDateTime().toTime_t();
    timeData[i].value = model->index(i, model->fieldIndex("temperature")).data().toDouble();
}

double Tmin = (*std::min_element(timeData.begin(), timeData.end(),
                                [](const QCPGraphData& x, const QCPGraphData& y)
{  return x.key < y.key; })).key;
double Tmax = (*std::max_element(timeData.begin(), timeData.end(),
                                [](const QCPGraphData& x, const QCPGraphData& y)
{  return x.key < y.key; })).key;

double Ymin = (*std::min_element(timeData.begin(), timeData.end(),
                                [](const QCPGraphData& x, const QCPGraphData& y)
{  return x.value < y.value; })).value;

double Ymax = (*std::max_element(timeData.begin(), timeData.end(),
                                [](const QCPGraphData& x, const QCPGraphData& y)
{  return x.value < y.value; })).value;

ui->customPlot->xAxis->setRange(Tmin, Tmax);
ui->customPlot->yAxis->setRange(Ymin, Ymax);
ui->customPlot->graph(0)->data()->set(timeData);
ui->customPlot->replot();

введите здесь описание изображения

В следующей ссылке приведен полный пример.


Обновление:

Решение похожее, но вам нужно преобразовать эту QString в QDateTime.

QSqlTableModel *model=new QSqlTableModel;
model->setTable("empdata2");
model->select();
ui->tableView->setModel(model);

ui->customPlot->xAxis->setLabel("Time");
ui->customPlot->yAxis->setLabel("Temp");
QSharedPointer<QCPAxisTickerDateTime> dateTicker(new QCPAxisTickerDateTime);
dateTicker->setDateTimeFormat("hh:mm");
ui->customPlot->xAxis->setTicker(dateTicker);

QVector<QCPGraphData> timeData(model->rowCount());

for(int i=0; i< model->rowCount(); ++i){
    timeData[i].key = QDateTime(QDate::currentDate(), model->index(i, model->fieldIndex("time")).data().toTime()).toTime_t();
    timeData[i].value = model->index(i, model->fieldIndex("temp")).data().toDouble();
}

double Tmin = (*std::min_element(timeData.begin(), timeData.end(),
                                [](const QCPGraphData& x, const QCPGraphData& y)
{  return x.key < y.key; })).key;
double Tmax = (*std::max_element(timeData.begin(), timeData.end(),
                                [](const QCPGraphData& x, const QCPGraphData& y)
{  return x.key < y.key; })).key;

double Ymin = (*std::min_element(timeData.begin(), timeData.end(),
                                [](const QCPGraphData& x, const QCPGraphData& y)
{  return x.value < y.value; })).value;

double Ymax = (*std::max_element(timeData.begin(), timeData.end(),
                                [](const QCPGraphData& x, const QCPGraphData& y)
{  return x.value < y.value; })).value;

ui->customPlot->xAxis->setRange(Tmin, Tmax);
ui->customPlot->yAxis->setRange(Ymin, Ymax);
ui->customPlot->graph(0)->data()->set(timeData);
ui->customPlot->replot();

введите здесь описание изображения

Новое решение можно найти по следующей ссылке.

person eyllanesc    schedule 16.07.2018
comment
Большое спасибо за код, я просмотрел коды в приведенной ссылке ... Хотя это выглядит сложно :) ... Но мне нужно передать данные как есть из таблицы без форматирования даты и времени муравья, как я задавая значение времени в sqlite db вручную как 10:20 и 10:25 и т. д., поэтому я просто хочу знать, как мне передать эти два значения переменных, значения времени и температуры на оси X и Y напрямую ... Еще раз спасибо за тебе пора и помоги чувак... - person Manu Manohara; 16.07.2018
comment
я приложил скриншот моей базы данных, так как я не могу поделиться с вами файлом .db... пожалуйста, сделайте это полностью.. Еще раз спасибо - person Manu Manohara; 16.07.2018
comment
Поля похожи... для времени: NUMERIC и для Temp: INTEGER - person Manu Manohara; 16.07.2018