Суть такая: в главном окне 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); //
}
Мы удаляем созданный обьект, создаем его заново и отображаем.
Может будут идеи как это лучше сделать и есть какие то методы, просто че то не могу пока найти. Потому что данные перестают приходить и график ничего не рисует (а должен), короче окно с графиком не реагирует....Кстати до того как я написал слот с удалением, все ок работало, так что проблема где то рядом....заранее Спасибо!