Tha*_*lia 1 qt rotation selection qgraphicsitem
我想实现所选项目的轮换。
我注意到有两个函数:rotate(),它执行立即操作,但不保存项目的旋转;setRotation(),它存储rotation()(尽管它需要重绘导致事件)。
如果我选择单个项目并旋转它,我可以设置
selectedItem->setRotation(selectedItem->rotation() + deg);
Run Code Online (Sandbox Code Playgroud)
这允许该项目存储其旋转,当我需要将其复制到另一个场景时,该项目保留其旋转信息。所以这就是我所需要的。
但尝试旋转多个选定的项目,
foreach(QGraphicsItem *selectedItem, scene()->selectedItems())
{
if(selectedItem->flags() & QGraphicsItem::ItemIsMovable)
{
selectedItem->setRotation(selectedItem->rotation() + deg);
}
}
viewport()->update();
foreach(QGraphicsItem *selectedItem, scene()->selectedItems())
{
qDebug("%f", selectedItem->rotation());
}
Run Code Online (Sandbox Code Playgroud)
这会导致项目绕其自身中心旋转。要求项目围绕选择的中心旋转。其他一切都可以 - 物品将有一个可以稍后使用的轮换。(由 qDebug 显示)
要使项目围绕选择中心旋转:
我尝试过分组、旋转、取消分组。
QGraphicsItemGroup* g = scene()->createItemGroup(scene()->selectedItems());
foreach(QGraphicsItem *selectedItem, scene()->selectedItems())
{
if(!(selectedItem->flags() & QGraphicsItem::ItemIsMovable))
g->removeFromGroup(selectedItem);
}
g->setRotation(g->rotation() + deg);
scene()->destroyItemGroup(g);
viewport()->update();
foreach(QGraphicsItem *selectedItem, scene()->selectedItems())
{
qDebug("%f", selectedItem->rotation());
}
Run Code Online (Sandbox Code Playgroud)
显然,这似乎正是我想要的。
但是将项目复制到另一个场景时,项目没有旋转(它有另一个变换吗?看起来不像)。
qDebug 不显示任何内容 - 就好像项目已从选择中消失,但它们仍然显示选择矩形。(我不清除选择)
按下旋转按钮不会重复旋转。我必须取消选择每个项目,然后重新选择才能再次旋转。
另外 - 即使我删除了锁定的物品 - 它们仍然会旋转。(为什么?)
所以它不起作用。
创建变换而不是旋转...我需要将变换中心设置为选择的中心。试
QPointF origin = scene()->selectedItems().???
QPointF origin = scene()->selectionArea().???
QPointF origin = scene()->selectionArea().boundingRect().center(); // shows (0, 0)
Run Code Online (Sandbox Code Playgroud)
如果我知道中心在哪里,我可以尝试:
// hacky till i figure out
QPointF origin(0,0);
foreach(QGraphicsItem *selectedItem, scene()->selectedItems())
{
origin.setX(origin.x() + selectedItem->pos().x());
origin.setY(origin.y() + selectedItem->pos().y());
}
int selSize = scene()->selectedItems().size();
origin.setX(origin.x()/selSize);
origin.setY(origin.y()/selSize);
qDebug("%f %f", origin.x(), origin.y()); // I don't know really if this is the center
foreach(QGraphicsItem *selectedItem, scene()->selectedItems())
{
if(selectedItem->flags() & QGraphicsItem::ItemIsMovable)
{
QPointF origin1 = selectedItem->mapFromScene(origin);
selectedItem->setTransform(selectedItem->transform().
translate(origin1.x(), origin1.y()).
rotate(deg).
translate(-origin1.x(), -origin1.y()));
}
}
Run Code Online (Sandbox Code Playgroud)
很大的改进..项目作为一个组旋转...但由于某种原因在取消选择并尝试旋转单个项目后,它保留了以前的旋转中心...
我怎样才能进行这种轮换?
您需要单独旋转和移动每个项目,以便稍后可以将它们独立移动到另一个场景。您可以手动计算新的旋转和位置:
void Form2::on_rotate_clicked() {
QRectF rect;
foreach(QGraphicsItem* item, scene->selectedItems()) {
rect |= item->mapToScene(item->boundingRect()).boundingRect();
}
QPointF center = rect.center();
qreal angle = 10;
QTransform t;
t.translate(center.x(), center.y());
t.rotate(angle);
t.translate(-center.x(), -center.y());
foreach(QGraphicsItem* item, scene->selectedItems()) {
item->setPos(t.map(item->pos()));
item->setRotation(item->rotation() + angle);
}
}
Run Code Online (Sandbox Code Playgroud)