Невозможно соединить два кадра с пользовательскими сигналами - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь соединить два кадра с пользовательским сигналом, но на самом деле я не получаю его.

Этот код является лишь примером того, что я пытаюсь сделать в моей программе, моя цель состоит в том, чтобыпередавать данные между кадрами.

Файлы:

(отправитель)

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>

    namespace Ui {
    class MainWindow;
    }

    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    signals:
        void send();

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

    private:
        Ui::MainWindow *ui;
    private slots:
        void on_pushButton_clicked();
    };

    #endif // MAINWINDOW_H

В "mainwindow.cpp" у меня есть пустота on_pushButton_clicked (), которая испускает сигнали показывает новый кадр:

void частного слота:

        void MainWindow::on_pushButton_clicked()
    {
        emit send();
        Dialog sw;
        sw.setModal(true);
        sw.exec();
    }

(получатель):

        #ifndef DIALOG_H
    #define DIALOG_H

    #include <QDialog>
    #include <QDebug>

    namespace Ui {
    class Dialog;
    }

    class Dialog : public QDialog
    {
        Q_OBJECT

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

    private slots:
        void receive();

    private:
        Ui::Dialog *ui;
        int a;
    };

    #endif // DIALOG_H

и .cpp:

        #include "dialog.h"
    #include "ui_dialog.h"
    #include "mainwindow.h"


    Dialog::Dialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::Dialog)
    {
        ui->setupUi(this);
        a=0;
        MainWindow w;
        connect(&w, SIGNAL(send()), this, SLOT(receive()));
        qDebug() << a;
    }


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

    void Dialog::receive(){
        qDebug() << "ola";
        a++;
    }

Вывод: Итак, в основном функция Dialog не печатает qDebug (), а 'a' равно 0, поэтому я пришел к выводу, что соединение не установлено / не выполнено.

Спасибо всем, С наилучшими пожеланиями, Дилан Лопес.

править: Написал заключение в конце поста.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Рассмотрим код в вашем конструкторе Dialog ...

MainWindow w;
connect(&w, SIGNAL(send()), this, SLOT(receive()));

Это создает локально ограниченную область MainWindow в стеке и соединяет ее сигнал send() с Dialog 's receive() слот.Но MainWindow - и, следовательно, соединение - будет уничтожено, как только завершится конструктор Dialog.

Кроме того, посмотрите на MainWindow::on_pushButton_clicked ...

void MainWindow::on_pushButton_clicked()
{
    emit send();
    Dialog sw;
    sw.setModal(true);
    sw.exec();
}

Вы излучаете сигнал send() до построения Dialog.

Я не знаю достаточно о том, что вы пытаетесь достичь, чтобы получить окончательныйответьте, но в интересах получения какого-либо взаимодействия сигнал / слот вы можете сделать следующее: замените конструктор Dialog на ...

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
    {
        ui->setupUi(this);
        a=0;
        qDebug() << a;
    }

и замените MainWindow::on_pushButton_clicked на ...

void MainWindow::on_pushButton_clicked()
{
    Dialog sw;
    connect(this, &MainWindow::send, &sw, &Dialog::receive);
    emit send();
    sw.setModal(true);
    sw.exec();
}

Это должно как минимум привести к вызову Dialog::receive, и вы сможете работать оттуда.

0 голосов
/ 26 ноября 2018

Соединение между сигналом и слотом не означает, что будет активирована функция сигнала.

Вам все еще нужно испустить сигнал, чтобы a обновилось.

Созданиепустой слот также не работает, так как слоты являются точкой приема сигнала.В этом случае on_pushButton_clicked() срабатывает при нажатии кнопки.Это не вызовет send, если вы не позвоните EMIT(send()) (IIRC, вы посылаете сигнал с помощью EMIT, это все еще так?).

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