无法用自定义信号连接两个帧

时间:2018-11-26 12:21:40

标签: c++ qt

我正在尝试用自定义信号连接两个框架,但是我并没有真正得到它。

这段代码只是我在程序中尝试执行的示例,我的目标是在帧之间传输数据。

文件:

(发送者)

    #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 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 :(得分:0)

信号和插槽之间的连接并不意味着将触发信号功能。

您仍然需要发出信号,以使a得到更新。

创建一个空插槽也不起作用,因为插槽是信号的接收点。在这种情况下,on_pushButton_clicked()会在单击按钮时触发。除非您调用send(IIRC,您通过EMIT发出信号,是否会这样,否则不会触发EMIT(send())

答案 1 :(得分:0)

考虑您的Dialog构造函数中的代码...

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

这将在堆栈上创建本地作用域的MainWindow,并将其send()信号连接到Dialog的{​​{1}}插槽。但是receive()构造函数完成后,MainWindow(以及因此的连接)将被销毁。

此外,查看Dialog ...

MainWindow::on_pushButton_clicked

在构造void MainWindow::on_pushButton_clicked() { emit send(); Dialog sw; sw.setModal(true); sw.exec(); } 之前,您会发出send()信号

对于您要提供确切答案的目的,我确实不太了解,但是为了获得某种信号/插槽交互作用,您可能需要执行以下操作:更改{{1 }}的构造函数...

Dialog

然后将Dialog更改为...

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

这至少应导致调用MainWindow::on_pushButton_clicked,并且您可以从那里开始工作。