2016-08-15 33 views
0

的提示我正在致力于异步多线程服务器,基于this example。现在,我下面的方法:QObject :: connect:没有这样的信号运行时间警告 - 无法找到

void UeClient::ueSlotReadyRead() 
{ 
    QList<QVariant> incomingData=QList<QVariant>(); 
    QByteArray incomingMessage=this->ueSocket()->readAll(); 

    UePosCommProtocolArch::UeCommand incomingCommand=UePOSCommProtocol::ueDecodeCommand(incomingMessage, 
                         incomingData); 

    UeTask* ueTask=new UeTask("testDb", 
           "testUsername", 
           "testPassword", 
           "localhost", 
           "3306", 
           incomingCommand); 

    connect(ueTask, 
      SIGNAL(ueSignalTaskFinished(UePosCommProtocolArch::UeCommand, 
             QByteArray)), 
      this, 
      SLOT(ueSlotFetchData(UePosCommProtocolArch::UeCommand, 
           QByteArray)), 
      Qt::QueuedConnection); 

    QThreadPool::globalInstance()->start(ueTask); 
} // ueSlotReadyRead 

我获得以下运行时警告/错误QtCreator

的QObject ::连接:没有这样的信号UeTask :: ueSignalTask​​Finished(UePosCommProtocolArch :: UeCommand,QByteArray中)在../../../net/ueclient.cpp:55

这里是UeTask类的头文件,从中我们可以看到ueSignalTaskFinished(UePosCommProtocolArch::UeCommand& executedCommand, QByteArray& fetchedData);声明

#ifndef UETASK_H 
#define UETASK_H 

#include <QObject> 
#include <QRunnable> 
#include <QSqlDatabase> 
#include <QSqlError> 
#include <QUuid> 
#include <QString> 
#include <QSqlQuery> 
#include <QSqlRecord> 
#include <QVariant> 
#include <QJsonDocument> 
#include <QJsonValue> 
#include <QJsonObject> 
#include <QJsonArray> 
#include <QByteArray> 

#include "../../uePOSCommProtocol/uecommands.h" 
#include "database/models/uefieldindexes.h" 
#include "database/models/uequeries.h" 

/*! 
* \brief The UeTask class 
*/ 
class UeTask : public QObject, 
       public QRunnable 
{ 
    Q_OBJECT 

private: 
    /*! 
    * \brief m_ueDatabaseName 
    */ 
    QString m_ueDatabaseName; 

    /*! 
    * \brief m_ueUserName 
    */ 
    QString m_ueUserName; 

    /*! 
    * \brief m_uePassword 
    */ 
    QString m_uePassword; 

    /*! 
    * \brief m_ueHostName 
    */ 
    QString m_ueHostName; 

    /*! 
    * \brief m_uePort 
    */ 
    QString m_uePort; 

    /*! 
    * \brief m_ueCommand 
    */ 
    UePosCommProtocolArch::UeCommand m_ueCommand; 

    /*! 
    * @brief ueDatabaseName 
    * @return database name 
    */ 
    inline const QString& ueDatabaseName() const 
     { return this->m_ueDatabaseName; } 

    /*! 
    * @brief ueDatabaseUserName 
    * @return database user name 
    */ 
    inline const QString& ueDatabaseUserName() const 
     { return this->m_ueUserName; } 

    /*! 
    * @brief ueDatabasePassword 
    * @return database password 
    */ 
    inline const QString& ueDatabasePassword() const 
     { return this->m_uePassword; } 

    /*! 
    * @brief ueDatabasHost 
    * @return database host name 
    */ 
    inline const QString& ueDatabasHost() const 
     { return this->m_ueHostName; } 

    /*! 
    * @brief uePort 
    * @return database host port 
    */ 
    inline const QString& ueDatabaseHostPort() const 
     { return this->m_uePort; } 

    /*! 
    * \brief ueCommand 
    * \return task command 
    */ 
    inline UePosCommProtocolArch::UeCommand& ueCommand() 
     { return this->m_ueCommand; } 

    /*! 
    * @brief ueSetDatbaseName 
    * @param name 
    */ 
    inline void ueSetDatbaseName(const QString& name) 
     { this->m_ueDatabaseName=name; } 

    /*! 
    * @brief ueSetDatabaseUserName 
    * @param userName 
    */ 
    inline void ueSetDatabaseUserName(const QString& userName) 
     { this->m_ueUserName=userName; } 

    /*! 
    * @brief ueSetDatabasePassword 
    * @param password 
    */ 
    inline void ueSetDatabasePassword(const QString& password) 
     { this->m_uePassword=password; } 

    /*! 
    * @brief ueSetDatabaseHostName 
    * @param hostName 
    */ 
    inline void ueSetDatabaseHostName(const QString& hostName) 
     { this->m_ueHostName=hostName; } 

    /*! 
    * @brief ueSetDatabaseHostPort 
    * @param port 
    */ 
    inline void ueSetDatabaseHostPort(const QString& port) 
     { this->m_uePort=port; } 

    /*! 
    * \brief ueSetCommand 
    * \param command 
    */ 
    inline void ueSetCommand(const UePosCommProtocolArch::UeCommand& command) 
     { this->m_ueCommand=command; } 

public: 
    /*! 
    * @brief UeTask 
    */ 
    explicit UeTask(const QString& databaseName, 
        const QString& userName, 
        const QString& password, 
        const QString& hostName, 
        const QString& port, 
        const UePosCommProtocolArch::UeCommand& command); 

protected: 
    /*! 
    * @brief run 
    */ 
    void run(); 

signals: 
    /*! 
    * \brief ueSignalTaskFinished 
    * \param executedCommand 
    * \param fetchedData 
    */ 
    void ueSignalTaskFinished(UePosCommProtocolArch::UeCommand& executedCommand, 
           QByteArray& fetchedData); 

    /*! 
    * @brief ueSignalDatabaseConnectionOk 
    */ 
    void ueSignalDatabaseConnectionOk(); 

    /*! 
    * @brief ueSignalDatabaseConnectionError 
    * @param error 
    */ 
    void ueSignalDatabaseConnectionError(const QSqlError& error); 
}; 

#endif // UETASK_H 

凭啥我是一个得到这个运行时警告/错误和signal连接到slot?这可能是一些愚蠢的错误做,但我一直在用这个bug了几个小时的奋力...

回答

0

我已经成功地解决了通过@佩普的回答这个问题,我已经添加到constSIGNAL的声明:

#ifndef UETASK_H 
#define UETASK_H 

#include <QObject> 
#include <QRunnable> 
#include <QSqlDatabase> 
#include <QSqlError> 
#include <QUuid> 
#include <QString> 
#include <QSqlQuery> 
#include <QSqlRecord> 
#include <QVariant> 
#include <QJsonDocument> 
#include <QJsonValue> 
#include <QJsonObject> 
#include <QJsonArray> 
#include <QByteArray> 

#include "../../uePOSCommProtocol/uecommands.h" 
#include "database/models/uefieldindexes.h" 
#include "database/models/uequeries.h" 

/*! 
* \brief The UeTask class 
*/ 
class UeTask : public QObject, 
       public QRunnable 
{ 
    Q_OBJECT 

private: 
    /*! 
    * \brief m_ueDatabaseName 
    */ 
    QString m_ueDatabaseName; 

    /*! 
    * \brief m_ueUserName 
    */ 
    QString m_ueUserName; 

    /*! 
    * \brief m_uePassword 
    */ 
    QString m_uePassword; 

    /*! 
    * \brief m_ueHostName 
    */ 
    QString m_ueHostName; 

    /*! 
    * \brief m_uePort 
    */ 
    QString m_uePort; 

    /*! 
    * \brief m_ueCommand 
    */ 
    UePosCommProtocolArch::UeCommand m_ueCommand; 

    /*! 
    * @brief ueDatabaseName 
    * @return database name 
    */ 
    inline const QString& ueDatabaseName() const 
     { return this->m_ueDatabaseName; } 

    /*! 
    * @brief ueDatabaseUserName 
    * @return database user name 
    */ 
    inline const QString& ueDatabaseUserName() const 
     { return this->m_ueUserName; } 

    /*! 
    * @brief ueDatabasePassword 
    * @return database password 
    */ 
    inline const QString& ueDatabasePassword() const 
     { return this->m_uePassword; } 

    /*! 
    * @brief ueDatabasHost 
    * @return database host name 
    */ 
    inline const QString& ueDatabasHost() const 
     { return this->m_ueHostName; } 

    /*! 
    * @brief uePort 
    * @return database host port 
    */ 
    inline const QString& ueDatabaseHostPort() const 
     { return this->m_uePort; } 

    /*! 
    * \brief ueCommand 
    * \return task command 
    */ 
    inline UePosCommProtocolArch::UeCommand& ueCommand() 
     { return this->m_ueCommand; } 

    /*! 
    * @brief ueSetDatbaseName 
    * @param name 
    */ 
    inline void ueSetDatbaseName(const QString& name) 
     { this->m_ueDatabaseName=name; } 

    /*! 
    * @brief ueSetDatabaseUserName 
    * @param userName 
    */ 
    inline void ueSetDatabaseUserName(const QString& userName) 
     { this->m_ueUserName=userName; } 

    /*! 
    * @brief ueSetDatabasePassword 
    * @param password 
    */ 
    inline void ueSetDatabasePassword(const QString& password) 
     { this->m_uePassword=password; } 

    /*! 
    * @brief ueSetDatabaseHostName 
    * @param hostName 
    */ 
    inline void ueSetDatabaseHostName(const QString& hostName) 
     { this->m_ueHostName=hostName; } 

    /*! 
    * @brief ueSetDatabaseHostPort 
    * @param port 
    */ 
    inline void ueSetDatabaseHostPort(const QString& port) 
     { this->m_uePort=port; } 

    /*! 
    * \brief ueSetCommand 
    * \param command 
    */ 
    inline void ueSetCommand(const UePosCommProtocolArch::UeCommand& command) 
     { this->m_ueCommand=command; } 

public: 
    /*! 
    * @brief UeTask 
    */ 
    explicit UeTask(const QString& databaseName, 
        const QString& userName, 
        const QString& password, 
        const QString& hostName, 
        const QString& port, 
        const UePosCommProtocolArch::UeCommand& command); 

protected: 
    /*! 
    * @brief run 
    */ 
    void run(); 

signals: 
    /*! 
    * \brief ueSignalTaskFinished 
    * \param executedCommand 
    * \param fetchedData 
    */ 
    void ueSignalTaskFinished(const UePosCommProtocolArch::UeCommand& executedCommand, 
           const QByteArray& fetchedData); 

    /*! 
    * @brief ueSignalDatabaseConnectionOk 
    */ 
    void ueSignalDatabaseConnectionOk(); 

    /*! 
    * @brief ueSignalDatabaseConnectionError 
    * @param error 
    */ 
    void ueSignalDatabaseConnectionError(const QSqlError& error); 
}; 

#endif // UETASK_H 

然后我不得不register meta type有:

qRegisterMetaType<UePosCommProtocolArch::UeCommand>("UePosCommProtocolArch::UeCommand"); 

在上层类的构造函数:

UeClient::UeClient(QObject *parent, 
        UeSettings* const settings) 
    : QObject(parent) 
{ 
    qRegisterMetaType<UePosCommProtocolArch::UeCommand>("UePosCommProtocolArch::UeCommand"); 

    QThreadPool::globalInstance()->setMaxThreadCount(10); 

    this->ueSetSettings(settings); 
} // constructor 

现在它作品!

2

信号签名是引用类型(UePosCommProtocolArch :: UeCommand &,QByteArray中&)。你试图用另一个签名将信号连接到插槽。

+0

请注意,它将匹配,如果它是一个const引用 – UmNyobe

5

的信号的签名不匹配的你在SIGNAL宏写的签名 - 这些都是非const引用:

SIGNAL(ueSignalTaskFinished(UePosCommProtocolArch::UeCommand&, // reference 
          QByteArray&)), //ditto 

非const引用的使用作为信号参数已经是可疑足够的,并用排队连接使用它们肯定是错误的。你想在这里做什么?

+0

与这两个参数我想从'ueSignalTask​​Finished'数据传输到'slot',所以我可以处理提取的数据,这是做错了吗?! – KernelPanic

+1

为什么不通过引用传递给const呢? – peppe

相关问题