如何通过QWebChannel发送自定义数据

Axe*_*yan 5 c++ qt

我在通过Qt的网络频道发送自定义类作为信号的参数时遇到问题。

对于编译和运行时,控制台中没有任何错误,甚至没有警告。即使这样,我的JavaScript信号处理程序中的参数也为null。它可以与QString,int和其他对象完美配合,但不能与我的对象配合使用。

我看到了这篇文章:如何注册一个类,以在Qt的QWebChannel信号中使用它。起初问题似乎很相似,但是他们的解决方案对我不起作用。我有一个公共默认构造函数,一个公共副本构造函数和一个公共析构函数。我同时使用了qRegisterMetaType()和Q_DECLARE_METATYPE,还是一无所有。

通过打印qwebchannel.js收到的消息,我意识到C ++发送空值。这意味着它不知道如何发送我的课程。

是否有人知道可能发生的事情或如何解决?(即使你不知道也要提出)

提前致谢!

编辑:经过研究,我意识到问题来自QWebChannel(singalhandler_p.h)中的这一行:

template<class Receiver>
void SignalHandler<Receiver>::dispatch(const QObject *object, const int signalIdx, void **argumentData)
{
    Q_ASSERT(m_signalArgumentTypes.contains(object->metaObject()));
    const QHash<int, QVector<int> > &objectSignalArgumentTypes = m_signalArgumentTypes.value(object->metaObject());
    QHash<int, QVector<int> >::const_iterator signalIt = objectSignalArgumentTypes.constFind(signalIdx);
    if (signalIt == objectSignalArgumentTypes.constEnd()) {
        // not connected to this signal, skip
        return;
    }
    const QVector<int> &argumentTypes = *signalIt;
    QVariantList arguments;
    arguments.reserve(argumentTypes.count());
    // TODO: basic overload resolution based on number of arguments?
    for (int i = 0; i < argumentTypes.count(); ++i) {
        const QMetaType::Type type = static_cast<QMetaType::Type>(argumentTypes.at(i));
        QVariant arg;
        if (type == QMetaType::QVariant) {
            arg = *reinterpret_cast<QVariant *>(argumentData[i + 1]);
        } else {
            arg = QVariant(type, argumentData[i + 1]);
        }
        arguments.append(arg);
    }
    m_receiver->signalEmitted(object, signalIdx, arguments);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,当C ++通过通道发送信号时,参数将在QVariant中转换。经过几次测试后,我意识到QVariant :: typeName()返回了我的类型的名称,但其中不包含任何内容。

我尝试了一个代码来了解我在做什么错。MyClass myClass; QVariant变体= QVariant :: fromValue(myClass);

std::cout << (int)doc.isArray() << std::endl;
std::cout << (int)doc.isEmpty() << std::endl;
std::cout << (int)doc.isNull() << std::endl;
std::cout << (int)doc.isObject() << std::endl;

std::cout << variant.typeName() << ": [" << variant.toJsonDocument().toJson().toStdString() << "]" << std::endl;
Run Code Online (Sandbox Code Playgroud)

MyClass的标头是:

class MyClass : public QObject
{
    Q_OBJECT

    Q_PROPERTY(int a MEMBER a)

public:
    MyClass(QObject *parent = NULL);
    MyClass(const MyClass &);

    int a;
};

Q_DECLARE_METATYPE(MyClass)
Run Code Online (Sandbox Code Playgroud)

这给出了输出:

0
1
1
0
MaClass: []
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它总是空的。我尝试创建getter和setter,但结果是相同的。