这个不说了,qml是qt在Qt4.7推出的qt元对象语言。markdown
QZXing是对ZXing库的一个Qt外包库(Qt wrapper library),是被QRCode只是其中的一种。app
从手机摄像头拿到帧图像和实时显示,使用用了Camera
和VideoOutput
,开始实现的时候,使用了CameraCapture
,其性能不能忍受。而后我但愿能够直接从VideoOutput
中取出图片。
对QRCode的识别是一个cpu密集型运算,在UI主线程中作会出现卡顿,那能够使用QThread。
用C++来作QRCode识别,qt5以后的QML渲染机制使用了OpenGL ES,其在单独的渲染线程进行,其由QWindow完成。QML中的一个可视化元素都是QQuickItem
的一个实例。Qt为咱们提供了grabToImage
调用。异步
void Supporter::decoderVideoOutputQML(QObject *obj) { if (!m_bisGrab) { QQuickItem *item = qobject_cast<QQuickItem*>(obj); m_grabResult = item->grabToImage(); QQuickItemGrabResult * _p = m_grabResult.data(); if (_p) { connect(_p, SIGNAL(ready()),this,SLOT(grabReady())); m_bisGrab = true; } } }
VideoOutput做为参数传递进来,grabToImage
是一个异步调用,UI主线程和渲染线程。咱们引入参数m_bisGrab
来进行管理,ready信号通知这个异步的操做完成。ide
void grabReady() { m_imageQR = m_grabResult->image(); emit sig_zxingDecoderImage(m_imageQR); } //识别结果 void decoderResult(bool succ) { m_bisGrab = false; qDebug() << "qr decode" << succ; }
取出图像发送给解码线程。性能
pQZXing = new QZXing(); m_pQZXing->setDecoder(QZXing::DecoderFormat_QR_CODE); m_pDecoderThread = new QThread(this); m_bisGrab = false; m_pQZXing->moveToThread(m_pDecoderThread); m_pDecoderThread->start();
信号学习
connect(this, SIGNAL(sig_zxingDecoderImage(QImage)), m_pQZXing, SLOT(decodeImage(QImage))); connect(m_pQZXing, SIGNAL(tagFound(QString)), this,SIGNAL(sig_tag(QString))); connect(m_pQZXing, SIGNAL(decodingFinished(bool)),this,SLOT(decoderResult(bool)));
在QML我不知道怎么想到更好的办法,只能轮训。ui
Timer { id:tick_timer interval: 1000 running: false repeat: true onTriggered: { Supporter.decoderVideoOutputQML(video_output); } }
表现仍是能够接受的。this
我接触到不少基于Qt,本身重复造轮子,这个能够玩玩,学习一下实现,但是实际使用仍是要考虑,除非你以为你比Qt的开发者还要NB。spa