我有这段代码,由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();
};
我需要在哪里放置插槽,信号和连接方法?非常感谢!
答案 0 :(得分:2)
首先,您需要了解有关QT功能的插槽和信号的基本理论。它们允许QOBJECT
固有的任何对象在它们之间发送消息,例如事件。
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
//There is an instance of class A called aEmit.
void B::linkSignals()
{
connect(&aEmit, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));
}
方法链接类A的实例的信号和类B的实例的插槽。emit
//from Class A
void A::triggerSignal()
{
int myValue{23};
emit valueChanged(myValue);
}
,并将信号作为函数及其参数:。//from Class A
void B::setValue(int newValue);
{
cout << newValue << endl;
}
{{1}}
在这里您可以了解有关信号和插槽的更多信息。
答案 1 :(得分:1)
如果要将信号从MainWindow发送到SerialCom,则应在MainWindow和SerialCom中的插槽中定义该信号。在MainWindow中,应该为此信号调用“发射”(可能从on_connectButton_clicked中调用)。 最好从MainWindow将信号连接到插槽。但是应该知道SerailCom对象。就像(伪代码)一样:
connect(this, signal(sig_name), comm_object, slot(slot_name))