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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как обнулить данные обьекта QDialog ?  (Прочитано 137263 раз)
Ostapich
Гость
« : Февраль 25, 2018, 00:00 »

Суть такая: в главном окне mainwindow создается обьект окна QDialog,не отображается. Отображется он по нажатию на две кнопки из меню и из самого интерфейса. В QDialog рисуется график, он принимает данные, анализирует их и сохраняет пока в своем объекте(  в дальнейшем хочу реализовать сохранение в файл) Нужно чтобы по нажатию кнопки из интерфейса ,график обнулялся , чтобы он был готов принемать новые данные, но все старые были стерты. Так вот. Сейчас я попробовал все это сделать обычным delete, а потом сразу создавая его. Но он перестал принимать данные, т.е. не слышит сигналов.
Код самого mainwindow.h:
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QMainWindow>
#include <QTimer>
#include <QTime>
#include "dialog_settings.h"
#include "grafick.h"
#include "qcustomplot.h"
#include "sitting.h"

namespace Ui
{
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    packet_big packet_one= {254, 232, 0, 0, 0, 0, 0, 0, 0};
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
signals:

    void on_off(int baudrate);
    void off();//включение таймера и всего по нажатию пуск
    void on();//отключение таймера и всего по нажатию пуск
    void sendArray(QByteArray data);//отправка данных
    void pomp_on(packet_big packet_one);//Сигнал о включении клапана
    void pomp_off(packet_big packet_one);//Сигнал о выключении клапана
    void sig_start_timer_if_temp();//Сигнал о старте тааймера после достижения определенной температуры и нажатия кнопки
    void signalInsertGraph(double dItem);//Если кнопка нажата испускаем сигнал с температурой для отрисовки графика
    void signalEndTimerTimeout(unsigned char temp_pomp_sig);//отпрвка в окно с графиком температуры охлаждения
    void signalEndReactiom();//Если температура упала до выставленного значения, закончить
    void signalSendTempAndTime(int temp,int time);//отпрвка в окно с графиком температуры реакции и времени реакции


public slots:
    void nasos_on();//включить насос
    void nasos_of();//выключить насос
    void settings_menu();//окно настроек Com порта
    void sitting_menu_iter();//окно настроек автоматизации
    void disp_lcd_time();//отображение таймера
    void disp_lcd_temp();//отображение температуры
    void vizvat_taimer();//Запуск таймера
    void disp_lcd_temp_timer();//Мигание таймера раз в сек.
    void save_str(QByteArray data);//Прием и сохранения данных с Com порта
    void put_in_array(packet_big data);//отправка на com порт
    void end_timer();//Выключение таймера возможно обтеденить с taimer_stop
    void lov_temp();//выключение нагревание после срабатывания таймера
    void renderWindowschedule();//отображение окна с графиком
    void VizovSignalEndTimerTimeout();//испускаем сигнал
    void sendSignalTempAndTime();//испускаем сигнал
    void main_slot_step_cooling(double step);//Сохраняем настройки значений
    void main_slot_threshold_cooling(double threshold);//Сохраняем настройки значений
    void clear_graf();//очистка окна с графиком


private slots:
    void slot_Button_clicked();//нажатие кнопки
    void taimer_stop();

private:
    Ui::MainWindow *ui;
    QTimer * timer; //Адресная переменная таймера
    QTimer * updater;
    Dialog_Settings *info;
    Grafick *graf;
    Sitting *sitting_iter;

    int num_time=0;//переменная выставленного времени
    int num_temp=0;//переменная выставленной температуры
    int num_tmp_temp=0;//флаг для вызова таймера один раз
    bool flag_but_on=0;//Флаг нажатой кнопки
    bool flag_end_reaktion=false;//флаг конца реакции

    double double_displey=0;//значение текущей температуры собраное из двух байт

    double step_cooling=0.5;//Значение шага старта таймера
    double threshold_cooling=32;//Порог остановки охлаждения

    QPixmap myPixmap_on;
    QPixmap myPixmap_of;
    QPixmap myPixmap_red;

    bool bViewGraph;
};

#endif // MAINWINDOW_H

Код самого mainwindow.cpp:
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog_settings.h"
#include "packet.h"
#include "grafick.h"
#include "qcustomplot.h"
#include "sitting.h"

#include <QPixmap>
#include <QMessageBox>
#include <QString>
#include <QDesktopWidget>
#include <QScreen>
#include <QMetaEnum>
#include <QPalette>
#include <errno.h>
#include <qdebug.h>

//bool flag_end_reaktion=true;
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){
    ui->setupUi(this);

    myPixmap_on=QPixmap("C:/if_Circle_Green_34211.png");
    myPixmap_of=QPixmap("C:/if_Circle_Grey_34212.png");
    myPixmap_red=QPixmap("C:/if_Circle_Red_34214.png");

    info = new Dialog_Settings(this);       //Создаем окно с настройками Com порта,
    info->setVisible(false);                //но не отображаем.

    graf = new Grafick(this);               //Создаем окно с настройками Com порта,
    graf ->setVisible(false);               //

    sitting_iter = new Sitting(this);       //Создаем окно с настройками Com порта,
    sitting_iter->setVisible(false);        //но не отображаем.

    ui->lcdNumber_3->display("00:00");
    ui->lcdNumber_4->display("00:00");

    ui->label_4->setPixmap(myPixmap_red);
    ui->label_3->setPixmap(myPixmap_of);

    ui->spinBox->setMaximum(250);
    ui->spinBox_2->setMaximum(500);

    //Таймер
    updater = new QTimer(this);
    connect(updater,SIGNAL(timeout()), this, SLOT(disp_lcd_temp_timer()));

    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), timer, SLOT(stop()));
    connect(timer, SIGNAL(timeout()), this, SLOT(nasos_on()));
    connect(timer, SIGNAL(timeout()), updater, SLOT(stop()));
    connect(timer, SIGNAL(timeout()), this, SLOT(end_timer()));
    connect(timer, SIGNAL(timeout()), this, SLOT(lov_temp()));
    connect(timer, SIGNAL(timeout()), this, SLOT(VizovSignalEndTimerTimeout()));
    //к сигналу timer timeout(), подсоеденить сигнал, который будет передавать температуру охлаждения,  а в графике записывать в значение endReactiontime

    connect(ui->action_Com,SIGNAL(triggered(bool)),this,SLOT(settings_menu()));
    connect(ui->action_3,SIGNAL(triggered(bool)),this,SLOT(close()));
    connect(ui->action,SIGNAL(triggered(bool)),this,SLOT(renderWindowschedule()));
    connect(ui->action_5,SIGNAL(triggered(bool)),this,SLOT(sitting_menu_iter()));
    connect(this,SIGNAL(on()),this,SLOT(renderWindowschedule()));
    connect(this,SIGNAL(on()),this,SLOT(clear_graf()));


    connect(ui->pushButton_3,SIGNAL(clicked()),this,SLOT(nasos_on()));
    connect(ui->pushButton_4,SIGNAL(clicked()),this,SLOT(nasos_of()));
    connect(ui->pushButton_5,SIGNAL(clicked()),this,SLOT(slot_Button_clicked()));
    connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(disp_lcd_time()));
    connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(disp_lcd_temp()));

    connect(this,SIGNAL(sig_start_timer_if_temp()),this,SLOT(vizvat_taimer()));
    connect(this,SIGNAL(sig_start_timer_if_temp()),graf,SLOT(startReaction_funkc()));
    connect(this, SIGNAL(signalEndTimerTimeout(unsigned char)), graf, SLOT(readTempPomp(unsigned char)));
    connect(this, SIGNAL(signalSendTempAndTime(int,int)), graf, SLOT(readCurrentTenpAndTime(int ,int )));
    connect(this, SIGNAL(signalEndReactiom()), graf, SLOT(endReactiom()));

    connect(this,SIGNAL(off()),this,SLOT(taimer_stop()));
    connect(this,SIGNAL(on()),this,SLOT(sendSignalTempAndTime()));


    connect(this,SIGNAL(pomp_off(packet_big)),this,SLOT(put_in_array(packet_big)));
    connect(this,SIGNAL(pomp_on(packet_big)),this,SLOT(put_in_array(packet_big)));

    connect(info, SIGNAL(duble_send_signal(QByteArray)), this, SLOT(save_str(QByteArray)));
    connect(this,SIGNAL(sendArray(QByteArray)),info,SIGNAL(writeData(QByteArray)));

    connect(this, SIGNAL(signalInsertGraph(double)), graf, SLOT(insertItem(double)));

    connect(sitting_iter,SIGNAL(emit_step_cooling(double)),this,SLOT(main_slot_step_cooling(double)));
    connect(sitting_iter,SIGNAL(emit_threshold_cooling(double)),this,SLOT(main_slot_threshold_cooling(double)));

    bViewGraph=false;
}

MainWindow::~MainWindow(){
    delete ui;
    qDebug("del");
}

void MainWindow::nasos_on()//включить насос
{
    ui->label_3->setPixmap(myPixmap_on);
    ui->label_4->setPixmap(myPixmap_of);

    packet_one.on_of_pomp=1;
    packet_one.pask();
    emit pomp_on(packet_one);
    qDebug("idx1");
}

void MainWindow::nasos_of()//выключить насос
{
    ui->label_4->setPixmap(myPixmap_red);
    ui->label_3->setPixmap(myPixmap_of);

    packet_one.on_of_pomp=0;
    packet_one.pask();
    emit pomp_off(packet_one);
    qDebug("idx2");
}


void MainWindow::settings_menu()//окно настроек Com порта
{
    info->setVisible(true);
}


void MainWindow::disp_lcd_time()//отображение таймера
{
    num_time=ui->spinBox_2->value();
    ui->lcdNumber_4->display(QTime::fromMSecsSinceStartOfDay(num_time*60000).toString("hh:mm"));
    packet_one.timer_ex=num_time;
    packet_one.pask();
    emit pomp_off(packet_one);

}

void MainWindow::disp_lcd_temp()//отображение температуры
{
    num_temp=ui->spinBox->value();
    ui->lcdNumber->display(num_temp);
    packet_one.current_temp_reactor=num_temp;
    packet_one.pask();
    emit pomp_off(packet_one);

}

void MainWindow::vizvat_taimer()//Запуск таймера
{
    qDebug("TimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimer");
    updater->setSingleShot(false);
    timer->setSingleShot(true);
    updater->start(1000);
    timer->start(num_time*60000);
}

void MainWindow::disp_lcd_temp_timer()//Мигание таймера раз в сек.
{

    QString text = QTime::fromMSecsSinceStartOfDay(timer->interval() - timer->remainingTime()).toString("hh:mm");

    if (((((timer->interval() - timer->remainingTime())/1000)) % 2) != 0)
        text[2] = ' ';
    ui->lcdNumber_3->display(text);
}


void MainWindow::slot_Button_clicked()
{
    if(flag_but_on==0)
    {
        flag_but_on=1;
        qDebug("flag_but_on_1");
        ui->pushButton_5->setText("СТОП");
        bViewGraph=true;
        emit on();
    }
    else if(flag_but_on==1)
    {
        flag_but_on=0;
        qDebug("flag_but_off_2");
        ui->pushButton_5->setText("ПУСК");
        ui->lcdNumber_3->display("00:00");
        QPalette Pal = ui->lcdNumber_3->palette();
        Pal.setColor(QPalette::Normal, QPalette::WindowText, Qt::black);
        Pal.setColor(QPalette::Normal, QPalette::Window, Qt::black);
        ui->lcdNumber_3->setPalette(Pal);
        num_tmp_temp=0;
        bViewGraph=false;
        emit off();
    }
}

void MainWindow::taimer_stop()//остановка таймера
{

    qDebug("stopstopstopstopstopstopstopstopstop");
    //if(updater)
    updater->stop();
    // if(timer)
    timer->stop();

}


void MainWindow::save_str(QByteArray data){//Прием и сохранения данных с Com порта
    packet_big tmp;
    memcpy((void*)&tmp, (void*)data.data(), sizeof(packet_big));//тут только почему void? У меня проблемы с пониманием приведения типа к void

    if(!tmp.test_pask()){
        packet_one=tmp;
        qDebug()<<" ONE byte:     "<<packet_one.start_byte_one<<"\n"
               <<"TWO byte:     " << packet_one.start_byte_two <<"\n"
              <<"TEMP byte:     "<< packet_one.temp_pomp<<"\n"
             <<"ON-OF byte:     "<<packet_one.on_of_pomp<<"\n"
            <<"packet_one.ex_temp_reactor_one:     "<<packet_one.ex_temp_reactor_one<<"\n"
           <<"packet_one.ex_temp_reactor_two:     "<<packet_one.ex_temp_reactor_two<<"\n"
          <<"CRC8 byte:     "<<packet_one.CRC8<<"\n"
         <<"Temp_curent:     "<<packet_one.current_temp_reactor<<"\n"
        <<"num_temp " <<num_temp<<"\n"
        <<"Timer:     "<<packet_one.timer_ex;
    }
    unsigned short mass_byte = ((unsigned short)packet_one.ex_temp_reactor_two << 8) | packet_one.ex_temp_reactor_one;
    if(((double)mass_byte )/10>=double_displey-5&&((double)mass_byte)/10<=double_displey+5||double_displey==0){
        double_displey=( (double)mass_byte )/10;
    }
    ui->lcdNumber_5->display(packet_one.temp_pomp);
    ui->lcdNumber_2->display(double_displey);
    if(bViewGraph){//сигнал с температурой если нажата кнопка
        emit signalInsertGraph(double_displey);
    }

    if(packet_one.on_of_pomp==0){
        ui->label_4->setPixmap(myPixmap_red);
        ui->label_3->setPixmap(myPixmap_of);

    }
    else if(packet_one.on_of_pomp==1){
        ui->label_3->setPixmap(myPixmap_on);
        ui->label_4->setPixmap(myPixmap_of);
    }

    if(flag_but_on==1 && (double_displey >= ((double)num_temp - step_cooling)
                          && double_displey <= ((double)num_temp + (step_cooling + 0,5)))
            && num_tmp_temp == 0){
        //костыль на отсечение битых данных, проверят нажатали кнопка, запущен ли был таймер один раз, и проходит
        //температура к формуле : выставленная температура -step_cooling и выставленная температура +(step_cooling+1)
        qDebug()<<"START TIMER **********************************************";
        qDebug()<<"double_displey - "<<double_displey;
        qDebug()<<"step_cooling - "<<step_cooling;
        qDebug()<<"num_tmp_temp - "<<num_tmp_temp;
        qDebug("TimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimer\n");
        qDebug()<<"flag_but_on==1 " <<flag_but_on;
        qDebug()<<"((double)double_displey>=((double)packet_one.current_temp_reactor-step_cooling) " <<(double_displey>=((double)packet_one.current_temp_reactor-step_cooling));
        qDebug()<<"flag_but_on==1 " <<(double_displey<=((double)packet_one.current_temp_reactor+step_cooling));
        qDebug()<<"num_tmp_temp " <<num_tmp_temp;
        qDebug()<<"num_temp " <<num_temp;
        qDebug()<<"**************************************************";
        num_tmp_temp=1;
        emit sig_start_timer_if_temp();
    }
    else{
        qDebug()<<"NOT START TIMER ---------------------------------";
        qDebug()<<"double_displey - "<<double_displey;
        qDebug()<<"step_cooling - "<<step_cooling;
        qDebug()<<"num_tmp_temp - "<<num_tmp_temp;
        qDebug()<<"num_temp " <<num_temp;
        qDebug()<<"------------------------------------------------";
    }

    if(double_displey<threshold_cooling&&flag_end_reaktion==true){//если меньше значения, то испускаем сигнал об конце рекции
        qDebug()<<"555555555555555555555555555";
        flag_end_reaktion=false;
        emit signalEndReactiom();
    }

}


void  MainWindow::put_in_array(packet_big data)//отправка на com порт
{

    QByteArray tmp;
    unsigned char* masstmp = (unsigned char* )&data;
    qDebug()<<" QQQQQQQQQQQQQQQQQQQQQ 333    "<<packet_one.on_of_pomp;
    for(unsigned int i=0; i<sizeof(data); i++)
    {
        tmp[i]=masstmp[i];
    }
    emit sendArray(tmp);
}


void MainWindow::end_timer(){//Выключение таймера возможно обтеденить с taimer_stop
    ui->lcdNumber_3->display(QTime::fromMSecsSinceStartOfDay(num_time*60000).toString("hh:mm"));
    QPalette Pal = ui->lcdNumber_3->palette();
    Pal.setColor(QPalette::Normal, QPalette::WindowText, Qt::red);
    Pal.setColor(QPalette::Normal, QPalette::Window, Qt::black);
    ui->lcdNumber_3->setPalette(Pal);
}

void MainWindow::lov_temp(){//выключение нагревание после срабатывания таймера
    num_temp=13;
    ui->lcdNumber->display(num_temp);
    packet_one.current_temp_reactor=num_temp;
    packet_one.pask();
    flag_end_reaktion=true;
    qDebug()<<"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"<<flag_end_reaktion;
    emit pomp_off(packet_one);

}

void MainWindow::renderWindowschedule(){//Создаем окно с настройками Com порта,
    graf ->setVisible(true);//
}
void MainWindow::sitting_menu_iter(){//окно настроек автоматизации

    sitting_iter ->setVisible(true);//
}

void MainWindow::VizovSignalEndTimerTimeout(){//испускаем сигнал
    emit signalEndTimerTimeout(packet_one.temp_pomp);
}
void MainWindow::sendSignalTempAndTime(){//испускаем сигнал
    emit signalSendTempAndTime(num_temp,num_time);
}

void MainWindow::main_slot_step_cooling(double step){//Сохраняем настройки значений
    step_cooling=step;
}

void MainWindow::main_slot_threshold_cooling(double threshold){//Сохраняем настройки значений
    threshold_cooling=threshold;
}

void MainWindow::clear_graf(){//очистка окна с графиком
    qDebug()<<"-----------------------------------DESTROI----------------";
    delete graf;
    graf = new Grafick(this);               //Создаем окно с настройками Com порта,
    graf ->setVisible(true);               //

}


graf это обьект того самого окна. В конструкторе класса я его создаю, но не отображаю.Если нажимается кнопка 1 то вызываю :
Код:
void MainWindow::renderWindowschedule(){//Создаем окно с настройками Com порта,
    graf ->setVisible(true);//
}
Если вторая, которая из интерфейса, то обновляем:
Код:
void MainWindow::clear_graf(){//очистка окна с графиком
    qDebug()<<"-----------------------------------DESTROI----------------";
    delete graf;
    graf = new Grafick(this);               //Создаем окно с настройками Com порта,
    graf ->setVisible(true);               //

}
Мы удаляем созданный обьект, создаем его заново и отображаем.
Может будут идеи как это лучше сделать и есть какие то методы, просто че то не могу пока найти. Потому что данные перестают приходить и график ничего не рисует (а должен), короче окно с графиком не реагирует....Кстати до того как я написал слот с удалением, все ок работало, так что проблема где то рядом....заранее Спасибо!
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #1 : Февраль 25, 2018, 09:36 »

А конекты к новому graf подключать не пробовали?
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


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

Ostapich, коннекты связаны с объектом, а не с классом. Удалили объект? - Все коннекты пропали! Либо создавайте коннекты в конструкторе класса Grafick, либо восстанавливайте их при каждом создании.
ЗЫ. Разобраться в вашем коде сложновато, он хоть и грамотно оформлен, но велик. Улыбающийся
Записан
Ostapich
Гость
« Ответ #3 : Февраль 25, 2018, 20:26 »

Спасибо за подсказку! Все заработало, подключил graf в окне где пересоздается он.
Кстати я в Qt новичок, как и в программировании. Подскажите как подключать сигнал-слот в обьекте , который создается в другом обьекте.( т.е. конструктор должен соединиться с обьектом, которого нет в самом классе конструктора, но этот класс есть в обьекте))) обьяснил как смог)))
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


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

Передавайте его как параметр (тому методу, который устанавливает соединение) или сделайте ссылку на него членом класса. Главное - он должен быть известеен в точке, где вы делаете коннект. Для объектов те же правила, что и для любых переменных с С++.
Записан
Ostapich
Гость
« Ответ #5 : Февраль 27, 2018, 09:56 »

Логично) спасибо большое!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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