Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Ostapich от Февраль 20, 2018, 21:35



Название: Глупый вопрос
Отправлено: 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(), там уже ничего нет.....