发出另一个班级的信号

时间:2019-04-12 16:43:36

标签: c++ qt

我有这段代码,由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 个答案:

答案 0 :(得分:2)

首先,您需要了解有关QT功能的插槽信号的基本理论。它们允许QOBJECT固有的任何对象在它们之间发送消息,例如事件。

  1. 发出事件的类必须实现signal
//Definition into the Class A (who emits)
signals:
    void valueChanged(int newValue);
  1. 将接收事件( signal )的类必须实现一个公共slot,该公共signal必须具有与 //Definition into the Class B (who receives) public slots: void setValue(int newValue); 相同的参数。
connect
  1. 将接收事件( signal )的类必须连接 Signal Slot 。使用 //There is an instance of class A called aEmit. void B::linkSignals() { connect(&aEmit, SIGNAL(valueChanged(int)), this, SLOT(setValue(int))); } 方法链接类A的实例的信号和类B的实例的插槽。
emit
  1. 要触发信号,请使用关键字//from Class A void A::triggerSignal() { int myValue{23}; emit valueChanged(myValue); } ,并将信号作为函数及其参数:。
//from Class A
void B::setValue(int newValue);
{
   cout << newValue << endl;
}

  1. 在类B中,应调用被声明为slot的方法。
{{1}}

在这里您可以了解有关信号和插槽的更多信息。

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

答案 1 :(得分:1)

如果要将信号从MainWindow发送到SerialCom,则应在MainWindow和SerialCom中的插槽中定义该信号。在MainWindow中,应该为此信号调用“发射”(可能从on_connectButton_clicked中调用)。 最好从MainWindow将信号连接到插槽。但是应该知道SerailCom对象。就像(伪代码)一样:

connect(this, signal(sig_name), comm_object, slot(slot_name))