Вращение QLabel с помощью мыши

Я подкласс QLabel и я пытаюсь повернуть его, когда пользователь перетаскивает (или поворачивает) изображение с помощью мыши. В настоящее время я просто вращаюсь по часовой стрелке при каждом перемещенном событии мыши:

void RotoTest::slotMouseMoved()
{
currentRotation += 1;
rotate(currentRotation % 360);
}

void RotoTest::rotate(int degree)
{
QPixmap pixmap(originalPixmap);
QPixmap rotatedMap(pixmap.size());
QPainter p(&rotatedMap);
p.translate(pixmap.size().width() / 2, pixmap.size().height() / 2);
p.rotate(degree);
p.translate(-pixmap.size().width() / 2, -pixmap.size().height() / 2);
p.drawPixmap(0, 0, pixmap);
this->setPixmap(rotatedMap);
}

Это работает и вращается, но проблема в том, что изображение становится очень медленным, нервным и не отвечает, особенно быстрее или дольше мышь перемещается для данного экземпляра. Я подозреваю, что это происходит из-за большого количества сигналов, посылаемых при движении мыши. У кого-нибудь есть какие-нибудь предложения относительно способа плавного вращения? Я ищу поворот изображения так же хорошо, как QDial делает.

1

Решение

Мне не понятно, не увидев больше кода, но, возможно, слишком много событий накапливается. Если это так, то 1) это удивительно, так как предполагается, что Qt тихо позаботится о сжатии многих идентичных событий в несколько, и 2) вы можете сделать это самостоятельно, ограничив вызовы update () в коде вашего слота, обрабатывающем событие ввода , (Или, так как вы создаете подкласс QLabel, где-то…?)

Увидеть http://qt-project.org/forums/viewthread/12257 для объяснения и кода.

Опять же, это может полностью лаять не на то дерево. Вот почему у нас есть кнопки downvote;)

0

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

Ваша проблема в том, что вы должны выполнять только дорогие операции, такие как рисование на растровом изображении, в пределах paintEvent(), Ваш slotMouseMoved() должен выглядеть так:

void slotMouseMoved() {
currentRotation = (currentRotation + 1) % 360;
update();
}

Создание растрового изображения должно быть сделано в переопределенной paintEvent(), Нет причин выводить из QLabel, просто наследовать от QWidget.

void RotoTest::paintEvent(QPaintEvent * ev)
{
QPixmap pixmap(originalPixmap);
QPainter p(this);
p.translate(pixmap.size().width() / 2, pixmap.size().height() / 2);
p.rotate(degree);
p.translate(-pixmap.size().width() / 2, -pixmap.size().height() / 2);
p.drawPixmap(0, 0, pixmap);
}
0

По вопросам рекламы [email protected]