QT 信号插槽问题。发出信号,不调用时隙。没有警告,没有错误,没有消息
QT signal-slot issue. Signal is emitted, slot isn't called. No warnings, no errors, no messages
我试图通过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插槽,已发出,但未执行openPortslot。
我寻找答案,但没有结果QString和int是注册类型。
如果有一些明显的错误,请原谅:当我为这个问题创建裁剪版本的代码时,可能会出现这些错误。几天来,我真的试图在代码中发现错误,但没有成功。
!!!附言我忘了提一下,这些对象之间有一些信号槽连接,这很有效!例如,如果串行端口被打开,就会发出关于它的信号,并调用我的某个对象的插槽。
不确定,但规范的方法是首先将modbusH对象移动到modbusThread,然后进行连接。
您想要的连接类型是什么?对象不在同一个线程中,它不可能是直接连接,因此由您在Qt::QueuedConnection和Qt:
在任何情况下,它都需要经过事件循环才能最终进入modbusThread 上的插槽
我也会断言连接的结果,它返回一个值得检查的bool
相关文章:
- 警告处理为错误这里有什么问题
- Qt VTK交互风格的信号到小部件
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 如何在没有信号的情况下从C++执行QML插槽
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 线程之间的布尔停止信号
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 当用户在qtablewidget中输入单元格时,如何获得信号?C++
- IntelliSense函数定义未找到QT信号的警告
- QT 信号插槽问题。发出信号,不调用时隙。没有警告,没有错误,没有消息
- (C++)GTK 警告 **:找不到信号处理程序。您是否使用 -rdynamic 编译?
- 将 c++ 信号连接到 qml 插槽时发出警告
- sc_start警告 W571 表示信号/端口绑定失败