如何在Qt / C ++中从子函数内调用非静态父函数?

时间:2016-04-20 18:10:08

标签: c++ qt qt4

我很难理解如何将父对象传递给子对象。 在Qt中,我有一个MainWindow类和一个DoSomething()函数。然后我在MainWindow中创建了一个Job对象,并尝试在Job的DoItNow()函数中调用DoSomething。但我只是不知道该怎么做。

MainWindow.h

class Job;
class MainWindow : public QMainWindow
{
  Q_OBJECT

  public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    int value;
    void DoSomething();

  private:
  Job *job;
}

MainWindow.cpp

#include "mainwindow.h"
#include "job.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    job = new Job(this);   // passing this pointer to child
}

void MainWindow::DoSomething() {  // do something }

Job.h

class Job : public QObject
{
  Q_OBJECT

  private:
    void DoItNow();

  public:
    explicit CDMcommand(QObject *parent = 0);
}

Job.cpp

#include "job.h"
#include "mainwindow.h"

Job::Job(QObject *parent) : QObject(parent)
{
  // some setups
  parent->value = 0;    // this is not working
}

void Job::DoItNow()
{
  parent->DoSomething();  // What is the pointer to MainWindow instance?
}
  • 如何访问* parent中的非静态公共寄存器?

  • 如何将* parent传递给作业实例中的函数?

2 个答案:

答案 0 :(得分:2)

也许我错过了解这个问题,但我认为你对继承感到有些困惑。您的JobQObject的子类,而MainWindow也间接继承QObject,但MainWindowJob之间没有直接关系。我不太熟悉Qts信号和插槽机制,这可能就是这里的方法,但也许我可以为您提供不同的解决方案:

Job::Job(QObject *parent) : QObject(parent)
{
  // some setups
  parent->value = 0;    // this is not working
}

这不起作用,因为QObject没有名为value的成员。如果您可以使用Job构造函数而不使用QObject*作为参数,那么只需声明一个

MainWindow* parentWindow;

作为Job中的私有成员,并将构造函数更改为

Job::Job(MainWindow *parentWindow) : QObject(parentWindow)
{
  // some setups
  parentWindow->value = 0;    // this will work now
}

然后

void Job::DoItNow()
{
  parentWindow->DoSomething();  
}

将毫无问题地工作。

答案 1 :(得分:0)

  

如何从'child'调用Qt'parent'对象方法    对象方法?

安全而简单的方法:

void Job::DoItNow()
{
   // first evaluate the pointer: is that of type we expect?
   MainWindow* pMainWindow = qobject_cast<MainWindow*>(parent());
   if (pMainWindow)
       pMainWindow->DoSomething();  // MainWindow::DoSomething must be exposed to class Job
}

但是当然使两个类过于依赖彼此是违反OOP原则的:这两个对象现在变得紧密耦合。并且在评论中已经提出了一个很好的建议:为此使用明确的信号槽机制或提供在解耦对象之间进行交互的接口。