日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WebQML笔记-qml获取canvas中元素是否被按下

發布時間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebQML笔记-qml获取canvas中元素是否被按下 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以前出了幾個用QWebView,獲取html前端數據的博文,

使用QWebElement可以直接獲取html中元素的填充的值。

在此不在多提。這個是純QML獲取canvas中元素是否被按下的思路。

?

這里先演示下

程序運行截圖如下:

點擊按鈕生成兩個元素:

點一下第一個紅色矩形元素:

點一下第二個紅色矩形元素:

其原理就是qml按鈕調用web前端函數,構造出2canvas矩形。

然后web前端還提供了一個函數,這個函數用于查詢這個按鈕是否被按下,下面這個例子是使用map存儲id以及bool,判斷是否被按下。Qml中又給計時器去不停的調用這個函數,從而獲取按鈕是否被按下。

?

其qml源碼如下:

import QtQuick 2.6 import QtQuick.Window 2.2 import QtWebEngine 1.3 import QtQuick.Controls 1.4 import QtQuick.Dialogs 1.2Window {visible: truewidth: 640height: 480title: qsTr("Hello World")WebEngineView{id: web;anchors.fill: parent;url: "http://127.0.0.1:8081/";}Button{onClicked: {var functionStr = "window.mainPage.createNewBtn(10001, 100, 100)";web.runJavaScript(functionStr, function(result){console.log(">" + "window.mainPage.createNewBtn(10001, 100, 100) over");});functionStr = "window.mainPage.createNewBtn(10003, 400, 400)";web.runJavaScript(functionStr, function(result){console.log(">" + "window.mainPage.createNewBtn(10003, 400, 400) over");})}}MessageDialog {id: messageDialog}//使用定時器來判斷界面按鈕是否按下了Timer{interval: 500;repeat: true;running: true;onTriggered: {var functionStr1 = "window.mainPage.getClickedStatus(10001)";var functionStr2 = "window.mainPage.getClickedStatus(10003)";web.runJavaScript(functionStr1, function(result){//console.log(">" + String(result));if(String(result).toString().match("true")){messageDialog.title = "tip";messageDialog.text = "window.mainPage.getClickedStatus(10001)";messageDialog.visible = true;}});web.runJavaScript(functionStr2, function(result){//console.log(">" + String(result));if(String(result).toString().match("true")){messageDialog.title = "tip";messageDialog.text = "window.mainPage.getClickedStatus(10003)";messageDialog.visible = true;}})}} }

前端源碼如下:

<template><div><div id="draw-shapes"></div></div> </template><script>import "JS/two"import "JS/mouse"import {drawGraphic, createBtn, getStatus} from "JS/draw";export default {name: 'MainPage',mounted(){window.mainPage = this;drawGraphic();},methods:{createNewBtn(id, x, y){createBtn(id, x, y);return "over";},getClickedStatus(id){return getStatus(id);}},data () {return {msg: 'Welcome to Your Vue.js App'}} } </script><style scoped></style>

關鍵代碼:

腳本源碼:

;import * as Two from "JS/two"; import * as $ from "JS/jquery";let isPressed = false; let originalPositionX = 0; let originalPositionY = 0; let two; let mouse;export function drawGraphic(){let elem = document.getElementById("draw-shapes");let params = {fullscreen: true,autostart: true}two = new Two(params).appendTo(elem);mouse = new Two.ZUI(two.scene);mouse.addLimits(0.1, 10);let $stage = $(two.renderer.domElement);$stage.bind('mousewheel wheel', function(event){let e = event.originalEvent;e.stopPropagation();e.preventDefault();let dy = (e.wheelDeltaY || -e.deltaY) / 1000;mouse.zoomBy(dy, e.clientX, e.clientY);});$stage.bind('mouseup', function(event){isPressed = false;});$stage.bind('mouseout', function(event){isPressed = false;})$stage.bind('mousemove', function(event){if(isPressed){let boolX = event.clientX - originalPositionX;let boolY = event.clientY - originalPositionY;mouse.graphicMove(boolX, boolY);originalPositionX = event.clientX;originalPositionY = event.clientY;}});$stage.bind('mousedown', function(event){isPressed = true;originalPositionX = event.clientX;originalPositionY = event.clientY;});//移動端觸碰開始$stage.bind('touchstart', function (event){originalPositionX = event.changedTouches[0].pageX;originalPositionY = event.changedTouches[0].pageY;isPressed = true;});$stage.bind('touchend', function(event){isPressed = false;});$stage.bind('touchmove', function(event){let currentX = event.changedTouches[0].pageX;let currentY = event.changedTouches[0].pageY;let boolX = currentX - originalPositionX;let boolY = currentY - originalPositionY;mouse.graphicMove(boolX, boolY);originalPositionX = currentX;originalPositionY = currentY;});/*//移動端觸碰結束let text = two.makeText("Hello", 0, 0);text.size = 20;text.fill = "red";text.rotation = 90 * Math.PI / 180;//查詢let corona = makeTriangle(two, 100);corona.noStroke();corona.fill = "red";corona.translation.set(200, 200);let tip = makeTip(two, "錯誤", 'rgb(255, 255, 255)', 90);tip.translation.set(500, 500);let ellipse = two.makeEllipse(800, 800, 200, 300);ellipse.linewidth = 5;ellipse.stroke = "rgb(0, 128, 255)";*/}function makeTriangle(two, size) {let tri = two.makePath(-size / 2, 0, size / 2, 0, 0, size);return tri; }function makeTip(two, text, textColor, rotation){let group = two.makeGroup();let len = 100;let tip = two.makePath(-len / 2, -len / 3, -len / 2, -len, len / 2, -len, len / 2, -len / 3 , 0, 0 );tip.fill = 'red';tip.rotation = rotation * Math.PI / 180;group.add(tip);let txt = two.makeText(text, 0, -len / 1.8);txt.size = 20;txt.fill = textColor;group.add(txt);group.noStroke();//連文字一起旋轉//group.rotation = rotation * Math.PI / 180;return group; }let map = new Map();export function createBtn(id, x, y) {let rect = two.makeRectangle(x, y, 200, 200);rect.noStroke();rect.fill = "red";rect.myId = id;//此步驟不能少,否則two.update();map.set(id.toString(), false);$(rect._renderer.elem).click(function (e){map.set(rect.myId.toString(), true);}); }export function getStatus(id){let result = map.get(id.toString());if(result != null && result != false){map.delete(id.toString());}return result; }

關鍵代碼如下:

?

?

?

總結

以上是生活随笔為你收集整理的WebQML笔记-qml获取canvas中元素是否被按下的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。