Qt - 无法分配给不存在的属性(自定义C++类)
Qt - Cannot Assign to Non-existent property (custom C++ class)
我正在尝试为我的项目为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(){
}
你缺少Q_OBJECT
宏;仅仅从QObject
子类派生是不够的:
Q_OBJECT宏必须出现在类定义的私有部分,该定义声明自己的信号和插槽,或使用Qt元对象系统提供的其他服务。
还有这一段:
请注意,Q_OBJECT宏对于实现信号、槽或属性的任何对象都是必需的。您还需要在源文件上运行元对象编译器。我们强烈建议在 QObject 的所有子类中使用此宏,无论它们是否实际使用信号、插槽和属性,因为如果不这样做可能会导致某些函数表现出奇怪的行为。
此处对此进行了更详细的解释。
相关文章:
- 如何在Qt C++中向自定义控件添加属性?
- 如何删除Qt设计器中自定义插件的QString属性的"translatable"复选框?
- 我可以从样式表 (qss) 更改自定义动态属性吗?
- 基于对象的两个属性的自定义比较器会引发异常
- 如何在"数据链接属性"对话框中自定义"连接"选项卡?
- 无法使用自定义结构的属性
- 如何根据自定义操作中的属性集安装功能
- 如何在Boost Graph库中的Grid_graph的边缘添加自定义属性
- 如何在自定义操作DLL(MSI / Wix)中获取"INSTALLED"属性?
- FAT32和NTF中的自定义文件属性
- 如何从类中返回自定义数组项目并操纵其属性?C
- 使用自定义的边缘属性 boost::adjacency_list 遍历边缘
- cmake 如何在项目的 vcxproj 属性组中添加自定义条目?
- 从QT C 返回自定义对象,并在QML中打印属性
- 如何在Windows中创建扩展(自定义)文件属性
- C 11按几个属性的自定义对象集合
- 用C 在QT中创建自定义属性
- 可视化如何从C++自定义操作获取 MSI 'UILevel'属性
- glibmm/gtkmm自定义属性解释/示例请求
- Qt - 无法分配给不存在的属性(自定义C++类)