我想在场景中获取图形项目的位置。
但是他们的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();
}
}
我似乎无法正确找到这些项目的位置。
答案 0 :(得分:2)
这项任务应该以另一种方式实施。例如:
QGraphicsScene::addEllipse
向场景中添加小椭圆(看起来像一个点)。将指针保存在类变量中。椭圆本身应位于中心,例如(-1, -1, 2, 2)
。QGraphicsScene::mousePressEvent
,检测鼠标点击并为椭圆项目调用setPos
(或每次添加新椭圆,如果需要多个点,请立即致电setPos
。)QGraphicsItem::pos
获取之前设置的位置。重新实现QGraphicsItem::paint
通常是过度复杂化。 Qt有很多项目类可以满足所有常见需求。只需从几何图元,像素图等构建场景