c++ - Qt child QGraphicItem does not use parent coordinate system -
i'm trying create buildingtile class has qgraphicsrectitem base.
in buildingtile i'm trying add qgraphicsellipseitems , qgraphicssimpletextitem these not use buildingtile's coordinate system although on http://doc.qt.io/qt-5/graphicsview.html: "child coordinates relative parent's coordinates. if child untransformed, difference between child coordinate , parent coordinate same distance between items in parent coordinates."
i glad if me this.

the header:
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;} }; the constructor:
buildingtile::buildingtile(qreal x, qreal y, qcolor color, qstring name, building *building) : qgraphicsrectitem(x,y,150,75) { m_building = building; setbrush(color); for(int = 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 constructor:
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); }
all buildingtile items have origin @ scene's origin, i.e. (0, 0) in scene coordinates.
for example (your second buildingtile item):
item = new buildingtile(150, 0, qcolor(91,161,212), "indigo plant"); scene->additem(item); this creates buildingtile item located @ (0, 0), containing rectangle located @ (150,0) of own coordinate system. you're changing position of rectangle in own coordinate system, not position of rect's coordinate system in relation parent (the scene).
now create ellipses , labels in relation buildingtile coordinate systems, identical , located @ (0,0) in "global" scene coordinates, end scene coordinates (10, 10) labels.
to achieve want, do:
item = new buildingtile(0, 0, qcolor(91,161,212), "indigo plant"); scene->additem(item); item->setpos(150, 0);
Comments
Post a Comment