qml和c++通过信号槽传递指针
在c++中,通过QVariant + 信号槽传递指针的方法为:
connect(...,SIGNAL(mySignal(QVariant)), ..., SLOT(fb(QVariant)))
void fa() {
static char *p = new char[10];
emit mySignal(QVariant::fromValue((void*)p));
}
void fb(QVariant p) {
char* t = (char*)p.value<void*>();
}
这样做是没有问题的。
但是,如果想用同样的方法,将c++中的指针传递到qml中,就会出现问题。
// qml
Item {
function onSlot(p) {
console.log(p) // null
}
}
// c++
connect(...,SIGNAL(mySignal(QVariant)), ..., SLOT(onSlot(QVariant)))
我们知道,在64位操作系统中,指针的长度是8个字节,可以将指针转成long long类型,在封装进QVariant中,就可以传递进qml了。
// qml
Item {
function onSlot(p) {
console.log(p) // 0xffff003f
}
}
// c++
connect(...,SIGNAL(mySignal(QVariant)), ..., SLOT(onSlot(QVariant)))
......
void fa() {
static char *p = new char[10]; // 假设为0xffff003f
emit mySignal((long long)p);
}