Qt:将对象传递给每个窗口

时间:2017-06-04 14:59:44

标签: c++ qt

我是C ++的初学者,因为我是Java-Dev。我现在正在学习Qt。 现在我想在我的中心对象上的widget应用程序中保存特殊功能(例如,一堆发送不同网络命令的方法或类似的东西)。在我的mainwindow.cpp中,我有这个

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //...
    BusinessLogic* bl = new BusinessLogic;
    bl->setMyValue(44);
    this->setBusinessLogic(bl);
    this->getBusinessLogic();

    //...
}

BusinessLogic* MainWindow::getBusinessLogic()
{
    return this->bl;
}

void MainWindow::setBusinessLogic(BusinessLogic* newbl)
{
    this->bl = newbl;
}

其中BusinessLogic.cpp是我想从我的应用程序中的所有窗口访问的类。所以在我的Dialog中,当点击pushButton时获取opend,我尝试在构造函数中使用这样的businesslogic实例

Dialog::Dialog(QDialog *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    //...   
    ((MainWindow*)parent)->getBusinessLogic();
}

不幸的是,每次对话框实例化时程序都会崩溃(调用带有((MainWindow*)parent)->getBusinessLogic();的行。

我该怎么办?

2 个答案:

答案 0 :(得分:3)

有几种方法可以实现您的目标(一切都取决于您的要求),但一种方法是您可以创建BusinessLogic的Singleton类,然后在任何地方访问它。看看here OR 您还可以将第一类的对象传递给另一个类。 OR 您可以使用信号槽机制。

为您提供最佳解决方案

Class BLogic{
public:
    static BLogic* instance(){
       static BLogic ins;
       return &ins;
    }
    void setVal(int v){ 
        val = v;
    }
private:
    BLogic(){}
    int val;
};

现在你可以从任何类来调用BLogic的函数,比如

BLogic::instance()->setVal(10);

OR 传递对象的示例可以是

class ClassA
{
public:
   void setClassB(ClassB *ob){
      m_classB = ob;
   }
   ClassB* getClassB(){
      return m_classB;
   }
private:
   ClassB* m_classB;
};

class ClassB
{
public:
   void setClassA(ClassA *ob){
      m_classA = ob;
   }
   ClassA* getClassA(){
      return m_classA;
   }
private:
   ClassA* m_classA;
};

现在来自main.cpp

ClassA* obA = new ClassA;
ClassB* obB = new ClassB;
obA->setClassB(obB);
obB->setClassA(obA);

答案 1 :(得分:2)

不要将零父母或悬空指针传递给对话框。

但更严重的是,验证您的假设:

qDebug() << "the parent object is" << parent;
auto p = qobject_cast<MainWindow*>(parent);
if (p)
    p->getBusinessLogic();

调试输出将让您了解父项是否已设置,以及它目前的类型。请记住,在MainWindow实例的构造过程中,它会经历不同类型(非常字面)。因此,根据您构建孩子的时间,您可能会获得parentQWidget*QMainWindow*类型的MainWindow*。在破坏期间,您甚至可以获得QObject*父母!