无法在场景中获取QGraphicsItem的位置

时间:2014-08-30 10:16:00

标签: qt position qgraphicsitem qgraphicsscene

我想在场景中获取图形项目的位置。 但是他们的QPointF值始终保持为(0,0)。

当鼠标点击事件发生时,我正在绘画。在调试scene->items()时,我得到了

(QGraphicsItem(this =0x22edff0, parent =0x0, pos =QPointF(0, 0) , z = 0 , flags = ( ) ) )

表示场景中的每个图形项目,但内存地址不同。

这是我的 mainwindow.cpp 代码:

#include "mainwindow.h"
#include <QDebug>
MainWindow::MainWindow()
{
  scene = new QGraphicsScene;
  view = new QGraphicsView;
  view->setScene(scene);
  button = new QPushButton("Item");
  QGridLayout  *layout = new QGridLayout;
  layout->addWidget(button);
  layout->addWidget(view);
  setLayout(layout);
  connect(button, SIGNAL(clicked()), this, SLOT(createItem()));
}

void MainWindow::createItem()
{
  myEntity = new Item;
  scene->addItem(myEntity);
  count_items();
}

void MainWindow::count_items()
{
  qDebug() << scene->items().count();
  qDebug() << scene->items();
}

MainWindow::~MainWindow()
{}

这是我的 item.cpp 代码:

#include "item.h"
Item::Item()
{
  ClickFlag = true;
  PaintFlag = false;
} 
Item::~Item(){}

QRectF Item::boundingRect() const
{
  // outer most edges
  return QRectF(0,0,1450,1400);
}
void Item::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
  if(event->button()==Qt::LeftButton){
    if(ClickFlag){
        x = event->pos().x();
        y = event->pos().y();
        PaintFlag = true;
        ClickFlag = false;
       }
   }
}

void Item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                              QWidget *widget)
{
  if(PaintFlag){
    QPen paintPen;
    paintPen.setWidth(4);
    pt.setX(x);
    pt.setY(y);
    painter->setPen(paintPen);
    painter->drawPoint(x,y);
    update();              
  }
}

我似乎无法正确找到这些项目的位置。

1 个答案:

答案 0 :(得分:2)

这项任务应该以另一种方式实施。例如:

  1. 使用QGraphicsScene::addEllipse向场景中添加小椭圆(看起来像一个点)。将指针保存在类变量中。椭圆本身应位于中心,例如(-1, -1, 2, 2)
  2. 重新实现QGraphicsScene::mousePressEvent,检测鼠标点击并为椭圆项目调用setPos(或每次添加新椭圆,如果需要多个点,请立即致电setPos。)
  3. 使用QGraphicsItem::pos获取之前设置的位置。
  4. 重新实现QGraphicsItem::paint通常是过度复杂化。 Qt有很多项目类可以满足所有常见需求。只需从几何图元,像素图等构建场景