CefView / QCefView

A Qt Widget encapsulated CEF view based on QWidget
https://cefview.github.io/QCefView/
GNU Lesser General Public License v2.1
527 stars 137 forks source link

[BUG]: QVariantToCefValue数据类型转换问题 #219

Closed xiaobingcaicai closed 1 year ago

xiaobingcaicai commented 1 year ago

描述

业务场景为模拟实时大量点数据进行波形图绘制,通过triggerEvent将数据给到前端js, event的arguments中添加了两个参数,参数均为数组,在使用QVariantList与QList两种数据集合传递数组参数时出现不同问题

  1. 使用QList时,会提示类型转换的问题,检测到类型为QWidget,"Unsupported QVariantType conversion: QWidget" 定位到在QCefView\src\details\utils\ValueConvertor.cpp中的QVariantToCefValue方法内
  2. 使用QVariantList时,内存会快速增长到几百兆

代码部分

QThread::create([this](){
        QList<int> xtmp;
        //QVariantList xtmp;
        for(int i = 0; i < 2048; i++){
            xtmp.append(i);
        }
        QList<int> tmp;
        //QVariantList tmp;
        while(true){
            tmp.clear();
            for(int i = 0; i < 2; i++){
                int tt = (QRandomGenerator::global()->bounded(500, 1500));
                tmp.append(tt);
            }

            QCefEvent updateEvent("updateData");

            QVariant vdata(QVariant::List);
            vdata.setValue(tmp);
            updateEvent.arguments().append(vdata);

            QVariant vxdata(QVariant::List);
            vxdata.setValue(xtmp);
            updateEvent.arguments().append(vxdata);

            cefViewWidget->triggerEvent(updateEvent);

            vdata.clear();
            vxdata.clear();
            updateEvent.arguments().clear();

            QThread::msleep(50);
        }
    })->start();
tishion commented 1 year ago

QWidget,"Unsupported QVariantType conversion: QWidget" 这个是不支持的,QT对象不能这样传递,你可以把他的指针转换成整数类型传递之后再强制转换,但这是不安全的做法,也是一种不正规的编程泛式。

另外如果是大量数据传输,不推荐使用TriggerEvent的方式,你可以换一换,通过web来主动取数据,而不是从native把数据主动推给web

xiaobingcaicai commented 1 year ago

QWidget,"Unsupported QVariantType conversion: QWidget" 这个是不支持的,QT对象不能这样传递,你可以把他的指针转换成整数类型传递之后再强制转换,但这是不安全的做法,也是一种不正规的编程泛式。

另外如果是大量数据传输,不推荐使用TriggerEvent的方式,你可以换一换,通过web来主动取数据,而不是从native把数据主动推给web

我并没有传递QWidget 相关对象的,是传递的QList参数,类型转换的时候提示的是QWidget,传递QVariantList、QList均存在异常

tishion commented 1 year ago

https://github.com/CefView/QCefView/blob/269a6ec0289e37da61a5209de0ed323681137f82/src/details/utils/ValueConvertor.cpp#L159-L167

这里不支持QList 而是支持 QVariantList