2016-03-07 46 views
2

我正在嘗試爲我的項目爲QML創建一個自定義TCP小部件(WebSocket發送HTTP請求,它不允許我發送原始TCP數據包) 。我創建了「TCPSocketConnection」(在cpp中命名爲TCPSocketConn)類,並使用佔位符方法給它一些屬性,並試圖將它插入到QML中。當我試圖使用類,我收到以下錯誤Qt - 不能分配給不存在的屬性(自定義C++類)

qrc:/qml/qmlwebsocketclient/main.qml:43:9: Cannot assign to non-existent property "onTextMessageReceived" 

我有這樣

****************************************************************************/ 
import QtQuick 2.0 
import QtWebSockets 1.0 
import Qt.Comm 2.0 
Rectangle { 
    width: 360 
    height: 360 

    TCPSocketConnection{ 
     id: socket 
     url: "ff" 
     onTextMessageReceived: { 
      console.log("On Recieve: " + messsage) 
     } 

    } 

} 

一個QML文件的TCPSocketConnection被定義爲tcpsocketconn如下

qmlRegisterType<TCPSocketConn>("Qt.Comm", 2, 0, "TCPSocketConnection"); 

。 h

#ifndef TCPSOCKETCONN_H 
#define TCPSOCKETCONN_H 

#include <QQuickItem> 


class TCPSocketConn : public QQuickItem 
{ 

    Q_PROPERTY(QString url READ url WRITE a_1 NOTIFY a_2) 
    Q_PROPERTY(QString message READ message WRITE a_3 NOTIFY textMessageRecieved) 
    Q_PROPERTY(int status READ status WRITE a_4 NOTIFY statusChanged) 

public: 
    explicit TCPSocketConn(QQuickItem *parent = 0); 

    QString url(); 
    QString message(); 
    int status(); 

signals: 
    void a_2(); 
    void textMessageReceived(); 
    void statusChanged(); 

public slots: 
    void a_1(QString); 
    void a_3(QString); 
    void a_4(int); 
}; 

#endif // TCPSOCKETCONN_H 

用佔位符cpp文件

#include "tcpsocketconn.h" 

TCPSocketConn::TCPSocketConn(QQuickItem *parent) : QQuickItem(parent) 
{ 

} 

QString TCPSocketConn::url(){ 
    return ""; 
} 

QString TCPSocketConn::message(){ 
    return ""; 
} 

int TCPSocketConn::status(){ 
    return 0; 
} 

void TCPSocketConn::a_1(QString d){ 

} 

void TCPSocketConn::a_3(QString d){ 

} 
void TCPSocketConn::a_4(int s){ 

} 

void TCPSocketConn::textMessageReceived(){ 

} 

void TCPSocketConn::statusChanged(){ 

} 
void TCPSocketConn::a_2(){ 

} 

回答

2

您錯過了Q_OBJECT宏;這是不夠的,只是從一個QObject子類派生:

的Q_OBJECT宏必須出現在類的定義,聲明自己的信號和槽的私人部分或使用通過Qt的元對象系統提供的其他服務。

還有this paragraph

注意,Q_OBJECT宏是強制性的,它實現信號,槽或性質的任何對象。您還需要在源文件上運行Meta Object Compiler。我們強烈建議在QObject 的所有子類中使用此宏,而不管它們是否實際使用信號,插槽和屬性,因爲如果不這樣做可能導致某些函數表現出奇怪的行爲。

這更詳細地解釋here

相關問題