Как добавить мышь / курсор в приложение QML для телефона без сенсорного экрана?

Это простой веб-браузер на базе Qt / QML «MeeBro» (Qt 4.7 &
QtWebKit 1.0), который состоит из нескольких файлов qml и одного файла javascript:

github.com/anssiko/webbrowser/blob/master/qml/content/WebBrowser.qml

Имеет элемент Rectangle где указан URL:

property string urlString: "http://anssiko.github.com/"

Подскажите, как добавить курсор, который можно перемещать с помощью joystik (, , , ) а можете нажимать на ссылки, нажимая на кнопку центра джойстика?

MeeBro основан на демонстрации Qt / QML: doc.qt.io/qt-4.8/qt-demos-declarative-webbrowser-example.html

Также я думаю, что эта ссылка может быть полезна: doc.qt.io/qt-4.8/qml-webview.html

1

Решение

Вы можете реализовать поддельный курсор, что-то вроде этого:

#include <QTest>
#include <QGuiApplication>

class FakeCursor : public QObject {
Q_OBJECT
Q_PROPERTY(QPoint pos READ pos WRITE setPos NOTIFY posChanged)
Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged)
enum Direction { Up = 0, Down, Left, Right };
QPoint _pos;
qreal step;
bool _visible;
signals:
void posChanged();
void visibleChanged();
public:
FakeCursor() : step(1), _visible(true) {}

void setPos(QPoint p) {
if (p != _pos) {
_pos = p;
emit posChanged();
}
}
bool visible() const { return _visible; }
QPoint pos() const { return _pos; }

public slots:
void move(int d) {
switch (d) {
case Up: _pos.ry() -= step; break;
case Down: _pos.ry() += step; break;
case Left: _pos.rx() -= step; break;
case Right: _pos.rx() += step; break;
}
emit posChanged();
}
void setStep(qreal s) { if (s) step = s; }
void toggleVisible() { _visible = !_visible; emit visibleChanged(); }
void click() {
QWindow * w = QGuiApplication::allWindows()[0];
QTest::touchEvent(w, 0).press(0, _pos, w).release(0, _pos, w);
// try this instead if the touchevent doesn't work
// QTest::mouseClick(QGuiApplication::allWindows()[0], Qt::LeftButton, Qt::NoModifier, _pos);
}
};

Затем вы создаете экземпляр и регистрируете его в QML в main():

  FakeCursor cur;
engine.rootContext()->setContextProperty("Cursor", &cur);

И тогда вы можете создать элемент курсора поверх всего в QML:

Rectangle {
width: 4
height: 4
radius: 2
color: "red"x: Cursor.pos.x
y: Cursor.pos.y
visible: Cursor.visible
}

Который вы можете контролировать с помощью Keys собственность В приведенном ниже примере он настроен на использование стрелок на клавиатуре и пробела, вы меняете их на элементы управления вашего телефона:

Item {
focus: true
Keys.onPressed: {
switch (event.key) {
case Qt.Key_Up: Cursor.move(0); break;
case Qt.Key_Down : Cursor.move(1); break;
case Qt.Key_Left: Cursor.move(2); break;
case Qt.Key_Right: Cursor.move(3); break;
case Qt.Key_Space : Cursor.click(); break;
}
}
Component.onCompleted: {
Cursor.setStep(2) // to set the speed
// Cursor.toggleVisible() // to show/hide it
// Cursor.pos = Qt.point(50,50) // to move it quickly to a needed position
}
}

Вы также должны добавить QT += testlib в файл вашего проекта. Если имитация события касания не работает, попробуйте закомментировать его и использовать закомментированное событие щелчка мыши. Возможно, вам также придется изменить некоторые классы QtQuick, потому что этот пример с Qt5, у меня нет Qt4.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector