C++ Qt:如何让MainWindow访问其子窗口的数据

C++ Qt:如何让MainWindow访问其子窗口的数据,c++,qt,C++,Qt,在我的主窗口中,有一个按钮可打开MbulbWindow。在那里,您可以更改一些参数并单击一个生成按钮,该按钮调用generateMBulb()函数,该函数执行一些计算,并最终创建一个名为实体的对象,该对象属于内部实体 现在我想将这个实体“发送”到主窗口,在那里它将被保存以供以后使用。但是我该怎么做呢?我的想法是创建transferEntity(internalEntity&entity)信号,并将其连接到主窗口的addEntity(internalEntity&entity)函数,但Qt总是给出

在我的主窗口中,有一个按钮可打开
MbulbWindow
。在那里,您可以更改一些参数并单击一个生成按钮,该按钮调用
generateMBulb()
函数,该函数执行一些计算,并最终创建一个名为
实体的对象,该对象属于
内部实体

现在我想将这个实体“发送”到主窗口,在那里它将被保存以供以后使用。但是我该怎么做呢?我的想法是创建
transferEntity(internalEntity&entity)
信号,并将其连接到主窗口的
addEntity(internalEntity&entity)
函数,但Qt总是给出类似于以下内容的错误消息:

QObject::connect: No such signal MbulbWindow::MBulbWindow::transferEntity() in ../MandelbulbUI_rewrite/mainwindow.cpp:15
QObject::connect:  (sender name:   'MbulbWindow')
QObject::connect:  (receiver name: 'MainWindow')
这是我的档案:

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QWindow>
#include <QAction>
#include "mbulbwindow.h"
#include "internalentityhandler.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    internalEntityHandler entityHandler; //Saves and manages entities
    MbulbWindow *mBulbWindow = new MbulbWindow;
private slots:

    //...

    //Generate
    void showMBGenerator();

    //internal entity management
    void addEntity(internalEntity& entity);

};
#endif // MAINWINDOW_H
mbulbwindow.h:

#ifndef MBULBWINDOW_H
#define MBULBWINDOW_H

#include <QDialog>
#include <vector>
#include "boolcloud.h"
#include "internalentityhandler.h"

namespace Ui {
class MbulbWindow;
}

class MbulbWindow : public QDialog
{
    Q_OBJECT

public:
    explicit MbulbWindow(QWidget *parent = nullptr);
    ~MbulbWindow();

private:
    Ui::MbulbWindow *ui;

private slots:
    void generateMBulb();
signals:
    void transferEntity(internalEntity& entity);
};

#endif // MBULBWINDOW_H

您的问题是未正确使用
connect
。首先,您使用
连接
信号
插槽
的方式无效。其次,您没有提供信号和插槽方法的正确符号。您必须为每个插槽提供参数(当使用
信号
插槽
时,我在下面概述了另一种方法)

在这里:

connect(mBulbWindow,信号(mBulbWindow::transferEntity()),this,SLOT(addEntity());
忽略这一事实,将
SIGNAL
SLOT
connect
一起使用不是一种有效的方法,您的意思是
MBulbWindow
有一个名为
transferEntity
的信号,没有参数,在actaul fact
transferEntity
中,具有类型为
internalEntity&
的参数

因此,您需要将其连接为:

connect(mBulbWindow,信号(transferEntity(internalEntity&)),this,SLOT(addEntity(internalEntity&));
Qt现在也可以找到正确的绑定信号

另一种更好的方法是使用较新的语法
connect
。像这样:

connect(mBulbWindow,&mBulbWindow::transferEntity,this,&MainWindow::addEntity)

这节省了您的一些输入,允许您更轻松地重构信号和插槽,并且IMO看起来更干净。它还有一个优点,即执行类型检查以确保将正确的类型传递到插槽(仍然可能发生隐式转换)

最重要的是,在编译时检查新语法。
#ifndef MBULBWINDOW_H
#define MBULBWINDOW_H

#include <QDialog>
#include <vector>
#include "boolcloud.h"
#include "internalentityhandler.h"

namespace Ui {
class MbulbWindow;
}

class MbulbWindow : public QDialog
{
    Q_OBJECT

public:
    explicit MbulbWindow(QWidget *parent = nullptr);
    ~MbulbWindow();

private:
    Ui::MbulbWindow *ui;

private slots:
    void generateMBulb();
signals:
    void transferEntity(internalEntity& entity);
};

#endif // MBULBWINDOW_H
#include "mbulbwindow.h"
#include "ui_mbulbwindow.h"

MbulbWindow::MbulbWindow(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MbulbWindow)
{
    ui->setupUi(this);

    //Connections
    connect(ui->ButtonGenerate, SIGNAL(clicked()), this, SLOT(generateMBulb()));

}

MbulbWindow::~MbulbWindow()
{
    delete ui;
}

void MbulbWindow::generateMBulb(){

    //Calculation of "mBulb" object...

    //Create entity
    internalEntity entity(mBulb, "Mandelbulb");

    emit transferEntity(entity);
    //This entity needs to be transferred to the MainWindow
    this->close();
}