我有问题通过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,但结果是一样的。