首页 > 解决方案 > 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();
}

标签: c++qt

解决方案


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

这里:

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

忽略这个事实,这不是一种有效的使用方式,SIGNAL并且暂时,您是说SLOT有一个没有参数调用的信号,而实际上实际上有一个 type 的参数。connectMBulbWindowtransferEntitytransferEntityinternalEntity &

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

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

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

一种替代且 IMO 更好的方法是使用connect. 像这样:

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

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


推荐阅读