Название: Как обнулить данные обьекта QDialog ?
Отправлено: 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); //
}
Мы удаляем созданный обьект, создаем его заново и отображаем. Может будут идеи как это лучше сделать и есть какие то методы, просто че то не могу пока найти. Потому что данные перестают приходить и график ничего не рисует (а должен), короче окно с графиком не реагирует....Кстати до того как я написал слот с удалением, все ок работало, так что проблема где то рядом....заранее Спасибо!
Название: Re: Как обнулить данные обьекта QDialog ?
Отправлено: Mikhail от Февраль 25, 2018, 09:36
А конекты к новому graf подключать не пробовали?
Название: Re: Как обнулить данные обьекта QDialog ?
Отправлено: Day от Февраль 25, 2018, 14:19
Ostapich, коннекты связаны с объектом, а не с классом. Удалили объект? - Все коннекты пропали! Либо создавайте коннекты в конструкторе класса Grafick, либо восстанавливайте их при каждом создании. ЗЫ. Разобраться в вашем коде сложновато, он хоть и грамотно оформлен, но велик. :)
Название: Re: Как обнулить данные обьекта QDialog ?
Отправлено: Ostapich от Февраль 25, 2018, 20:26
Спасибо за подсказку! Все заработало, подключил graf в окне где пересоздается он. Кстати я в Qt новичок, как и в программировании. Подскажите как подключать сигнал-слот в обьекте , который создается в другом обьекте.( т.е. конструктор должен соединиться с обьектом, которого нет в самом классе конструктора, но этот класс есть в обьекте))) обьяснил как смог)))
Название: Re: Как обнулить данные обьекта QDialog ?
Отправлено: Day от Февраль 25, 2018, 21:24
Передавайте его как параметр (тому методу, который устанавливает соединение) или сделайте ссылку на него членом класса. Главное - он должен быть известеен в точке, где вы делаете коннект. Для объектов те же правила, что и для любых переменных с С++.
Название: Re: Как обнулить данные обьекта QDialog ?
Отправлено: Ostapich от Февраль 27, 2018, 09:56
Логично) спасибо большое!
|