crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Drag and Drop из QML
zoonman
  опции профиля:
сообщение 25.1.2011, 16:11
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 24.1.2011
Пользователь №: 2361

Спасибо сказали: 0 раз(а)




Репутация:   0  


Хочу реализовать перемещение формы и изменение ее размера путем перетаскивания.
Форма не имеет внешних элементов т.е. FramelessWindowHint.
Даже по сути формы практически нет, всего лишь QDeclarativeView.

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

В настоящее время время "форма" это просто набор элементов Rectangle.
Но хочется менять положение и размеры, т.е. базовый функционал окна.
Что почитать на эту тему?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 3)
zoonman
  опции профиля:
сообщение 28.1.2011, 11:27
Сообщение #2


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 24.1.2011
Пользователь №: 2361

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ну что же, разобрался я с перетаскиванием формы.
Как это все работает.
При нажатии на горячую область в 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
  опции профиля:
сообщение 24.3.2011, 8:01
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 24.3.2011
Пользователь №: 2534

Спасибо сказали: 1 раз(а)




Репутация:   0  


блин, и у тебя работает? А можешь показать реализацию Muse? Скока не пробовал ниче не получилось
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
d2r
  опции профиля:
сообщение 25.3.2011, 13:51
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 24.3.2011
Пользователь №: 2534

Спасибо сказали: 1 раз(а)




Репутация:   0  


Таки разобрался, два этих метода (onPressed и onReleased) объявил с макросом Q_INVOCABLE
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 6:40