Qt дочерний QGraphicItem не использует родительскую систему координат

Я пытаюсь создать класс BuildingTile, в основе которого лежит QGraphicsRectItem.

В этом BuildingTile я пытаюсь добавить QGraphicsEllipseItems и QGraphicsSimpleTextItem, но они не используют систему координат моего BuildingTile, хотя они говорят на http://doc.qt.io/qt-5/graphicsview.html: "Координаты дочерних элементов относятся к координатам родителя. Если дочерний элемент не преобразован, разница между дочерними координатами а родительская координата совпадает с расстоянием между элементами в родительских координатах».

Я был бы очень рад, если бы кто-то мог помочь мне с этим.

http://i.imgur.com/5B0ISLD.png

Заголовок:

class BuildingTile : public QGraphicsRectItem
{

private:
    Building* m_building;

    bool m_empty;
    QGraphicsSimpleTextItem* m_name;
    QList<QGraphicsEllipseItem*> m_colonists;
public:
    BuildingTile(qreal x, qreal y, QColor color, QString name, Building* m_building = 0);

    bool isEmpty() const {return m_empty;}
    void setEmpty(bool empty) {m_empty = empty;}
    void setBuilding(Building* building) {m_building = building;}
};

Конструктор:

BuildingTile::BuildingTile(qreal x, qreal y, QColor color, QString name, Building *building) : QGraphicsRectItem(x,y,150,75)
{
    m_building = building;
    setBrush(color);
    for(int i = 0; i<3; i++)
    {
        QGraphicsEllipseItem* item = new QGraphicsEllipseItem(10+i*35, 40, 25, 25, this);
        m_colonists.append(item);
        item->setBrush(QColor(255,255,255));
    }
    m_name = new QGraphicsSimpleTextItem(name, this);
    m_name->setPos(10,10);
}

Конструктор главного окна:

MainWindow::MainWindow(QWidget *parent) : QWidget(parent)
{
    QGraphicsScene* scene = new QGraphicsScene;
    BuildingTile* item = new BuildingTile(0, 0, QColor(203,130,232), "small market");
    scene->addItem(item);
    item = new BuildingTile(150, 0, QColor(91,161,212), "indigo plant");
    scene->addItem(item);
    item = new BuildingTile(300, 0, QColor(120,113,107), "coffee roaster");
    scene->addItem(item);

    QGraphicsView* view = new QGraphicsView;
    view->setScene(scene);
    view->setAlignment(Qt::AlignTop | Qt::AlignLeft);

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(view);
    setLayout(layout);
}

person Dennis    schedule 03.06.2015    source источник


Ответы (1)


Все ваши элементы BuildingTile имеют свое начало в начале сцены, то есть (0, 0) в координатах сцены.

Например (ваш второй элемент BuildingTile):

item = new BuildingTile(150, 0, QColor(91,161,212), "indigo plant");
scene->addItem(item);

Это создает элемент BuildingTile, расположенный в (0, 0), содержащий прямоугольник, расположенный в (150,0) его собственной системы координат. Вы изменяете положение прямоугольника в его собственной системе координат, но не положение системы координат прямоугольника по отношению к его родителю (сцене).

Теперь вы создаете эллипсы и метки по отношению к системам координат BuildingTile, которые все идентичны и расположены в (0,0) в «глобальных» координатах сцены, так что вы получите координаты сцены (10, 10) для всех меток.

Чтобы добиться желаемого, выполните:

item = new BuildingTile(0, 0, QColor(91,161,212), "indigo plant");
scene->addItem(item);
item->setPos(150, 0);
person Frank Osterfeld    schedule 03.06.2015