使用鼠标拖动旋转QLabel

时间:2012-09-11 03:48:20

标签: c++ qt qt4

我正在对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一样好的旋转图像。

2 个答案:

答案 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);
}