Сигнал не вызывает подключённый слот из другого треда. Сообщений об ошибках нет. Connect возвращает true, сигнал эмитится.



  • Qt 5.9
    Пытаюсь написать GUI для передачи команд по Modbus RTU через последовательный порт. Практика показала, что всё связанное с приёмом/передачей данных стоит реализовать в отдельном потоке, но тут появляются проблемы: некоторые вещи просто не работают. Не возвращают ошибки, каких-либо сообщений и т.д., но всё равно не работают. В т.ч. сигнал-слотовая связь.

    Привожу фрагменты кода:

    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 из some и слот openPort из modbusHandler. Connect возвращает true, сигнал эмитится с нужными аргументами (проверял QSignalSpy), но слот не вызывается. Гуглёжка не помогла.
    QSrting и int - зарегестрированные типы и должны без проблем передаваться в Queued Connection.
    Кроме того есть другие сигналы и слоты в этих объектах, которые успешно коннектятся и работают.

    Кроме того не работает отправка сообщений в модбас, хотя открыть/закрыть порт возможность есть, а функция отправки не возвращает error, но это уже следующий вопрос и там нужны другие фрагменты кода.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.