按类型转换时获取子类化的qgraphicsitem坐标

时间:2019-04-01 11:51:37

标签: qt qgraphicsscene qgraphicsitem

我有一个qgraphicsitem的子类来创建一组项目,这些项目将进入另一个子类并进入一个子类化场景。

当通过子类进行转换时,我可以使用良好的场景坐标获得项目,但是使用item-> setPos(); item.pos()=(0,0)或错误的位置

1)在这里,我得到了项目坐标,但是添加时位置错误。 2)在这里,我得到了物料坐标=(0,0),但是物料处于良好的位置。

void addExtChordseistris()
{
QPoint p = QCursor::pos();
for(QGraphicsView *view: views()){
    QWidget *viewport = view->viewport();
    QRect vr = viewport->rect();
    QPoint vp = viewport->mapFromGlobal(p);
    if(vr.contains(vp)){
        QPointF sp = view->mapToScene(vp);
        chord *itemdos = new chord();
        addItem(itemdos);
        itemdos->addchorddos(sp);
        itemdos->setPos(sp); // -> using this or not
    }
    }
}

这就是给我pos。()=(0,0)。

void debugSceneItemscuatro()
{
    QList<QGraphicsItem *> allitems = items();
        foreach(auto item, allitems) {
            if(item->type() == chord::Type){
                qDebug() << item->pos();
            }
        }
}

这是添加项目的方式:

#include "chord.h"
#include "note.h"

chord::chord()
{
    Pressed = false;
    setFlag(ItemIsMovable);
//    QList<QGraphicsItem> coso;
}

QRectF chord::boundingRect() const
{
    // outer most edges
    return QRectF(0,0,100,100);
}

void chord::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QRectF rect = boundingRect();

    if(Pressed)
    {
        QPen pen(Qt::red, 3);
        painter->setPen(pen);
//        painter->drawEllipse(rect);
    }
    else
    {
        QPen pen(Qt::black, 3);
        painter->setPen(pen);
//        painter->drawRect(rect);
    }
}

//[1] Add chord
void chord::addchord(QPointF sp)
{
//    scene()->addLine(sp.x(), sp.y(), sp.x()+10, sp.y()+10);
    auto *line = scene()->addLine(sp.x(), sp.y(), sp.x() + 10, sp.y() + 10);
    line->setParentItem(this);
        QList<int> midics = {10, 30, 40};
      for(int i = 0; i < midics.length(); i++)
          {
        QGraphicsSimpleTextItem *item = new QGraphicsSimpleTextItem("n", this);
        item->setFont(QFont("omheads", 20));
        item->setPos(sp.x(), sp.y()+midics[i]);
//        scene()->addItem(item);
        coso.append(item);
      }
}
//[1] Add chord
void chord::addchorddos(QPointF sp)
{
//    scene()->addLine(sp.x(), sp.y(), sp.x()+10, sp.y()+10);

    auto *line = scene()->addLine(sp.x(), sp.y(), sp.x() + 10, sp.y() + 10);
    line->setParentItem(this);
        QList<int> midics = {0, 10, 30, 40};
      for(int i = 0; i < midics.length(); i++)
          {
        note *item = new note();
        item->setParentItem(this);
        QPointF ssp = {sp.x(), sp.y()+midics[i]};
        item->addnote(ssp);
//        item->setPos(sp.x(), sp.y()+midics[i]);
//        scene()->addItem(item);
//        coso.append(item);
      }
}
//void chord::getobjects(QGraphicsItem item)
//{
//    return coso;
//}
QList<QGraphicsItem*> chord::retrievedata() const
{
     return coso;
}

void chord::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    Pressed = true;
    update();
    QGraphicsItem::mousePressEvent(event);
}

void chord::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
    Pressed = false;
    update();
    QGraphicsItem::mouseReleaseEvent(event);
}

另一个子类,..

无效注释:: addnote(QPointF ssp) {

    QGraphicsSimpleTextItem *item = new QGraphicsSimpleTextItem("n", this);
    item->setFont(QFont("omheads", 20));
    item->setPos(ssp.x(), ssp.y());

}

谢谢,...也许我做错了方法,感谢您的任何想法,解决方案...! :-)

0 个答案:

没有答案