我如何从另一个班级发出信号?

时间:2014-02-09 16:32:41

标签: c++ qt

我如何从另一个班级发出信号?在我的实现如下所示,当我尝试在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();
}

2 个答案:

答案 0 :(得分:1)

这只是从班级发出的正常信号。不是“来自另一个”类。

你错过了Q_OBJECT宏,QObject并没有真正解决它:

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

signals:
    void serial_opened();
}

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

答案 1 :(得分:1)

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

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

signals:
    void serial_opened();
}

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