gpt4 book ai didi

c++ - 如何注册一个类以在 Qt 中的 QWebChannel 信号中使用它

转载 作者:太空狗 更新时间:2023-10-29 23:00:04 26 4
gpt4 key购买 nike

我使用带有 WebChannel 的 QT 5 与 HTML 页面进行通信。我成功地能够传达文本和字符串。但是我想传达一些积分数据。

官方文档说

"No manual message passing and serialization of data is required," http://doc.qt.io/qt-5/qwebchannel.html

当我尝试发送对象或数组而不是字符串时,应用程序抛出此消息:

Don't know how to handle 'data', use qRegisterMetaType to register it.

如何使用 Point 类而不是字符串对象发出信号?或者将一个类序列化为一个字符串。

这是我要发送到我的 HTML 的对象

点类

class MyData{
public :
int x,y,z;
};
Q_DECLARE_METATYPE(MyData)

map 类

class MyMap : public QObject{
Q_OBJECT

public:
explicit MyMap ();

signals:
updateText(const QString &text); // registered
updateData(MyData &data); // Don't know how to handle 'data', use qRegisterMetaType to register it.

public slots:
receiveText(const QString &text);
};

和主要代码

qRegisterMetaType<MyData>();

// setup the channel
QWebChannel channel;
QObject::connect(&clientWrapper, &WebSocketClientWrapper::clientConnected, &channel, &QWebChannel::connectTo);

// setup the dialog and publish it to the QWebChannel
channel.registerObject(QStringLiteral("map"), &map);

map.updateText("text");

MyData data;
data.x=10;
data.y=12;
data.z=13;
map.updateData(data);

最佳答案

根据 Qt documentation :

To use the type T in QVariant, using Q_DECLARE_METATYPE() is sufficient. To use the type T in queued signal and slot connections, qRegisterMetaType() must be called before the first connection is established.

在我自己的代码中,我使用 Q_DECLARE_METATYPE对于我想存储在 QVariant 中的类(这个宏必须放在全局范围内)。而我qRegisterMetaType<T>()对于我想传递给信号/槽的类(必须在建立 signal.slot 连接之前调用此函数)。如果只使用一个功能,我从来不需要调用两者。

因此,对于您的示例,这应该有效:

qRegisterMetaType<MyData>( "MyData" );
// then, form here, you can connect `updateData(MyData)` signal to any slot taking a MyData parameter

对于信号/槽声明:

  • 如果qRegisterMetaType没有被调用,你只能使用信号/槽传递 MyData通过引用或指针(将 signal 声明为 void updateData(MyData& data);void updateData(MyData* data); )。然后,如果进行异步连接(如 Qt::QueuedConnection ),你必须非常小心,因为,作为 slot将“稍后”执行,您必须保证对象引用在 slot 之前保持有效在你发出 signal 后被执行.
  • 如果qRegisterMetaType被调用,你可以使用信号/槽传递 MyData通过复制(将 signal 声明为 void updateData(MyData data); )。并且与通过拷贝传递的那些对象进行异步连接是安全的,因为 Qt 能够序列化该对象(这意味着如果 slot 被“稍后”执行,它最终将使用一个全新的 MyData 对象被复制从你发出信号的原始信号......没有调用 qRegisterMetaType,Qt 无法执行此“复制”)。

确保MyData当您这样做时,声明是已知的(没有前向声明)。

另请注意,并非所有类/结构都可以通过这种方式注册,它们必须具有:

a public default constructor, a public copy constructor, and a public destructor

您的 MyData 就是这种情况类(默认的都可以),所以它应该能顺利工作。

关于c++ - 如何注册一个类以在 Qt 中的 QWebChannel 信号中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34818557/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com