how to handle two key events at the same time

qml

Solution

You should use Timer and Keys.onReleased

Here is an example that you can adapt to your needs :

property var robot1Event: {"rotation":false,
                            "move":false};
property var robot2Event: {"rotation":false,
                            "move":false};

Keys.onPressed: {
    if (event.key === Qt.Key_Left) { robot1Event["rotation"] = true; }
    if (event.key === Qt.Key_Up)   { robot1Event["move"]     = true; }
    if (event.key === Qt.Key_A)    { robot2Event["rotation"] = true; }
    if (event.key === Qt.Key_W)    { robot2Event["move"]     = true; }
}
Keys.onReleased: {
    if (event.key === Qt.Key_Left) { robot1Event["rotation"] = false; }
    if (event.key === Qt.Key_Up)   { robot1Event["move"]     = false; }
    if (event.key === Qt.Key_A)    { robot2Event["rotation"] = false; }
    if (event.key === Qt.Key_W)    { robot2Event["move"]     = false; }
}

Timer {
    interval: 50;
    running: true;
    repeat: true;
    onTriggered: {
        var rotation = function (robot) { robot.rotation = (robot.rotation - 5) % 360; }
        var move = function (robot) {
            robot.x = robot.x + robot.speedForward * Math.sin(Math.PI * robot.rotation / 180);
            robot.y = robot.y - robot.speedForward * Math.cos(Math.PI * robot.rotation / 180);
        }

        var robot = repeater.itemAt(0);
        if (robot1Event["rotation"]) { rotation(robot); }
        if (robot1Event["move"]) { move(robot); }

        robot = repeater.itemAt(1);
        if (robot2Event["rotation"]) { rotation(robot); }
        if (robot2Event["move"]) { move(robot); }
    }
}

Problem

i'm trying to create a simulation of game between two players. i want to make them move via the keyboard, by the Keys.onPressed property of the root rectangle, but i've ran into a problem that the both players can't get orders simultaneously, because only one key event is captured.. here is the code: ``` Rectangle { id: root height: 1000; width: 1000 Row { spacing: 100 x: 350 Repeater { id: repeater model: 2 Rectangle { width: 50 height: 100 y:500 color: "blue" property int speedForward: 5 property int speedBackward: 3 Rectangle { height: 10; width: 10 x: 20 color: "red" } } } } Keys.onPressed: { var robot = (event.key > 100) ? repeater.itemAt(0) : repeater.itemAt(1) if((event.key === 16777234) || (event.key === 65)) { robot.rotation = (robot.rotation - 5) % 360; } if((event.key === 16777236) || (event.key === 68)) { robot.rotation = (robot.rotation + 5) % 360; } if((event.key === 16777235) || (event.key === 87)) { robot.x = robot.x + robot.speedForward * Math.sin(Math.PI * robot.rotation / 180); robot.y = robot.y - robot.speedForward * Math.cos(Math.PI * robot.rotation / 180); } if((event.key === 16777237) || (event.key === 83)) { robot.x = robot.x - robot.speedForward * Math.sin(Math.PI * robot.rotation / 180); robot.y = robot.y + robot.speedForward * Math.cos(Math.PI * robot.rotation / 180); } } focus: true } ``` any ideas?

Original source