Qt: Доступ к объекту publi c из другого окна - PullRequest
0 голосов
/ 06 февраля 2020

Предполагается, что эта программа создаст объект mBulbPrimary класса pointCloudBool в главном окне и выполнит вычисления, которые изменят содержимое этого объекта. При нажатии на виджет actionSave_Mandelbulb открывается новое окно DialogSaveMB, и пользователь может ввести путь к файлу и нажать кнопку pushButton_save. Предполагается, что это вызовет функцию mBulbPrimary.savePrimary(filePath) исходного объекта.

Однако в dialogsavemb. cpp объект mBulbPrimary не распознается, и я не понимаю, почему. Объект является publi c, а mainwindow.h включен в dialogsavemb. cpp, так почему он не может получить доступ к объекту или его методам / функциям?

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "dialogsavemb.h"
#include "pointcloudbool.h"


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class DialogSaveMB;
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    DialogSaveMB dialogSaveMB;  //Dialog window

    pointCloudBool mBulbPrimary;  //public mBulbPrimary object
private:
    Ui::MainWindow *ui;


private slots:
    //unrelated functions...

    void openSaveMBulbWindow();
};
#endif // MAINWINDOW_H

mainwindow. cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //unrelated connections...

    connect(ui->actionSave_Mandelbulb, SIGNAL(triggered(bool)),
            this, SLOT(openSaveMBulbWindow()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

//Implementation:

//unrelated functions...

void MainWindow::openSaveMBulbWindow(){
    dialogSaveMB.show();

}

dialogsavemb.h:

#ifndef DIALOGSAVEMB_H
#define DIALOGSAVEMB_H

#include <QDialog>

namespace Ui {
class DialogSaveMB;
}

class DialogSaveMB : public QDialog
{
    Q_OBJECT

public:
    explicit DialogSaveMB(QWidget *parent = nullptr);
    ~DialogSaveMB();

private:
    Ui::DialogSaveMB *ui;

private slots:
    void saveMBulb(std::string filePath);
};

#endif // DIALOGSAVEMB_H

dialogsavemb. cpp:

#include "dialogsavemb.h"
#include "ui_dialogsavemb.h"
#include "mainwindow.h"

DialogSaveMB::DialogSaveMB(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DialogSaveMB)
{
    ui->setupUi(this);
    ui->radioButton_txt->setChecked(true);

    //Get filepath from a lineEdit widget of the dialog:
    std::string filePath = ui->lineEdit_filePath->text().toUtf8().constData();

    //unrelated connections...

    connect(ui->pushButton_save, SIGNAL(clicked(bool)),
            this, SLOT(saveMBulb(filePath)));

}

DialogSaveMB::~DialogSaveMB()
{
    delete ui;
}

void DialogSaveMB::saveMBulb(std::string filePath){
    mBulbPrimary.savePrimary(filePath);
    //The above line needs to access the 'mBulbPrimary' object in the MainWindow class
    //but it can't.
}

1 Ответ

1 голос
/ 07 февраля 2020

Это, вероятно, то, что @hyde описывает в комментариях:

В mainwindow.h добавить:

private slots:
  void saveMBulb(const QString &filePath);

В главном окне. cpp MainWindow добавить конструктор:

  connect(&dialogSaveMB, &DialogSaveMB::mBulbPathChanged, this, &MainWindow::saveMBulb);

В главном окне. cpp добавить:

void MainWindow::saveMBulb(const QString &filePath)
{
  // you could add some checks here, eg. !filePath.isEmpty() or QFileInfo(filePath).exists()
  mBulbPrimary.savePrimary(filePath.toStdString());
}

В dialogsavemb.h добавить:

signals:
  void mBulbPathChanged(const QString &filePath) const;

В диалоге сохранения. cpp DialogSaveMB конструктор, изменить:

  //connect(ui->pushButton_save, SIGNAL(clicked(bool)), this, SLOT(saveMBulb(filePath)));

  connect(ui->pushButton_save, &QPushButton::clicked, this, [this]() {
    emit mBulbPathChanged(ui->lineEdit_filePath->text());
  });

Вы не должны включить minwindow.h в код DialogSaveMB. В любом случае, это плохая практика, поскольку она создает циклическую зависимость (MainWindow нужен заголовок диалога, а диалогу нужен заголовок MainWindow - не идеально).

И mBulbPrimary не нужно публиковать c.

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