C++ Qt-实现自定义信号和插槽的正确方法

C++ Qt-实现自定义信号和插槽的正确方法,c++,qt,signals,slots,C++,Qt,Signals,Slots,我有一个主窗口和一个类;我想使用自定义信号和插槽在它们之间发送数据。我好像不明白,我需要帮助 这是我的密码: 主窗口 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <iostream> #include "receive.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE

我有一个主窗口和一个类;我想使用自定义信号和插槽在它们之间发送数据。我好像不明白,我需要帮助

这是我的密码: 主窗口

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <iostream>
#include "receive.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
signals:
    void sendit(QString name);
private slots:
    void on_send_button_clicked();
    void display(QString e)
    {        
     std::cout<<"Here is where I am called this "<<e.toStdString()<<std::endl;
    }

private:
    Ui::MainWindow *ui;

};
#endif // MAINWINDOW_H
收到

#ifndef RECEIVE_H
#define RECEIVE_H

#include <iostream>
#include <QDialog>

class Receive : public QDialog
{
public:
    Receive();
private slots:
    void display(QString e);
};

#endif // RECEIVE_H
\ifndef接收
#定义接收
#包括
#包括
类接收:公共QDialog
{
公众:
接收();
专用插槽:
无效显示(QString e);
};
#endif//RECEIVE\u H
receive.cpp

#include "receive.h"
#include "mainwindow.h"

Receive::Receive()
{

}

void Receive::display(QString e)
{    
 std::cout<<"Here is where I am called this "<<e.toStdString()<<std::endl;
}
#包括“receive.h”
#包括“mainwindow.h”
Receive::Receive()
{
}
void Receive::display(QString e)
{    

std::cout您在
Receive
中的插槽必须是公共的而不是私有的。与其他类成员一样,私有插槽只能由类本身使用

如果使用现代连接语法,则会出现更好的编译时错误:

connect(this, &MainWindow::sendit, r, &Receive::display);

您还需要确保向每个Qt类添加
Q_对象
Receive
Receive
缺少Q_对象宏。谢谢。我这样做了,我得到了这个错误:未定义对“vtable for Receive”的引用您可能需要重新运行qmake,还需要确保您已经实现了类t中的所有方法您声明的内容:请快速提问,是否可以在没有指针接收类的情况下建立此连接?不,您需要一个对象来调用类方法,无论是通过信号还是任何其他方式(信号和插槽本质上只是美化的函数指针)但是,使用新的connect语法,您可以将任意内容附加到信号,可以是静态方法,甚至是lambda,在这种情况下,您不需要对象作为目标
connect(this, &MainWindow::sendit, r, &Receive::display);