Qt child QGraphicItem不使用parent坐标系
Qt child QGraphicItem does not use parent coordinate system
我正在尝试创建一个以 QGraphicsRectItem 作为基础的 BuildingTile class。
在此 BuildingTile 中,我试图添加 QGraphicsEllipseItems 和 QGraphicsSimpleTextItem,但它们不使用我的 BuildingTile 的坐标系,尽管他们在 http://doc.qt.io/qt-5/graphicsview.html 上说:"Child coordinates are relative to the parent's coordinates. If the child is untransformed, the difference between a child coordinate and a parent coordinate is the same as the distance between the items in parent coordinates."
如果有人能帮助我,我将非常高兴。
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;}
};
构造函数:
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);
}
您所有的 BuildingTile 项目的原点都在场景的原点,即场景坐标中的 (0, 0)。
例如(您的第二个 BuildingTile 项目):
item = new BuildingTile(150, 0, QColor(91,161,212), "indigo plant");
scene->addItem(item);
这将创建一个位于 (0, 0) 的 BuildingTile 项目,其中包含一个位于其自身坐标系 (150,0) 的矩形。您正在更改矩形 在它自己的坐标系 中的位置,但不是矩形坐标系相对于其父项(场景)的位置。
现在您创建与 BuildingTile 坐标系相关的椭圆和标签,它们完全相同并且位于 "global" 场景坐标中的 (0,0),因此您最终得到场景坐标 (10, 10) 对于所有标签。
要实现你想要的,请执行:
item = new BuildingTile(0, 0, QColor(91,161,212), "indigo plant");
scene->addItem(item);
item->setPos(150, 0);
我正在尝试创建一个以 QGraphicsRectItem 作为基础的 BuildingTile class。
在此 BuildingTile 中,我试图添加 QGraphicsEllipseItems 和 QGraphicsSimpleTextItem,但它们不使用我的 BuildingTile 的坐标系,尽管他们在 http://doc.qt.io/qt-5/graphicsview.html 上说:"Child coordinates are relative to the parent's coordinates. If the child is untransformed, the difference between a child coordinate and a parent coordinate is the same as the distance between the items in parent coordinates."
如果有人能帮助我,我将非常高兴。
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;}
};
构造函数:
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);
}
您所有的 BuildingTile 项目的原点都在场景的原点,即场景坐标中的 (0, 0)。
例如(您的第二个 BuildingTile 项目):
item = new BuildingTile(150, 0, QColor(91,161,212), "indigo plant");
scene->addItem(item);
这将创建一个位于 (0, 0) 的 BuildingTile 项目,其中包含一个位于其自身坐标系 (150,0) 的矩形。您正在更改矩形 在它自己的坐标系 中的位置,但不是矩形坐标系相对于其父项(场景)的位置。
现在您创建与 BuildingTile 坐标系相关的椭圆和标签,它们完全相同并且位于 "global" 场景坐标中的 (0,0),因此您最终得到场景坐标 (10, 10) 对于所有标签。
要实现你想要的,请执行:
item = new BuildingTile(0, 0, QColor(91,161,212), "indigo plant");
scene->addItem(item);
item->setPos(150, 0);