Qt - правильный способ реализации пользовательских сигналов и слотов - PullRequest
0 голосов
/ 18 марта 2020

У меня есть одно главное окно и один класс; Я хочу отправить данные между ними, используя пользовательский сигнал и слот. Я не могу понять это, мне нужна помощь.

Вот мой код: MainWindow.h

#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

MainWindow. cpp

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);    
   Receive *r = new Receive();
   connect(this, SIGNAL(sendit(QString)), r, SLOT(display(QString)));

}

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


void MainWindow::on_send_button_clicked()
{
    emit sendit(ui->lineEdit->text());

}

receive.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

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;
}

Когда я запускаю эту программу, я получаю это сообщение:

06: 26: 29: Начиная с C: \ Users \ Troy \ Documents \ build-tests-Desktop_Qt_5_14_1_MinGW_32_bit-Debug \ tests.exe ... QObject :: connect: нет такого слота QDialog :: display (QString) в .. \ tests \ mainwindow. cpp: 11 QObject :: connect: (имя отправителя: 'MainWindow')

Как мне это сделать, пожалуйста?

Спасибо за помощь.

1 Ответ

2 голосов
/ 18 марта 2020

Ваш слот в Receive должен быть опубликован c, а не закрытым. Так же, как и другие члены класса, закрытые слоты могут использоваться только самим классом.

Если вы используете современный синтаксис соединения, вы получите лучшую ошибку времени компиляции:

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

Вам также нужно убедиться, что вы добавляете Q_OBJECT в каждый класс Qt, он отсутствует в Receive.

...