QT信号错误:“this”不可用于静态成员功能

时间:2017-02-27 11:45:16

标签: qt c++11 qtcpsocket

我正在为我的应用程序的socket类工作,它将在QT框架中介绍我。当我尝试构建时,我收到此错误:'this'不适用于静态成员函数。 这是我的班级.h和.cpp

#pragma once
#include <QObject>
class QTcpSocket;
namespace Ps{
    class InstSocket : public QObject
    {
        Q_OBJECT
    public:
        InstSocket(QObject *parent=0);
        bool Connect();
        bool isOpen();
        void Disconnect();

        //Geters
        QString GetHostName() const {return m_hostName;}
        quint16 GetPort() const {return m_port;}
        //seters
        void SetHostName(const QString& value);
        void SetPort(quint16 value);
        void SetLongWaitMs(int value){m_longWaitMs = value;}
        void SetShortWaitMs(int value){m_shortWaitMs = value;}
        void WriteData(const QString &data) const;

        ~InstSocket();
        QString ReadData() const;
    signals:
        static void NotifyConnected();
        static void NotifyDisconnected();

    private slots:
        void onConnected();
        void onDisconnected();

    private:
        //this holds a reference to QtcpSocket
        QTcpSocket& m_socket;
        QString m_hostName;
        quint16 m_port;
        int m_shortWaitMs;
        int m_longWaitMs;

        explicit InstSocket(const InstSocket& rhs) = delete;
        InstSocket& operator= (const InstSocket& rhs) = delete;
    };
}

和cpp:

#include "instsocket.h"
#include "QTcpSocket"
#include "QDebug"
#include "utils.h"

namespace Ps
{
    InstSocket::InstSocket(QObject *parent) :
        QObject(parent),
        m_socket(*new QTcpSocket(this)),
        m_hostName(""),
        m_port(0),
        m_shortWaitMs(0),
        m_longWaitMs(0)
    {
        /* my signals are wired to the undelying socket signals, the signal connected is triggered, when a conection
         * is established. This will be wired to onConnected and Disconnected slots*/
        connect(&m_socket, &QTcpSocket::connected, this, &InstSocket::onConnected);
        connect(&m_socket, &QTcpSocket::disconnected, this, &InstSocket::onDisconnected);
    }

    bool InstSocket::Connect()
    {

        qDebug() << "attempting to connect to "<< m_hostName << "on port" << m_port << "with wait time: "<<m_longWaitMs;
        m_socket.connectToHost(m_hostName, m_port, QTcpSocket::ReadWrite);
        return m_socket.waitForConnected(m_longWaitMs);
    }

    bool InstSocket::isOpen()
    {
        return m_socket.isOpen();
    }

    void InstSocket::Disconnect()
    {
        if(!isOpen()) return;
        m_socket.disconnectFromHost();
    }


    void InstSocket::onConnected()
    {
        emit NotifyConnected();
    }

    void InstSocket::onDisconnected()
    {
        emit NotifyDisconnected();
    }

    void InstSocket::SetHostName(const QString &value)
    {
        m_hostName = value;
    }

    void InstSocket::SetPort(quint16 value)
    {
        m_port = value;
    }

    void InstSocket::WriteData(const QString &data) const
    {
        /*support for writeing to socket. The write metod of the socket will return the number of bites writen*/
        int bytes_written = m_socket.write(qPrintable(data));
        qDebug() << "Bytes written: "<<bytes_written;
    }

    QString InstSocket::ReadData() const
    {
        if(!m_socket.isReadable())
        {
            return "ERROR: Socket is unreadable.";
        }
        QString result;
        //until the socket reports there is no data available
        while(!m_socket.atEnd())
        {
            result.append(m_socket.readAll());
            /*since typically a PC would be much faster at reading than an instrument might be at writing
             * instrument must have a chance to queue up more data in case the message it's sending us is long.*/
            m_socket.waitForReadyRead(m_shortWaitMs);

        }
        return result;
    }

    InstSocket::~InstSocket()
    {
        Utils::DestructorMsg(this);
    }
}

这是错误:

Qt Projects\build-Vfp-Desktop_Qt_5_7_0_MSVC2015_64bit-Debug\debug\moc_instsocket.cpp:-1: In static member function 'static void         Ps::InstSocket::NotifyConnected()':
    error: 'this' is unavailable for static member functions

QMetaObject::activate(this, &staticMetaObject, 0, Q_NULLPTR); In static member function 'static void Ps::InstSocket::NotifyDisconnected()':
error: 'this' is unavailable for static member functions
    QMetaObject::activate(this, &staticMetaObject, 1, Q_NULLPTR);

当我点击它们时,QT创建者把我带到了moc_instsocket.cpp(这是在build文件夹中并且对此有所帮助:

    // SIGNAL 0
void Ps::InstSocket::NotifyConnected()
{
    QMetaObject::activate(this, &staticMetaObject, 0, Q_NULLPTR);
}

// SIGNAL 1
void Ps::InstSocket::NotifyDisconnected()
{
    QMetaObject::activate(this, &staticMetaObject, 1, Q_NULLPTR);
}

我无法弄清楚该做什么,我多次检查了所有代码。由于只有一些调试消息,因此无需了解utils类。有谁知道如何解决它?

1 个答案:

答案 0 :(得分:-1)

静态信号是什么意思?在Qt中,信号和插槽用于对象级别。

signals:
    static void NotifyConnected();
    static void NotifyDisconnected();
  

从QObject或其子类之一(例如,QWidget)继承的所有类都可以包含信号和插槽。当对象以可能对其他对象感兴趣的方式改变其状态时,由对象发出信号。这是沟通的所有对象。它不知道或关心是否有任何东西正在接收它发出的信号。这是真正的信息封装,并确保该对象可以用作软件组件。 Signal Slots documentation