Название: Глупый вопрос
Отправлено: Ostapich от Февраль 20, 2018, 21:35
Почему когда я записываю в одном слоте класса, в переменную класса значение, в другом слоте, когда он вызывается, переменная эта равна изначальному значению в конструкторе. Первый слот точно вызывается первым, в логе переменная принимает значение , но когда вызывается второй слот, она обнуляется. Я наверное не понимаю принцип работы обьектов в Qt? Просто очень не хочется переменную эту глобально обьявлять. Бред какой то....
Название: Re: Глупый вопрос
Отправлено: Ostapich от Февраль 20, 2018, 21:38
Думал всегда если я в одном методе записал значение в переменную обьекта, то она там железобитонно навсегда....
Название: Re: Глупый вопрос
Отправлено: Old от Февраль 20, 2018, 21:45
Без кода сложно представить о чем речь. :)
Название: Re: Глупый вопрос
Отправлено: Ostapich от Февраль 20, 2018, 21:49
#ifndef GRAFICK_H #define GRAFICK_H
#include <QDialog> #include "qcustomplot.h"
namespace Ui { class Grafick; }
class Grafick : public QDialog { Q_OBJECT
public: explicit Grafick(QWidget *parent = 0); ~Grafick(); //Таймер, запускается когда создастся окно //Vector x,y //Vector x2,y2; //окно создаем когда на главном окне нажата кнопка?? public slots: void insertItem(double iT); void startReaction_funkc();
private: QCustomPlot *customplot; QCPGraph *graphic; // Объявляем график double startReaction; //double timeCur=0; private: Ui::Grafick *ui; };
#endif // GRAFICK_H
#include "grafick.h" #include "ui_grafick.h" #include "mainwindow.h" #include <QDebug> double timeCur=0; Grafick::Grafick(QWidget *parent) : QDialog(parent), ui(new Ui::Grafick){ ui->setupUi(this); /*QVector<double> x(100), y(100); for(int i = 0; i < 100; i++){ x[i] = i; y[i] = x[i]; }*/
customplot=new QCustomPlot(); customplot->setInteraction(QCP::iRangeZoom,true); // Включаем взаимодействие удаления/приближения customplot->setInteraction(QCP::iRangeDrag, true); // Включаем взаимодействие перетаскивания графика customplot->axisRect()->setRangeDrag(Qt::Horizontal); // Включаем перетаскивание только по горизонтальной оси customplot->axisRect()->setRangeZoom(Qt::Horizontal); // Включаем удаление/приближение только по горизонтальной оси customplot->xAxis->setTickLabelType(QCPAxis::ltDateTime); // Подпись координат по Оси X в качестве Даты и Времени customplot->xAxis->setDateTimeFormat("hh:mm"); // Устанавливаем формат даты и времени // Настраиваем шрифт по осям координат customplot->xAxis->setTickLabelFont(QFont(QFont().family(), 8)); customplot->yAxis->setTickLabelFont(QFont(QFont().family(), 8));
// Автоматическое масштабирование тиков по Оси X //customplot->xAxis->setAutoTickStep(true); /* Делаем видимыми оси X и Y по верхней и правой границам графика, но отключаем на них тики и подписи координат*/ customplot->xAxis2->setVisible(true); customplot->yAxis2->setVisible(true); customplot->xAxis2->setTicks(false); customplot->yAxis2->setTicks(false); customplot->xAxis2->setTickLabels(false); customplot->yAxis2->setTickLabels(false); customplot->yAxis->setRange(0, 100); customplot->yAxis->setRange(0, 300);
customplot->yAxis->setTickLabelColor(QColor(Qt::red)); // Красный цвет подписей тиков по Оси Y customplot->legend->setVisible(true); //Включаем Легенду графика // Устанавливаем Легенду в левый верхний угол графика customplot->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignLeft|Qt::AlignTop);
// Инициализируем график и привязываем его к Осям graphic = new QCPGraph(customplot->xAxis, customplot->yAxis); customplot->addPlottable(graphic); // Устанавливаем график на полотно graphic->setName("Температура, Т"); // Устанавливаем graphic->setPen(QPen(QColor(Qt::red))); // Устанавливаем цвет графика graphic->setAntialiased(false); // Отключаем сглажzxvb ивание, по умолчанию включено graphic->setLineStyle(QCPGraph::lsImpulse); // График в виде импульсных тиков
ui->gridLayout->addWidget(customplot,0,0,1,1); //customplot->graph(0)->setData(x, y); // Устанавливаем данные //customplot->rescaleAxes(); // Масштабируем график по данным //customplot->yAxis->setRange(0, 300); //customplot->replot(); }
Grafick::~Grafick(){ delete ui; }
void Grafick::insertItem(double iT){ static QTime timeWork=QTime::currentTime(); double workTime=timeWork.elapsed()/1000; timeCur=workTime; customplot->graph(0)->addData(workTime, iT); customplot->xAxis->setRange(workTime, 10, Qt::AlignRight); //customplot->rescaleAxes(); qDebug()<<"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! StartReaction: "<<startReaction<<"\n"; customplot->replot(); }
void Grafick::startReaction_funkc(){ startReaction=timeCur; qDebug()<<"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! StartReaction: "<<startReaction<<"\n"; }
Я про переменную timeCur, сейчас она глобально объявлена , все ок. Когда она обьявлена в классе, она назначается в слоте insertItem(double iT), а когда вызывается startReaction_funkc(), там уже ничего нет.....
Название: Re: Глупый вопрос
Отправлено: Ostapich от Февраль 20, 2018, 21:51
Причем insertItem(double iT) вызывается по таймеру из главного окна раз в секунду, а startReaction_funkc() реагирует на событие, которое точно происходит после вызова insertItem(double iT)
Название: Re: Глупый вопрос
Отправлено: ssoft от Февраль 21, 2018, 08:22
Может потому что объявление в конструкторе выглядит так? C++ (Qt) class Grafick : public QDialog { ... double timeCur=0; ... };
А должно быть так C++ (Qt) class Grafick : public QDialog { ... double timeCur; ... };
Название: Re: Глупый вопрос
Отправлено: Ostapich от Февраль 21, 2018, 10:17
А разве нельзя инициализировать переменную сразу в описании класса? Проблема решена, дело в том что в главном окне я подключил слот который читает по событию переменную не в том месте.
Название: Re: Глупый вопрос
Отправлено: Racheengel от Февраль 21, 2018, 23:49
Вот тоже не понял, шо не так с double timeCur=0; ?
Название: Re: Глупый вопрос
Отправлено: kambala от Февраль 22, 2018, 00:02
может у тебя создаются разные экземпляры класса Grafick? только так получается объяснить Я про переменную timeCur, сейчас она глобально объявлена , все ок. Когда она обьявлена в классе, она назначается в слоте insertItem(double iT), а когда вызывается startReaction_funkc(), там уже ничего нет.....
|