Russian Qt Forum
Апрель 20, 2024, 13:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Глупый вопрос  (Прочитано 4507 раз)
Ostapich
Гость
« : Февраль 20, 2018, 21:35 »

Почему когда я записываю в одном слоте класса, в переменную класса значение, в другом слоте, когда он вызывается, переменная эта равна изначальному значению в конструкторе. Первый слот точно вызывается первым, в логе переменная принимает значение , но когда вызывается второй слот, она обнуляется. Я наверное не понимаю принцип работы обьектов в Qt? Просто очень не хочется переменную эту глобально обьявлять. Бред какой то....
Записан
Ostapich
Гость
« Ответ #1 : Февраль 20, 2018, 21:38 »

Думал всегда если я в  одном методе записал значение в переменную обьекта, то она там железобитонно навсегда....
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #2 : Февраль 20, 2018, 21:45 »

Без кода сложно представить о чем речь. Улыбающийся
Записан
Ostapich
Гость
« Ответ #3 : Февраль 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(), там уже ничего нет.....
Записан
Ostapich
Гость
« Ответ #4 : Февраль 20, 2018, 21:51 »

Причем insertItem(double iT) вызывается по таймеру из главного окна раз в секунду, а startReaction_funkc() реагирует на событие, которое точно происходит после вызова insertItem(double iT)
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #5 : Февраль 21, 2018, 08:22 »

Может потому что объявление в конструкторе выглядит так?

Код
C++ (Qt)
class Grafick : public QDialog
{
   ...
   double timeCur=0;
   ...
};
 

А должно быть так

Код
C++ (Qt)
class Grafick : public QDialog
{
   ...
   double timeCur;
   ...
};
 
Записан
Ostapich
Гость
« Ответ #6 : Февраль 21, 2018, 10:17 »

А разве нельзя инициализировать переменную сразу в описании класса?
Проблема решена, дело в том что в главном окне я подключил слот который читает по событию переменную не в том месте.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #7 : Февраль 21, 2018, 23:49 »

Вот тоже не понял, шо не так с  double timeCur=0; ?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #8 : Февраль 22, 2018, 00:02 »

может у тебя создаются разные экземпляры класса Grafick? только так получается объяснить
Цитировать
Я про переменную timeCur, сейчас она глобально объявлена , все ок. Когда она обьявлена в классе, она назначается в слоте insertItem(double iT), а когда вызывается startReaction_funkc(), там уже ничего нет.....
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.115 секунд. Запросов: 22.