QT信号槽问题。发出信号,不调用插槽。没有警告,没有错误,没有消息

时间:2017-10-30 15:37:35

标签: c++ qt

我试图通过Modbus RTU创建用于硬件控制的GUI,但是当我尝试在单独的线程中实现所有连接到串行端口和消息时,我遇到了问题。我使用Qt 5.9。 这是我的代码摘录:

some.cpp:

some::some(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::some)
{
    ui->setupUi(this);

    modbusH = new modbusHandler(values);
    modbusThread = new QThread();
    connect(modbusThread, &QThread::started, modbusH, &modbusHandler::process);
    connect(modbusH, &modbusHandler::portOpenSuccess, this, on_port_opened);
    connect(modbusH, &modbusHandler::portCloseSuccess, this, on_port_closed);
    connect(this, &some::port_open_request, modbusH, &modbusHandler::openPort);
    connect(this, &some::port_close_request, modbusH, &modbusHandler::closePort);
    modbusH->moveToThread(modbusThread);
    modbusThread->start();
}


void some::on_openClosePortButton_clicked()
{
      emit port_open_request(ui->portsComboBox->currentText(), localBaudRate.at(ui->baudRateComboBox->currentIndex()));
}

some.h:

class some : public QMainWindow
{
    Q_OBJECT

signals:

    void port_open_request (QString, int);


private:

    modbusHandler* modbusH;
    QThread* modbusThread;
};

#endif // some_H

modbusHandler.cpp

void modbusHandler::openPort(QString portName, int baudRate)
{
    device->setConnectionParameter(QModbusDevice::SerialPortNameParameter, portName);
    device->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, (QSerialPort::BaudRate)baudRate);
    device->connectDevice();
    emit portOpenSuccess(device->state() == QModbusDevice::ConnectedState);
}

modbusHandler.h:

class modbusHandler : public QObject
{
    Q_OBJECT

signals:

    void sessionFinished();

    void portCloseSuccess(bool ok);

    void portOpenSuccess(bool ok);

public slots:

    void process();

    void startSession();

    void openPort(QString portName, int baudRate);

    void closePort();

};

#endif // MODBUSMASTER_H

第一个问题是:来自某些的信号 port_open_request 已成功连接 modbusHandler openPort 插槽但是 openPort 插槽没有被执行。

我找了答案但没有结果。 QString int 是注册类型。

对不起,如果有一些明显的错误:我可以在为这个问题创建裁剪版本的代码时完成。我真的试图在几天内抓住我的代码中的错误而没有任何成功。

!!! P.S。我忘了提一下,这些物体之间有一些信号槽连接,有效!例如,如果打开串口,则会发出有关它的信号,并调用某些对象的插槽。

1 个答案:

答案 0 :(得分:0)

不确定,但规范的方法是首先将modbusH对象移动到modbusThread,然后进行连接。

您想要的连接类型是什么?对象不在同一个线程中,它不能是直接连接,因此您可以在Qt :: QueuedConnection和Qt :: BlockingQueuedConnection之间进行选择

无论如何,它需要通过事件循环才能在modbusThread的插槽中结束

我也断言连接的结果,它返回一个值得检查的bool