Перетаскивание объекта вокруг QWidget в Qt - PullRequest
3 голосов
/ 04 апреля 2011

Я пытаюсь создать собственный виджет в Qt Creator, который поддерживает перетаскивание объектов вокруг. В простейшей форме виджет имеет QRect (или любую другую форму), по которому я могу щелкнуть, а затем перетащить его вокруг виджета. Как только я отпущу кнопку мыши, QRect перестанет перетаскиваться.

В моем классе QWidget у меня есть этот метод

void ImageArea::mouseMoveEvent(QMouseEvent *event)
{
    QPoint mousePos = event->pos();

    qDebug() << mousePos.x();
    qDebug() << mousePos.y();
    qDebug() << "---------";
}

, который может получить координаты мыши при перемещении указателя по экрану. Я попытался обновить переменные-члены для x и y, а затем нарисовать QRect с помощью метода paintEvent, но это не работает.

У кого-нибудь есть предложения?

Ответы [ 3 ]

2 голосов
/ 04 апреля 2011

Чтобы получить события перемещения мыши, необходимо установить для свойства QWidget :: mouseTracking значение true:

ImageArea::ImageArea( QWidget* p ) : QWidget( parent ) {
    ...
    setMouseTracking( true );
}
0 голосов
/ 04 апреля 2011

Обязательно используйте метод moveTo для перемещения прямоугольника.Установка позиции x, y напрямую может повлиять на размер прямоугольника.

Я не вижу, что вы не делаете, основываясь на вашем вопросе.Вы уверены, что прямоугольники находятся в новых позициях, когда вы рисуете их?

Возможно, вам не хватает шага обновления, который Джереми Фризнер сказал реализовать.

Кажется, вам не хватает отслеживания кнопок мыши.Самый простой способ - получить состояния кнопок мыши из QApplication :: mouseButtons ().Хотя это может быть немного менее эффективно.

0 голосов
/ 04 апреля 2011

Реализуйте paintEvent (QPaintEvent *), чтобы нарисовать объект (ы) в положениях, указанных текущим значением (значениями) их соответствующих переменных-членов.

После того, как вы изменили значения одного или несколькихПеременные-члены (в mouseMoveEvent или где-либо), вызовите this-> update ().Это скажет Qt, что ему нужно снова вызвать ваш метод paintEvent в ближайшем будущем.

Это должно быть все, что вам нужно сделать.

...