从子窗口的函数访问公共成员函数

时间:2017-11-15 21:38:27

标签: c++ qt

我需要从子对话框函数(myFunction())调用父公共成员函数(doStuff())。下面的代码或多或少做了我需要做的事情,但我遇到了一些问题。

的main.cpp

#include <QApplication>
#include "myapp.h"

int main(int argc, char* argv[])
{
  QApplication a(argc, argv);
  myApp app;  // my main app window
  app.show();
  return a.exec();
}

myapp.h

...

class MyApp : public QMainWindow
{
  Q_OBJECT

public:
  explicit MyApp(QWidget* parent = 0);
  void myFunction();

...

MyApp.cpp中

...

MyApp::MyApp(QWidget* parent)
  : QMainWindow(parent)
  {
    // constructor
  }

MyApp::void myFunction() { 
// do some stuff 
}

mydialog.h

...

class MyDialog : public QDialog
{
  Q_OBJECT

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

private:
  void doStuff();

  ...

mydialog.cpp

MyDialog::MyDialog(QWidget* parent) :
  QDialog(parent, QDialog().windowFlags() & ~Qt::WindowContextHelpButtonHint)

{
  //constructor
}

void doStuff() {
  ((MyApp*)(parent()))->myFunction(); // this crashes the application
}

理想情况下,由于我已经在((MyApp*)(parent()))->myFunction();中创建了app->myFunction()实例,因此我想要做的事情而不是MyApp app)类似于main.cpp。我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

我根据Cherkesgiller Tural comment使用信号和插槽来解决这个问题。这是我做的:

mydialog.h中,我添加了我想要发出的信号:

signals:
  void sendMySignal();

mydialog.cpp中,我让doStuff()函数发出了我的信号:

void doStuff() {
  emit sendMySignal();
}

myapp.h中,我将myFunction添加为公共广告位,并创建了myDialog的实例:

public slots:
  void myFunction();

....

private:
  MyDialog myDialog;

myapp.cpp中,我将connect行添加到构造函数中:

connect(&myDialog, SIGNAL(sendMySignal()), this, SLOT(myFunction()));

connect侦听sendMySignal()对象中的myDialog信号。当信号发出并由myApp app(myapp.cpp)接收时,它会运行myFunction()函数,就像我想要的那样。

谢谢大家的帮助。