Я подкласс 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) это удивительно, так как предполагается, что Qt тихо позаботится о сжатии многих идентичных событий в несколько, и 2) вы можете сделать это самостоятельно, ограничив вызовы update () в коде вашего слота, обрабатывающем событие ввода , (Или, так как вы создаете подкласс QLabel, где-то…?)
Увидеть http://qt-project.org/forums/viewthread/12257 для объяснения и кода.
Опять же, это может полностью лаять не на то дерево. Вот почему у нас есть кнопки downvote;)
Ваша проблема в том, что вы должны выполнять только дорогие операции, такие как рисование на растровом изображении, в пределах 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);
}