我很难理解如何将父对象传递给子对象。
在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传递给作业实例中的函数?
答案 0 :(得分:2)
也许我错过了解这个问题,但我认为你对继承感到有些困惑。您的Job
是QObject
的子类,而MainWindow
也间接继承QObject
,但MainWindow
和Job
之间没有直接关系。我不太熟悉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原则的:这两个对象现在变得紧密耦合。并且在评论中已经提出了一个很好的建议:为此使用明确的信号槽机制或提供在解耦对象之间进行交互的接口。