我想让图形视图中的实体可选,就像通常我们选择拖动的东西一样。拖动问题。我使用了橡皮筋功能:
ui->graphicsView->setDragMode(QGraphicsView::RubberBandDrag);
对于可选择的实体,在每个插槽中(用于绘制线,圆等的插槽)我设置了标志,但项目未被选中。 这段代码:
void MainWindow::drawCircle(){
ui->graphicsView->setScene(scene);
item2 = new circle;
scene->addItem(item2);
qDebug() << "Circle Created";
item2->setFlag(QGraphicsItem::ItemIsSelectable);
我可以做什么使实体可以选择?
答案 0 :(得分:3)
您不需要在每个插槽中调用setFlag(QGraphicsItem :: ItemIsSelectable)。 您应该在创建QGraphicsItem时使用指向对象的指针设置适当的标志: -
QGraphicsItem* pItem = new QGraphicsItem(parent);
pItem->setFlag(QGraphpicsItem::ItemIsSelectable);
或在继承的QGraphicsItem的构造函数中。
如果您使用的是继承自QGraphicsItem的项目,则需要正确定义其boundingRect函数。如果项目的形状不规则,那么您也可以覆盖形状函数。
如果操作正确,则为RubberBandDrag的documentation状态: -
将出现橡皮筋。拖动鼠标将设置橡皮筋几何形状,并选择橡皮筋覆盖的所有项目。对于非交互式视图,此模式被禁用。
此外,您似乎对如何使用QGraphicsView / QGraphicsScene系统感到困惑。 QGraphicsView可以被视为一个展望世界的窗口,即QGraphicsScene。
创建场景并将场景设置为视图一次,然后将项目添加到场景中。在此之后,您的用户将与QGraphicsView和场景交互,而不是与MainWindow交互。
MainWindow只是QGraphicsView的容器。实际上,除非QGraphicsView / scene是包含其他小部件的更大应用程序的一部分,否则根本不需要MainWindow。
当用户在QGraphicsView上单击鼠标时,可以在场景中拖动其标志设置为可选择且可移动的项目。如果您需要更多行为,可以覆盖QGraphicsView的鼠标事件(mouseMoveEvent,mousePressEvent,mouseReleaseEvent),甚至可以覆盖单个项目中的事件。