Ну что же, разобрался я с перетаскиванием формы.
Как это все работает. При нажатии на горячую область в QML вызывается внешний обработчик, в который передаются относительные координаты мыши внутри окна.
По сути наступает событие начинаю перетаскивание. При этом во внутренних переменных сохраняется текущее положение курсора.
После этого запускается таймер, который будет работать и выдавать сигнал перемещения формы.
Внутри обработчика этого сигнала находится код, который говорит о том, куда переместить форму.
В моем случае сделано очень примитивно, но рекомендуется проверять, будет ли изменено положение формы, чтобы не вызывать метод move() лишний раз.
Как только пользователь отпускает кнопку, срабатывает соответствующий вызов в QML, оттуда он транслируется в программу-контейнер, которая останавливает таймер, тем самым прекращая перемещение.
Как это реализовано. Я использовал события onPressed и onReleased для объекта MouseArea.
MouseArea {
anchors.fill: parent
onPressed:{
Muse.onPressed(parent.x + mouse.x,parent.y + mouse.y)
}
onReleased:{
Muse.onReleased()
}
}
Из них я вызывал публичные методы созданного мной класса.
В onPressed я поместил вызов
void Muse::onPressed(int mouse_x, int mouse_y) {
this->rel_x = mouse_x;
this->rel_y = mouse_y;
timer->start();
timer->setInterval(50);
};
А в onReleased
void Muse::onReleased() {
timer->stop();
};
Кстати, конструктор объекта представлен следующим образом
this->rel_x = 0;
this->rel_y = 0;
this->timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(moveForm()));
И сам метод перемещения формы
void Muse::moveForm() {
QWidget *qw = qobject_cast<QWidget *>(this->parent());
qw->move(QCursor::pos().x() - this->rel_x,QCursor::pos().y() - this->rel_y);
};
И под конец сама инициализация объекта в main.cpp
Muse *m_obj = new Muse(view);
view->rootContext()->setContextProperty("Muse",m_obj);
Без задания контекста внешние методы вызваны не будут.