如何通过QWebChannel

时间:2017-02-01 08:12:09

标签: c++ qt

我有问题通过Qt的网络渠道发送自定义类作为信号的参数。

对于编译和运行时,控制台中没有任何错误,甚至没有警告。即使我在JavaScript信号处理程序中有一个null作为参数。它与QString,int和其他方法完美配合,但与我的对象无关。

我看过这篇文章:How to register a class for use it in a QWebChannel signal in Qt。这个问题起初看起来很相似,但他们的解决方案并不适合我。我有一个公共默认构造函数,一个公共复制构造函数和一个公共析构函数。我使用了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);
}

如您所见,当通过通道从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;

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)

这给出了输出:

0
1
1
0
MaClass: []

我不明白为什么它总是空的。我试图创建getter和setter,但结果是一样的。

0 个答案:

没有答案