1

我正在对 a 进行子类化,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

4

2 回答 2

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);
}
于 2013-09-10T16:09:12.233 回答
0

如果没有看到更多代码,我不清楚,但可能是堆积了太多事件。如果是这种情况,那么 1)这是一个惊喜,因为 Qt 应该悄悄地将许多相同的事件压缩成几个,并且 2)您可以通过在处理输入事件的插槽代码中限制对 update() 的调用来自己完成. (或者,因为你是 QLabel 的子类,它会去某个地方......?)

有关解释和代码,请参见http://qt-project.org/forums/viewthread/12257 。

话又说回来,这可能完全是在叫错树。这就是我们有否决按钮的原因;)

于 2012-09-11T04:39:15.283 回答