Qt QGraphicsScene трансформирует выбранный элемент - PullRequest
2 голосов
/ 08 января 2012

У меня есть приложение 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 =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...