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 facttransferEntity
中,具有类型为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();
}