【问题标题】:Qt - Cannot Assign to Non-existent property (custom C++ class)Qt - 无法分配给不存在的属性(自定义 C++ 类)
【发布时间】:2016-03-07 19:06:11
【问题描述】:

我正在尝试为我的项目为 QML 制作一个自定义 TCP 小部件(WebSocket 发送一个 HTTP 请求,它不允许我发送原始 TCP 数据包)。我创建了“TCPSocketConnection”(在 cpp 中命名为 TCPSocketConn)类,并使用占位符方法为其提供了一些属性,并尝试将其插入 QML。当我尝试使用该类时,出现以下错误

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

我有一个这样的 QML 文件

****************************************************************************/
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)
        }

    }

}

TCPSocketConnection定义如下

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

在 tcpsocketconn.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(){

}

【问题讨论】:

    标签: c++ qt qml


    【解决方案1】:

    您缺少Q_OBJECT 宏;仅仅从 QObject 子类派生是不够的:

    Q_OBJECT 宏必须出现在声明自己的信号和槽或使用 Qt 元对象系统提供的其他服务的类定义的私有部分中。

    还有this paragraph:

    请注意,对于任何实现信号、槽或属性的对象,Q_OBJECT 宏都是必需的。您还需要在源文件上运行 Meta Object Compiler。我们强烈建议在 QObject 的所有子类中使用此宏无论它们是否实际使用信号、槽和属性,因为不这样做可能会导致某些函数表现出奇怪的行为。 p>

    这有更详细的解释here

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多