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

QT signal-slot issue. Signal is emitted, slot isn't called. No warnings, no errors, no messages

本文关键字:信号 警告 有错误 消息 时隙 问题 QT 插槽 调用      更新时间:2023-10-16

我试图通过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某些已成功连接到来自modbusHandleropenPort插槽,已发出,但未执行openPortslot。

我寻找答案,但没有结果QStringint是注册类型。

如果有一些明显的错误,请原谅:当我为这个问题创建裁剪版本的代码时,可能会出现这些错误。几天来,我真的试图在代码中发现错误,但没有成功。

!!!附言我忘了提一下,这些对象之间有一些信号槽连接,这很有效!例如,如果串行端口被打开,就会发出关于它的信号,并调用我的某个对象的插槽。

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

您想要的连接类型是什么?对象不在同一个线程中,它不可能是直接连接,因此由您在Qt::QueuedConnection和Qt:

在任何情况下,它都需要经过事件循环才能最终进入modbusThread 上的插槽

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