Испускать сигнал из другого класса - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть этот код, структурированный в 2 * .cpp файлах и 2 * .h файлах, и я просто не понимаю, как отправить сигнал из одного класса в другой:

У меня есть mainwindow.cpp :

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "serialcommunication.h"
#include "QDebug"

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

}

MainWindow::~MainWindow()
{
    delete ui;
    //Here is where I want to emit the signal
    qDebug() << "DONE!";
}

Это заголовок для mainwindow.cpp:

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private slots:
    void on_connectButton_clicked();

private:
    Ui::MainWindow *ui;

};

Итак, я хочу отправить сообщение из класса mainwindow в класс serialcomunication, чтобы вызвать функцию здесь:

Второй * .cpp файл: Serialcommunication.cpp :

#include "serialcommunication.h"
#include "mainwindow.h"

SerialCommunication::SerialCommunication(QObject *parent) : QObject(parent)
{   
    isStopReadConsoleActivated = false;


    QtConcurrent::run(this,&SerialCommunication::readConsole,isStopReadConsoleActivated);

    }
    void FUNCTION THANT I WANT TO BE CALLED FROM MAINWINDOW CLASS()
    {
//DO SOMETHING
    }

И серийные сообщения , заголовок :

class SerialCommunication : public QObject
{
     Q_OBJECT
private:

    //some other fucntions

public:
    explicit SerialCommunication(QObject *parent = nullptr);
     ~SerialCommunication();
};

Куда мне положить слот, сигнал и способ подключения? Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Прежде всего, вам необходимо понять основную теорию о Слотах и Сигнале , которые являются особенностями QT.Они позволяют любому объекту, присущему QOBJECT, отправлять между ними сообщение, как события.

  1. Класс, который испускает событие, должен реализовывать signal.
//Definition into the Class A (who emits)
signals:
    void valueChanged(int newValue);
Класс, который получит событие ( сигнал ), должен реализовать открытый slot, который должен иметь тот же аргумент, что и signal.

//Definition into the Class B (who receives)
public slots:
    void setValue(int newValue);
Класс, который получит событие ( сигнал ), должен подключить Сигнал против Слот .Используйте метод connect, чтобы связать сигнал из экземпляра класса A и слота из экземпляра класса B.

//There is an instance of class A called aEmit.
void B::linkSignals()
{
   connect(&aEmit, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));
}

Для запуска сигнала используйте ключевое слово emit с сигналом в качестве функции и его аргументами:.
//from Class A
void A::triggerSignal()
{
  int myValue{23};
  emit valueChanged(myValue);
}

В классе B, метод, который был объявлен как slot, должен быть вызван.
//from Class A
void B::setValue(int newValue);
{
   cout << newValue << endl;
}

Здесь вы можете увидеть больше о Сигналах и Слотах.

https://doc.qt.io/qt-5/signalsandslots.html

1 голос
/ 12 апреля 2019

Если вы хотите отправить сигнал из MainWindow в SerialCom, сигнал должен быть определен в MainWindow и слоте в SerialCom. Из MainWindow для этого сигнала должен быть вызван 'emit' (вероятно, из on_connectButton_clicked). Подключение сигнала к слоту лучше всего выполнять через главное окно. Однако здесь должен быть известен объект SerailCom. Это будет что-то вроде (псевдокод):

connect(this, signal(sig_name), comm_object, slot(slot_name))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...