Qt QGraphicsScene转换所选项目

时间:2012-01-08 10:34:03

标签: c++ image qt math graphics

我有一个Qt应用程序用于创建一些复合图形图片的目的。例如。用户从工具栏中选择一些图像组件,将其放在QGraphicsScene上,对其进行转换并获得利润。

问题是:如何对所选项目执行缩放轮换操作。

现在我继承了我自己的Scene课程并将此代码用于mouseMoveEvent

void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *evt)
{
    QGraphicsScene::mouseMoveEvent(evt);

    //bool isLMB = QApplication::mouseButtons() & Qt::LeftButton;

    bool isShift = QApplication::keyboardModifiers() & Qt::ShiftModifier;
    bool isCtrl = QApplication::keyboardModifiers() & Qt::ControlModifier;

    if (this->newChip)
    {
        qreal ox = this->newChip->pos().x();
        qreal oy = this->newChip->pos().y();

        qreal nx = evt->scenePos().x();
        qreal ny = evt->scenePos().y();

        qreal dx = nx - ox;
        qreal dy = ny - oy;

        qreal w = this->newChip->transform().m11() * this->newChip->boundingRect().width();
        qreal h = this->newChip->transform().m22() * this->newChip->boundingRect().height();

        qreal l = sqrt(pow((float) dx, (float) 2.f) + pow((float) dy, (float) 2.f));

        if (!isShift && !isCtrl)
        {
            this->newChip->setPos(evt->scenePos());
        }

        if (isShift)
        {
            //this->newChip->scale(fabs(w / dx), fabs(h / dy));

            qDebug() << "scale: " << dx / w << dy / h;
        }

        if (isCtrl)
        {
            //this->newChip->rotate((qreal) (acos((float) (dx / l)) * 180.f / 3.14f));

            qDebug() << "rotate: " << acos((float) (dx / l)) * 180.f / 3.14f;
        }
    }
}

但我确实想要一个更漂亮的旋转和缩放操作,就像操作选择时的任何绘画软件一样,例如:

enter image description here

P.S。:是的,我已经开始修改40000 chips演示应用程序=)

0 个答案:

没有答案