我正在对QLabel
进行子类化,并且在用户使用鼠标拖动(或旋转)图像时尝试旋转它。 Currenty我只是在每个鼠标移动事件时顺时针旋转:
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
一样好的旋转图像。
答案 0 :(得分:0)
如果没有看到更多代码,我不清楚,但可能会有太多事件堆积起来。如果是这种情况,那么1)这是一个惊喜,因为Qt应该悄悄地将许多相同的事件压缩成几个并且2)你可以通过在处理输入事件的槽代码中限制对update()的调用来自己做。 (或者,既然你是QLabel的子类,它会某处 ...?)
有关说明和代码,请参阅http://qt-project.org/forums/viewthread/12257。
然后,这可能会完全咆哮错误的树。这就是为什么我们有downvote按钮;)
答案 1 :(得分: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);
}