Qt C ++使用在创建的对象中创建类的方法

时间:2017-01-17 12:46:00

标签: c++ qt class

我仍然卡住了。

我有一个创建Object的GUI类。从这个新对象的方法我想使用创建类的方法

我有一个带有line_Edits和一个Combobox的Gui(PBV)。在这个Combobox中,我可以选择不同的Geometries。 Geo_1,Geo_2,......继承自Geometry。根据组合框中的条目,我想创建不同的对象(Geo_1,Geo_2,...),然后根据Geo_n-Object的需要设置创建类的lineEdits。

我不想用信号槽

做到这一点

我对此提出了不同的问题,但我无法进一步了解。

我不知何故觉得这有点递归......戴帽子有解决方案吗?

这是我的代码:

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() { }

1 个答案:

答案 0 :(得分:3)

当PBV分配Geo_1实例时,已经在构造函数中将指针传递给自身

@IBAction func updateDB(_ sender: Any) {

     stsLabel.text = "creating table"
     DispatchQueue.global().async {
         // do some stuf

         DispatchQueue.main.async(execute: { () -> Void in
             stsLabel.text = "inserting table A"
         }) 
         // some code
         // and i have some cases again

         DispatchQueue.main.async(execute: { () -> Void in
             stsLabel.text = "Complete"
         }) 
     }
 }

为什么不保存指针以便以后使用?

GEO_1 = new Geo_1(this); // "this" is your PBV instance

然后你可以这样做:

Geo_1::Geo_1(PBV*_parent) : Geometry((QObject*)_parent)
{
    this->pbv = _parent; // Save reference to parent
}

修改

另外,您可能会遇到必须交叉包含两个标头(PBV和Geo_1)的问题,要解决此问题,请从PBV.h和forward-declare Geo_1中删除Geo_1的包含。就像这样:

void Geo_1::set_LNE_default()
{
    // here I want to use printContent
    this->pbv->printContent(...); // this->pbv is your saved ptr to the PBV that created this instance
}

在宣布您的PBV课程之前。