Почему qDebug ничего не выводит после нажатия кнопки!

Рейтинг: 0Ответов: 1Опубликовано: 19.08.2023

пробую реализовать одну штуку с сигналами и слотами, и возникает проблема в том, что после нажатия на кнопку ничего не происходит, хотя должен выводиться путь до файла. Кнопка сделана с помощью графического дизайнера QT.

#ifndef CONTROLLER_H
#define CONTROLLER_H

#include "mainwindow.h"
#include "model.h"
#include <QMainWindow>
#include <QObject>
#include <QDebug>

class Controller : public QObject
{
    Q_OBJECT

public:

explicit Controller(QObject *parent = nullptr);
~Controller();

public slots:
    void onFileSelected(const QString& filePath);

private:
    // Model* model = nullptr;
    MainWindow* view = nullptr;
};

#endif // CONTROLLER_H

Текст файла controller.cpp

#include "controller.h"

Controller::Controller(QObject *parent)
    : QObject(parent)
{
    // model = new Model(this);
    view = new MainWindow();

    connect(view, &MainWindow::fileSelected, this, &Controller::onFileSelected);
}

Controller::~Controller()
{
    // delete model;
    delete view;
}

void Controller::onFileSelected(const QString& filePath)
{
     qDebug() << "File selected: " << filePath;
     // qDebug() << model->getHeaders();
}

Файл mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
   Q_OBJECT

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

signals:
    void fileSelected(const QString& filePath);

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

Текст файла mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QFile>
#include <QFileDialog>
#include <QTextStream>
#include <QDebug>
#include <QMessageBox>
#include <QtCharts>

using namespace QtCharts;


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

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


void MainWindow::on_pushButton_clicked()
{
    QString filePath = QFileDialog::getOpenFileName(this, "Выберите файл", QDir::currentPath());

    emit fileSelected(filePath);
}

Ответы

▲ 0Принят

Проблема тут:

view = new MainWindow();

У вас в контроллере создается второе окно MainWindow (зачем???) и сигнал привязывается именно к нему, при этом сигнал посылает не этот созданный объект.

Правильно будет перенести connect в MainWindow.cpp, хотя я в MainWindow вообще не вижу создания объекта Controller (откуда он вообще у вас появляться должен?)

В общем и целом, не вдаваясь в детали, у вас должно быть типа такого

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Controller* ctrl = new Controller(this);
    connect(this,SIGNAL(fileSelected(const QString&)),ctrl,SLOT(onFileSelected(const QString&));

}