Невозможно вызвать событие обновления холста с помощью Javascript в QWebChannel

Код ниже отправляет данные из Qt C++ в JavaScript через QWebChannel для рисования на «холсте». Данные передаются с правильным значением, но событие перерисовки холста не происходит.

Если я вызову функцию drawCanvas в том же файле JavaScript, я смогу выполнить все действия. Однако при вызове функции JavaScript в C++ холст не перерисовывается.

      // js
function drawCanvas(imageData){        
    console.error("data "+value);
    var canvas = document.getElementById("myCanvas");
    var context = canvas.getContext("2d");

    context.fillStyle = "yellow";
    context.fillRect(0, 0, canvas.width, canvas.height);
    context.font="48px serif";
    context.fillStyle = "black";
    context.fillText("Text "+imageData, 10, 50);

    if(imageData.length > 0 ){
        console.error("Image Data Length: " + (imageData ? imageData.length : "Undefined"));
    }

}

var i = 0;
window.addEventListener('resize', function(){        
    drawCanvas(++i);
});

С картинками это объясняется следующим образом:

Когда вы вызываете функцию в , выполняется следующий код, подтверждено, что это правильное значение:

      function drawCanvas(imageData){        
    console.error("data "+value);  << result: data 12323423  // correct value

Я позвонил вdrawCanvasуспешно функционировать вbackground.cpp, но почему нетfillText()бегать?

Это то, что я пробовал:

      // header
class CBackground
{
private:
    _BACKGROUNDHEADER_ m_bkgndHeader;

    static QWebEngineView* s_webView;
    static QWebChannel* m_webChannel;

    QString htmlPath = QFileInfo(__FILE__).dir().absolutePath() + "/canvas.html";

    ...
public: 
    onDraw();
    ....
}

// .cpp

bool CBackground::onDraw()
{
   if(!m_pBkgndImage->isNull()){

        if (m_pBkgndImage->colorSpace().isValid()){
            m_pBkgndImage->convertToColorSpace(QColorSpace::SRgb);
        }

        QPoint point(0,0);
        point.rx() = m_bkgndHeader.Left;
        point.ry() = m_bkgndHeader.Top;

        QVariant imageVariant = QVariant::fromValue(*m_pBkgndImage);

        imageObject = new QObject();
        imageObject->setProperty("imageData", imageVariant);

        m_webChannel->registerObject("imageObject", imageObject);

        int imageSizeInBytes = m_pBkgndImage->bytesPerLine() * m_pBkgndImage->height();

        QByteArray imageDataArray(reinterpret_cast<const char*>(m_pBkgndImage->bits()), imageSizeInBytes);

        **QString jsCode = QString("drawCanvas('%1');").arg(imageDataArray.size());
        // s_webView is static variable 
        s_webView->page()->runJavaScript(jsCode);**

        if(!m_pBkgndImage->isNull()){
            delete m_pBkgndImage;
            m_pBkgndImage = nullptr;
        }
      
        m_webChannel->deregisterObject(imageObject);
        imageObject->deleteLater();

        return true;

    } else {
        QMessageBox::information(nullptr, "Drawing Image", "Failed 412");
        return false;
    }

    return false;
}

 // canvas.html
  function drawCanvas(imageData){        
        console.error("data "+value);
        var canvas = document.getElementById("myCanvas");
        var context = canvas.getContext("2d");

        context.fillStyle = "yellow";
        context.fillRect(0, 0, canvas.width, canvas.height);
        context.font="48px serif";
        context.fillStyle = "black";
        context.fillText("Text "+imageData, 10, 50);

        if(imageData.length > 0 ){
            console.error("Image Data Length: " + (imageData ? imageData.length : "Undefined"));
        }

    }
    
    window.addEventListener('resize', drawCanvas);

Как я могу это решить?

0 ответов

Другие вопросы по тегам