代码之家  ›  专栏  ›  技术社区  ›  2adnielsenx xx

qmqtt qobject::connect:无法对“clientState”类型的参数进行排队(请确保使用qRegisterMetaType()注册了“clientState”)。

  •  0
  • 2adnielsenx xx  · 技术社区  · 8 年前

    我正在创建一个线程,在该线程中:

    m_client = new QMqttClient(this);
    m_client->setHostname("ps01.xx.com");
    m_client->setPort(1883);
    m_client->setClientId("Sas-RASPi-001");
    
    m_client->connectToHost();
    

    正在连接到MQT代理。

    任何信号连接尝试,如:

    QObject::connect(m_client, &QMqttClient::stateChanged, this, &Messenqt::updateLogStateChange);
    

    产生如下错误:

    QObject::Connect:无法对“ClientState”类型的参数进行排队 (确保使用qRegisterMetaType()注册了“ClientState”)。

    我补充道:

     qRegisterMetaType<QMqttClient::ClientState>("QMqttClient::ClientState");
    

    在代码的开头(上面的代码)

    同样的问题。

    在qt信号/插槽方式中,使用来自不同线程的MQT的正确方法是什么?

    编辑:

    for (int i = 20 ; i < 20 ; i++){
    QThread::sleep(1);
    if(m_client->publish(topic_, QString("testing. . . ").toLocal8Bit() , 1 ,true) == -1;
          qDebug() << " error" <<;
    }
    

    你好, 我在for循环中使用qmqtt,休眠1秒,然后处理等待发送消息,直到所有20条消息都发布为止。 当循环完成时,所有20条消息都会发送。

    但是。如果我们不使用qthread::sleep(1)。然后分别发送每个消息。为什么?是吗?

    是否有任何方法可以在每封邮件发布后立即强制发送给它?

    编辑2

    下面的示例不将图像发送到代理。它挡住了某个地方。我需要刷新消息:)

    最小示例:

     m_client = new QMqttClient(this);
    
    m_client->setHostname("ps01.xxx.com");
    m_client->setPort(1883);
    m_client->setClientId("RASPBERRY-009");
    
    m_client->setUsername("vv");
    m_client->setPassword("vv");
    m_client->setCleanSession(false);
    
    m_client->connectToHost();
    //yeni slot mekanizmasi. kendi icinde &Publisher örneği..
    QObject::connect(m_client, &QMqttClient::stateChanged, this, &Publisher::updateStateChange);
    
    QObject::connect(m_client, &QMqttClient::connected, this, &Publisher::sendMessages);
    

    a发送消息:

     void Publisher::sendMessages()
    {
        QDir dir("/ram");
        int count = 0;
        QThread::sleep(5);
    
        while (true){
            QStringList images_metas = dir.entryList(QStringList() << "*.png" ,QDir::Files);
    
            if (images_metas.size() > 0){
    
                foreach(QString filename, images_metas) {
    
                    dataLoad *dl = new dataLoad;
                    QString  img_path = "/ram/" + filename;
                    QImage img(img_path);
    
    
                    qDebug() << " : : : " << QImage("/ram/00-02-2018-04-05-2.png").size() << endl;
    
    
                    dl->image = img;
                    dl->text = "Deneme MEsajıdır . . ";
                    QByteArray byteArray_;
    
                    QDataStream stream(&byteArray_, QIODevice::WriteOnly);
                    stream.setVersion(QDataStream::Qt_5_10);
    
                    stream << dl->image << dl->text;
    
                    qDebug() << count++ << "  sending  : " << byteArray_.size() << "  " <<  filename << endl;
    
                    qDebug() << testPublish(byteArray_)<< endl;
    
                }
    
            }
            else {
                qDebug() << " folder is empty waiting... " << endl;
            }
            //Check every 1 second
            QThread::sleep(1);
        }
    
    }
    

    出版业:

        qint32 Publisher::testPublish(QByteArray &bytarray)
    {
        QMqttTopicName topic_ = QString("qtmqtt/topic1");
        QString mesaj = ".x.x.x.x.x.x.x.";
    
            auto id = m_client->publish(topic_, mesaj.toLocal8Bit() , 1 ,true);
    
            return id;
    }
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Rahibe Meryem    8 年前

    请尝试以下代码:

    msg_timer = new QTimer(this);
    
    //TODO big chip save timer.
    connect(msg_timer, SIGNAL(timeout()) , this , SLOT(sendMessages()));
    msg_timer->start(1000);
    

    不要使用while循环。它挡住了一切……

    最佳

        2
  •  0
  •   Mr.Stack    8 年前

    对于在线程中工作导致的“qmqtt qobject::connect:无法对类型为“clientState”(确保使用qRegisterMetaType()注册了“clientState”)的参数进行排队的问题,我得到了解决方案。虽然我没有明确具体的含义,但至少它能很好地发挥作用。

    你可以尝试一下:

     connect(m_client, &QMqttClient::stateChanged, [&](QMqttClient::ClientState state){
        qDebug()<< state;
    });