Невозможно вызвать событие обновления холста с помощью 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);
Как я могу это решить?