продлить время жизни объекта QT за пределами конструктора - PullRequest
0 голосов
/ 21 сентября 2019

это проблема, данная мне

  1. создайте проект с именем datamanager, и его базовый класс должен быть QWidget
  2. , добавьте новый класс с именем controller, унаследованный от QObject
  3. и 2 слота, называемые sensordatarecived и startdatacollection в контроллере
  4. , добавляют еще один класс, называемый класс общего читателя, унаследованный от QObject
  5. , определяют 2 сигнала, называемые readStarted () и readCompleted () в классе общего читателя
  6. добавить слот с именем sendData ()
  7. объявить виртуальную функцию под названием monitor () в классе commonreader
  8. добавить 5 новых классов датчиков, которые наследуются от класса commonreader
  9. во всех перечисленных выше классах переопределить общую функцию Monitor ()
  10. , используя объект QTimer, реализующий emit readStarted () из функции monitor () каждого из 5 определенных классов
  11. , реализующих sendData () slot
  12. испускает сигнал, называемый readcompleted внутри слота передачи данных ()
  13. creaт. е. объект каждого из перечисленных выше классов датчиков в конструкторе контроллера
  14. вызов функции monitor () объекта-датчика метода из startDataCollection ()
  15. , соединяющий сигнал readComplete () каждого объекта сСенсордата получена () от контроллера.

это шаги, которые я должен выполнить для проекта. Я застрял на 14-м шаге, и мне нужна помощь.

//controller.h
class controler : public QObject
{
    Q_OBJECT
public:
    explicit controler(QObject *parent = nullptr);

signals:

public slots:
    void sensorDataRecived();
    void startDataCollection();

};

//controller.cpp

#include "controler.h"
#include <QDebug>
#include "heart_1_sensor.h"
#include "eye_2_sensor.h"
#include "brain_3_sensor.h"
#include "ear_5_sensor.h"
#include "head_4_sensor.h"
#include "commonreaderclass.h"

controler::controler(QObject *parent) : QObject(parent)
{
    commonReaderClass *h1=new heart_1_Sensor;
    commonReaderClass *e2=new eye_2_Sensor;
    commonReaderClass *b3=new brain_3_sensor;
    commonReaderClass *e5=new ear_5_sensor;
    commonReaderClass *h4=new head_4_sensor;



}

void controler::sensorDataRecived()
{
    qDebug()<<Q_FUNC_INFO<<endl;

}

void controler::startDataCollection()
{
}
//commonreaderclass.h

#ifndef COMMONREADERCLASS_H
#define COMMONREADERCLASS_H

#include <QObject>

class commonReaderClass : public QObject
{
    Q_OBJECT
public:
    explicit commonReaderClass(QObject *parent = nullptr);
    virtual void monitor();

signals:
    void readingStarted();
    void readCompleted();

public slots:
    void sendData();
};

#endif // COMMONREADERCLASS_H

//commonreaderclass.cpp
#include "commonreaderclass.h"
#include <QDebug>
#include <QTimer>

commonReaderClass::commonReaderClass(QObject *parent) : QObject(parent)
{

}

void commonReaderClass::sendData()
{
    qDebug()<<"sending data has started"<<endl;
    emit readCompleted();

}
//sensor1.h
#ifndef HEART_1_SENSOR_H
#define HEART_1_SENSOR_H
#include "commonreaderclass.h"


class heart_1_Sensor:public commonReaderClass
{
public:
    heart_1_Sensor();
    virtual void monitor();
};

#endif // HEART_1_SENSOR_H
//sensor 1.cpp
#include "heart_1_sensor.h"
#include <QDebug>
#include <QTimer>

heart_1_Sensor::heart_1_Sensor()
{

}

void heart_1_Sensor::monitor()
{
    qDebug()<<"monitoring the heart"<<endl;
        QTimer *timer = new QTimer(this);
        connect(timer, SIGNAL(timeout()), this, SLOT(sendData()));
        timer->start(2000);
        emit readingStarted();
}

//and another 4 sensors of the same implementation

1 Ответ

0 голосов
/ 21 сентября 2019

Я согласен с @molbdnilo, что вы должны сделать h1, e2, ... членами класса вместо локальных переменных в конструкторе.Но в этом случае есть еще одно соображение: время жизни QObject экземпляров является особенным, потому что отношения родитель / потомки между ними, так что потомки могут быть автоматически уничтожены при уничтожении родителя.Я рекомендую вам эту книгу (также доступны печатные версии на бумаге).Специально глава 2 о классах и глава 8 о QObject и других важных классах Qt.Эта книга является учебной программой, вы должны следовать ей от начала до конца, а также читать другие книги.

controller.h

class Controller : public QObject
{
    Q_OBJECT
public:
    explicit Controller(QObject *parent = nullptr);
    ~Controller(); // the destructor
    // ... more public members
signals:
    // ... 
public slots:
    // ... 
private:
    commonReaderClass *m_h1;
    commonReaderClass *m_e2;
    // ...
};

Я переименовал переменные h1 в m_h1 и e2 вm_e2, следующий общему соглашению для имен переменных-членов, а имя класса Controller, начинающееся с заглавной буквы, является еще одним распространенным соглашением об именах.

controller.cpp (классический способ C ++)

Controller::Controller(QObject *parent) : QObject(parent)
{
    m_h1 = new heart_1_Sensor;
    m_e2 = new eye_2_Sensor;
    // ...
}

Controller::~Controller()
{
    delete m_h1;
    delete m_e2;
    // ...
}

controller.cpp (способ Qt)

Controller::Controller(QObject *parent) : QObject(parent)
{
    m_h1 = new heart_1_Sensor(this);
    m_e2 = new eye_2_Sensor(this);
    // ...
}

Controller::~Controller()
{ }

Вторая версия controller.cpp обычно предпочтительнее при написании программ на основе Qt.Следует помнить, что в C ++ каждый указатель, инициализированный операцией new, должен иметь соответствующую операцию delete.В C ++ нет автоматической «сборки мусора», но QObject предоставляет довольно удобный механизм автоматического удаления дочерних объектов, поэтому деструктор во второй версии может быть пустым или его можно полностью опустить.

...