У меня снова вопрос:
У меня есть класс PBV t (наследует от Tab), у которого есть класс Geometry. Геометрия является родителем Geo_1. Из Geo_1 я хочу иметь доступ к методам PBV (например, printContent. Как я могу это сделать? Я могу создавать Слоты для Сигналов, но так как мне приходится часто использовать методы PBV, это может сделать множество Слотов для Сигналов.
Вот мой код:
PBV.h:
#include "../Geometry/Geo_1.h"
class PBV : public Tab
{
Q_OBJECT
public:
explicit PBV (QWidget *parent = 0);
~ PBV ();
virtual void printContent( QStringList *const qsl);
private:
Geo_1 *GEO_1;
Geometry *GEO;
}
PBV.cpp:
…
Geo_1 *GEO_1;
GEO_1 = new Geo_1(this);
GEO_1->set_LNE_default();
…
.
Geo_1.h:
#ifndef GEO_1_H
#define GEO_1_H
#include "Geometry.h"#include "../Tabs/PBV.h"class Geo_1: public Geometry
{
Q_OBJECT
public:
Geo_1 (QObject *_parent = 0);
virtual void set_LNE_default();
};
#endif // GEO_1_H
.
Geo_1.cpp:
#include "Geometry.h"#include <QDebug>
#include "Geo_1.h"#include "../Tabs/PBV.h"
Geo_1::Geo_1(QObject*_parent)
: Geometry(_parent) {}
void Geo_1::set_LNE_default()
{
// here I want to use printContent
}
.
Geometry.h:
#ifndef GEOMETRY_H
#define GEOMETRY_H
#include <QObject>
class Geometry : public QObject
{
Q_OBJECT
public:
Geometry(QObject *_parent=0);
~Geometry();
virtual void set_LNE_default();
};
#endif // GEOMETRY_H
.
Geometry.cpp:
#include "Geometry.h"#include <QDebug>
Geometry::Geometry(QObject *_parent)
: QObject(_parent) {}
Geometry::~Geometry(){}
void Geometry::set_LNE_default() { }
Один из подходов, о котором говорится в комментариях, заключается в отслеживании родительского класса в конструкторе дочернего элемента:
В Geometry.h добавьте приватную переменную-член:
private:
PBV* m_pParentPBV;
Затем в конструкторе в Geometry.cpp установите это для родительского элемента, который вы уже передаете:
Geometry::Geometry(QObject *_parent)
: QObject(_parent)
{
m_pParentPBV = dynamic_cast<PBV*>(_parent);
}
Теперь вы можете вызывать методы для родителя, используя m_pParentPBV->printContent()
и т.п.
Других решений пока нет …