c++ - Qt:如何让 MainWindow 访问其子项的数据
问题描述
在我的 MainWindow 中有一个按钮可以打开MbulbWindow
. 可以更改一些参数并单击“生成”按钮,该按钮调用generateMBulb()
执行某些计算的函数,最后创建一个名为entity
该类的对象internalEntity
。
现在我想将此实体“发送”到 MainWindow 以供以后使用。但是我该怎么做呢?我的想法是创建transferEntity(internalEntity& entity)
信号并将其连接到addEntity(internalEntity& entity)
MainWindow 的功能,但 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')
这是我的文件:
主窗口.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
主窗口.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//...
//Connections
internalEntity entity;
connect(mBulbWindow, SIGNAL(MBulbWindow::transferEntity()), this, SLOT(addEntity()));
//This is where I would make the connection
}
MainWindow::~MainWindow()
{
delete ui;
}
//...
//Generate
void MainWindow::showMBGenerator(){
mBulbWindow->show();
}
//internal entity management
void MainWindow::addEntity(internalEntity& entity){
//Entity in memory:
entityHandler.addEntity(entity);
//...
}
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
mbulbwindow.cpp:
#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();
}
解决方案
你的问题是你没有connect
正确使用。首先,您使用的connect
方式SIGNAL
无效SLOT
。其次,您没有提供信号和插槽方法的正确签名。您必须为每个提供参数(使用SIGNAL
and时SLOT
,我在下面概述了另一种方法)
这里:
connect(mBulbWindow, SIGNAL(MBulbWindow::transferEntity()), this, SLOT(addEntity()));
忽略这个事实,这不是一种有效的使用方式,SIGNAL
并且暂时,您是说SLOT
有一个没有参数调用的信号,而实际上实际上有一个 type 的参数。connect
MBulbWindow
transferEntity
transferEntity
internalEntity &
因此,您需要这样连接它:
connect(mBulbWindow, SIGNAL(transferEntity(internalEntity&)), this, SLOT(addEntity(internalEntity&)));
Qt 现在也能够找到正确的信号进行绑定。
一种替代且 IMO 更好的方法是使用connect
. 像这样:
connect(mBulbWindow, &MBulbWindow::transferEntity, this, &MainWindow::addEntity)
这为您节省了一些输入,允许您更轻松地重构信号和插槽,并且 IMO 看起来更干净。它还具有执行类型检查以确保将正确类型传递给插槽的优点(仍可能发生隐式转换)。
推荐阅读
- python - 无法从 Python 脚本运行 Git 命令
- javascript - addEventListner 第二次不工作
- informix - Informix dbexport 从 AIX 和 dbimport 到 Windows
- angular - 切换组件状态角度
- macos - zsh:找不到命令:pip安装后ansible
- pyspark - pyspark 中的 H2o MOJO 模型加载问题
- arrays - C中数组的动态分配
- java - REST 保证:在运行所有测试之前等待一个条件
- javascript - 如何针对“点击”事件监听器的动态创建元素
- node.js - 我在使用 express jwt 时得到未定义的 _id