Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Drag and Drop из QML
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Quick
zoonman
Хочу реализовать перемещение формы и изменение ее размера путем перетаскивания.
Форма не имеет внешних элементов т.е. FramelessWindowHint.
Даже по сути формы практически нет, всего лишь QDeclarativeView.

С Qt пока только начал разбираться, а с QML вообще 3-й день)

В настоящее время время "форма" это просто набор элементов Rectangle.
Но хочется менять положение и размеры, т.е. базовый функционал окна.
Что почитать на эту тему?
zoonman
Ну что же, разобрался я с перетаскиванием формы.
Как это все работает.
При нажатии на горячую область в 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);

Без задания контекста внешние методы вызваны не будут.

d2r
блин, и у тебя работает? А можешь показать реализацию Muse? Скока не пробовал ниче не получилось
d2r
Таки разобрался, два этих метода (onPressed и onReleased) объявил с макросом Q_INVOCABLE
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.