0

我正在尝试创建一个以 QGraphicsRectItem 为基础的 BuildingTile 类。

在这个 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);
}
4

1 回答 1

1

所有 BuildingTile 项目的原点都位于场景的原点,即场景坐标中的 (0, 0)。

例如(您的第二个 BuildingTile 项目):

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

这将创建一个位于 (0, 0) 的 BuildingTile 项目,其中包含一个位于其自身坐标系 (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);
于 2015-06-03T20:39:33.270 回答