微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使下级类调用其父级的方法?

如何解决如何使下级类调用其父级的方法?

我遵循了这个Qt Creator + OpenGL的标准,一切进展顺利。

我在QPlainTextEdit按钮的顶部添加一个Quit,我希望GLWidget将信息发送回MainWindow

如何让GLWidget调用MainWindow函数

这是一些代码

// GLWidget.h

class GLWidget: public QGLWidget
{
Q_OBJECT // <----- 
public:
    GLWidget(QWidget* parent = 0);
    QWidget* parentObject;
    void writeText( QString );
    void (*p)(QString) = NULL;
protected:
    virtual void initializeGL();
    virtual void paintGL();
    virtual void resizeGL(int w,int h);

private:
    QTimer timer;
signals:
    //void writeText( QString );
    void dataReady(QString data); // <------------------
};

// GLWidget.cpp

GLWidget::GLWidget(QWidget* parent) : QGLWidget() /7 <---- new error
{
    connect(&timer,SIGNAL(timeout()),this,SLOT(updateGL()));
    timer.start(16);


    QMessageBox msgBox;
    msgBox.setText(typeid(parent).name());
    msgBox.exec();



    //p = parent->
    //parentObject->
    //parent->
    //parent->
    //this->parentObject = parent;
}

void GLWidget::initializeGL(){
    //emit GLWidget::dataReady("myData"); //<--------- error
    emit this->dataReady("Joe");//<--------- same as above
    glClearColor(0.2,0.2,1);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glEnable(GL_COLOR_MATERIAL);
}
    

// MainWindow.h

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void print(QString text);

private slots:
    void on_plainTextEdit_textChanged();
    void foo(QString data); // <----------------------
}
    
    

// mainwindow.cpp

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->widget->p = &MainWindow::print; // error,how to asign pointer?
}

void MainWindow::print(QString text){
    ui->plainTextEdit->setPlainText(text);
}

void MainWindow::foo(QString data) { // <---------
    QMessageBox msgBox;
    msgBox.setText("hi,there");
    msgBox.exec();
    // Do something with the data
    ui->plainTextEdit->setPlainText(data);
}

错误

  • 对GLWidget的vtable的未定义引用
  • 对“ GLWidget :: dataReady(QString)”的未定义引用

解决方法

这是您的紧迫问题的答案,如何使低级类利用其父级中的函数?

所有QObject子类都拥有对其父对象的引用,可以通过parent()方法进行访问。

  1. 包括父类的标题,例如Foo.h
  2. 调用parent()方法以获得指向对象父对象的指针
  3. 检查指针是否有效(不是nullptr
  4. 投射指向父类的指针,例如Foo
  5. 调用所需的方法,例如foo

在代码中,它看起来像这样:

#include "Foo.h"

...

if (parent())
    static_cast<Foo *>(parent())->foo();

话虽如此,这在父母与孩子之间造成了紧密的联系,我强烈建议避免这样做。在您的情况下,使用信号和插槽将数据从子级传递到父级会更好:

  1. 在子级中定义信号,例如dataReady(DataType data)
  2. 在父级中,当您创建子级时,将此信号连接到方法,该方法将使用数据,例如foo
  3. 在孩子中,只要您想打电话给emit
  4. ,就发出foo信号。

在代码中,它看起来像这样:

Child.h

...
signals:
    void dataReady(DataType data);
...

Child.cpp

...
// I want to call foo
emt dataReady(myData);
...

Parent.h

...
private slots:
    void foo(DataType data);
...

Parent.cpp

...
//somewhere
auto *child = new Child(...);
connect(child,&Child::dataReady,this,&Parent::foo);

...

void Parent::foo(DataType data) {
    // Do something with the data
    ...
}
...

这最初需要做更多的工作,但从长远来看会更好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。