
Виталий Антипов22 мая 2018 г. 22:50
Данные из QChartview в QTableWidget
Здравствуйте! Пишу приложение для парсинга текстового файла и вывода данных на график. Столкнулся с проблемой передачи данных от курсора мыши на графике в ячейку таблицы.
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QtCharts/QLineSeries> #include <QtCharts/QVXYModelMapper> #include <QtWidgets/QGridLayout> #include <QtWidgets/QTableView> #include <QtWidgets/QTableWidget> #include <QtWidgets/QHeaderView> #include <QSplitter> #include <QTextEdit> #include <QStandardItemModel> #include <QTextStream> #include <QFile> #include <QDebug> #include <QDateTimeAxis> #include <QValueAxis> #include <QDateTime> #include <QAbstractItemModel> #include <QLabel> #include <QMouseEvent> #include <chart.h> #include <chartview.h> QT_CHARTS_USE_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); public: QTableWidget *tabwidget = new QTableWidget; QStandardItemModel *model = new QStandardItemModel; Chart *chart = new Chart; ChartView *chartview = new ChartView(chart); bool m_pressedItemState; QVector<QDateTime> list; public slots: /*Для улавливания изменения состояния чекбокса использую *следующие два метода*/ void tableItemPressed(QTableWidgetItem * item) { m_pressedItemState = item->checkState(); } void tableItemChanged(QTableWidgetItem * item) { if(item->checkState() == Qt::Checked){ int id = tabwidget->row(item); onAddSeries(id+1); } else { int id = tabwidget->row(item); onDelSeries(id+1); } } /*слот добавления серии на график. Номеру строки таблицы i *соответствует номер колонки в модели*/ void onAddSeries(int i); /*слот удаления серии из графика. Номеру строки таблицы i *соответствует ObjectName серии*/ void onDelSeries(int i); void onAddTableItem(); }; #endif // MAINWINDOW_Hmainwindow.cpp
#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { /*инициализируем виджеты, парсим файл (заголовки отправляем в таблицу, данные в модель), * создаем сигнально-слотовые соединения для создания/удаления серий графика*/ chartview->resize(800, 400); tabwidget->resize(800, 100); QSplitter *splitter = new QSplitter(Qt::Vertical); splitter->addWidget(chartview); splitter->addWidget(tabwidget); this->setCentralWidget(splitter); QFile file("test.txt"); if (file.open(QIODevice::ReadOnly)) { int lineindex = 0; QTextStream in(&file); QString fileLine = in.readLine(); QStringList lineToken = fileLine.split("\t", QString::SkipEmptyParts); tabwidget->insertColumn(0); tabwidget->insertColumn(1); QStringList s; s.append("KKS датчика"); s.append("Значение"); tabwidget->setHorizontalHeaderLabels(s); for (int j = 0; j < lineToken.size(); j++) { tabwidget->insertRow(j); QString value = lineToken.at(j); QTableWidgetItem *item = new QTableWidgetItem(); item->data(Qt::CheckStateRole); item->setCheckState(Qt::Unchecked); item->setText(value); tabwidget->setItem(j, lineindex, item); } while (!in.atEnd()) { QString fileLine = in.readLine(); QStringList lineToken = fileLine.split("\t", QString::SkipEmptyParts); for (int j = 0; j < lineToken.size(); j++) { if(j==0){ QString dd = lineToken.at(j); QDateTime dt = QDateTime::fromString(dd, "dd-MM-yyyy hh:mm:ss"); QStandardItem *item = new QStandardItem(QString::number(dt.toMSecsSinceEpoch())); model->setItem(lineindex, j, item); } else { QString value = lineToken.at(j); QStandardItem *item = new QStandardItem(value); model->setItem(lineindex, j, item); } } lineindex++; } file.close(); } tabwidget->removeRow(0); tabwidget->resizeColumnsToContents(); connect(tabwidget,SIGNAL(itemPressed(QTableWidgetItem *)),this,SLOT(tableItemPressed(QTableWidgetItem *))); connect(tabwidget,SIGNAL(itemChanged(QTableWidgetItem *)),this,SLOT(tableItemChanged(QTableWidgetItem *))); chartview->setRenderHint(QPainter::Antialiasing); chart->setAnimationOptions(QChart::AllAnimations); } void MainWindow::onAddSeries(int i){ /*создаем серию для выбранного датчика i*/ QLineSeries *series = new QLineSeries(this); series->setName("Линия " + QString::number(i)); series->setObjectName("obj" + QString::number(i)); QVXYModelMapper *mapper = new QVXYModelMapper(this); mapper->setXColumn(0); mapper->setYColumn(i); mapper->setSeries(series); mapper->setModel(model); chartview->chart()->addSeries(series); if(!chartview->chart()->axisX()){ //если оси времени еще нет, то создаем QDateTimeAxis *axisX = new QDateTimeAxis; axisX->setObjectName("axiX" + QString::number(i)); axisX->setTickCount(10); axisX->setFormat("dd-MM-yyyy hh:mm:ss"); chartview->chart()->addAxis(axisX, Qt::AlignBottom); series->attachAxis(axisX); } QValueAxis *axisY = new QValueAxis; //для каждой серии свою ось Y axisY->setObjectName("axiY" + QString::number(i)); axisY->setLabelFormat("%i"); chartview->chart()->addAxis(axisY, Qt::AlignLeft); series->attachAxis(axisY); onAddTableItem(); } void MainWindow::onDelSeries(int i){ /*при снятии галочки с чекбокса датчика удаляем соответствующую ему серию*/ chartview->chart()->findChild<QLineSeries *>("obj" + QString::number(i))->deleteLater(); chartview->chart()->findChild<QValueAxis *>("axiY" + QString::number(i))->deleteLater(); } void MainWindow::onAddTableItem(){ QTableWidgetItem *item2 = new QTableWidgetItem; item2->setText(chartview->coordX_str); /*как обновлять это значение, которое приходит из chartview->mouseMoveEvent()?*/ tabwidget->setItem(0, 1, item2); } MainWindow::~MainWindow() { }метод получения координат по курсору мыши в классе ChartView:
void ChartView::mouseMoveEvent(QMouseEvent *event) { if (m_isTouching) return; coordY = chart()->mapToValue(event->pos()).y(); coordX = chart()->mapToValue(event->pos()).x(); QDateTime dt = QDateTime::fromMSecsSinceEpoch(chart()->mapToValue(event->pos()).x()); coordX_str = dt.toString("dd-MM-yyyy hh:mm:ss"); qDebug()<<coordY; qDebug()<<coordX_str; QChartView::mouseMoveEvent(event); }При вызове слота void MainWindow::onAddTableItem() ячейка таблицы заполняется однажды и значения не обновляются. Как можно добиться обновления данных? По логике напрашивается обновлять значение ячейки прямо из метода void ChartView::mouseMoveEvent(QMouseEvent *event), но это другой класс, который не знает про эту ячейку. Пробовал в chartview.cpp инклудить mainwindow.h чтобы иметь доступ к виджетам, но спотыкаюсь об "invalid use of non-static data member". Подскажите, как решить проблему.

Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Ua
- Unknown akadamn
- 24 января 2025 г. 17:14
Qt - Тест 001. Сигналы и слоты
- Результат:84баллов,
- Очки рейтинга4
Ua
- Unknown akadamn
- 24 января 2025 г. 16:22
Qt - Тест 001. Сигналы и слоты
- Результат:42баллов,
- Очки рейтинга-8
Последние комментарии
ИМ
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Игорь Максимов22 ноября 2024 г. 21:51

Evgenii Legotckoi31 октября 2024 г. 23:37
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь Максимов5 октября 2024 г. 16:51
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
f
Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
firstlunoxod15 февраля 2025 г. 13:46

Дмитрий3 февраля 2025 г. 16:24
не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Добрый день!
Спасибо за подсказку, но сигнал-слот не работает. При попытке вызвать сигнал
Проблема решена, надо было просто перезапустить qmake! Евгений, огромное спасибо!