我需要从子对话框函数(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
。我在这里做错了什么?
答案 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()
函数,就像我想要的那样。
谢谢大家的帮助。