Qt: Как предоставить MainWindow доступ к данным его потомка - PullRequest
2 голосов
/ 11 апреля 2020

В моем главном окне есть кнопка, которая открывает MbulbWindow. Там можно изменить некоторые параметры и нажать кнопку Generate , которая вызывает функцию 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')

Вот мои файлы:

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

mainwindow. 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();
}

1 Ответ

2 голосов
/ 13 апреля 2020

Ваша проблема в том, что вы не используете connect правильно. Во-первых, то, как вы использовали connect с SIGNAL и SLOT, недопустимо. Во-вторых, вы не указали правильную подпись вашего сигнала и методы слотов. Вы должны предоставить параметры для каждого (при использовании SIGNAL и SLOT, есть другой способ, который я обрисовал в общих чертах ниже)

Здесь:

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

Игнорирование того факта, что это не так допустимый способ использования SIGNAL и SLOT с 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 выглядит чище. Преимущество также состоит в том, что проверки типов выполняются, чтобы гарантировать, что правильный тип передается в слот (неявное преобразование все еще может происходить).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...