2015-06-03 1 views
0

Я пытаюсь создать класс BuildingTile, который имеет QGraphicsRectItem в качестве базы.Qt child QGraphicItem не использует родительскую систему координат

В этом 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::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); 
} 

ответ

1

Все ваши BuildingTile изделия ч ave их происхождение в происхождении сцены, то есть (0, 0) в координатах сцены.

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

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

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

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

Чтобы достичь того, чего вы хотите, сделайте следующее:

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