以前出了几个用QWebView,获取html前端数据的博文,
使用QWebElement可以直接获取html中元素的填充的值。
在此不在多提。这个是纯QML获取canvas中元素是否被按下的思路。
这里先演示下
程序运行截图如下:
点击按钮生成两个元素:
点一下第一个红色矩形元素:
点一下第二个红色矩形元素:
其原理就是qml按钮调用web前端函数,构造出2个canvas矩形。
然后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.2
-
- Window {
- visible: true
- width: 640
- height: 480
- title: 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;
- }
关键代码如下: