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

标签 c++ qt

在我的主窗口中有一个按钮可以打开MbulbWindow。人们可以更改一些参数并单击“生成”按钮,该按钮会调用“generateMBulb()”函数,该函数会进行一些计算并最终创建一个名为“实体”的对象internalEntity 类的 code>。

现在我想将这个实体“发送”到主窗口,在那里它将被保存以供以后使用。但我该怎么做呢?我的想法是创建 transferEntity(internalEntity&entity) 信号并将其连接到 MainWindow 的 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')

这是我的文件:

主窗口.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。首先,您使用 connectSIGNALSLOT 的方式无效。其次,您没有提供信号和槽方法的正确签名。您必须为每个参数提供参数(当使用 SIGNALSLOT 时,我在下面概述了另一种方法)

这里:

connect(mBulbWindow, SIGNAL(MBulbWindow::transferEntity()), this, SLOT(addEntity()));

暂时忽略这不是使用 SIGNALSLOTconnect 的有效方式这一事实,您是在说 MBulbWindow 有一个名为 transferEntity 的信号,没有参数,而实际上 transferEntity 有一个 internalEntity & 类型的参数。

因此,您需要这样连接它:

connect(mBulbWindow, SIGNAL(transferEntity(internalEntity&)), this, SLOT(addEntity(internalEntity&)));

Qt 现在也能够找到正确的信号进行绑定(bind)。

另一种在我看来更好的方法是使用更新的语法 connect。像这样:

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

这可以节省您的打字时间,使您可以更轻松地重构信号和插槽,并且 IMO 看起来更干净。它还具有执行类型检查以确保将正确的类型传递到槽的优点(仍然可能发生隐式转换)。

关于c++ - Qt:如何让 MainWindow 访问其子窗口的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61155214/

相关文章:

c++ - 如何访问 "boost::function"中的类实例(对象)指针?

c++ - 可以放弃简单类的 getter 和 setter 吗?

c++ - 轮廓字体上下颠倒 - glOrtho() 设置不正确

c++ - 在 QmessageBox 中显示图像

c++ - 如何使Qt生成makefile而不需要qmake依赖

c++ - Qt C++ QString 到 QByteArray 的转换

c++ - 将常量值传递给模板

qt - QMAKE 中的 GNU make --jobs 选项

qt - 项目错误: Unknown module(s) in QT: webengine

qt - 在 Qt 中与 libpng 链接