如何从另一个类发出信号

How can I emit signal form another class?

本文关键字:信号 另一个      更新时间:2023-10-16

如何从另一个类发出信号?在下面显示的实现中,当我尝试在 SerialPort::open 方法中发射信号时,我遇到了"未解决的外部符号错误"。代码,主窗口的头文件:

namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    std::shared_ptr<SerialPort> serialPort;
private slots:
    void labelchange();
private:    
    Ui::MainWindow *ui;
};

和 cpp 文件:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    serialPort(std::shared_ptr<SerialPort>(new SerialPort))
{
    ui->setupUi(this);
    connect(serialPort.get(), SIGNAL(opened()),this,SLOT(labelchange()));
}
void MainWindow::labelchange()
{
    ui->testinLabel->setText("signal connected to slot");
}

当我尝试发出信号时,另一个类方法:头文件:

class SerialPort : public QObject
{
public:
    SerialPort();
    void open()
signals:
    void serial_opened();
}

和 cpp 文件:

void SerialPort::open()
{
    emit serial_opened();
}

这只是从类发出的正常信号。不是"来自另一个"类。

您缺少Q_OBJECT宏,QObject 没有它就无法正常工作:

class SerialPort : public QObject
{
  Q_OBJECT
public:
    SerialPort();
    void open()
signals:
    void serial_opened();
}

并且您需要由moc处理文件。(如果文件列在 .pro 文件中,则会自动发生)

SerialPort 应包含Q_OBJECT marco,如下所示:

class SerialPort : public QObject
{
    Q_OBJECT
public:
    SerialPort();
    void open()
signals:
    void serial_opened();
}

另外请检查您的.pro文件,并检查您是否在标题部分下添加了SerialPort.h。