如何在QGraphicsScene上正确放置QGraphicsTextItem

时间:2020-07-16 15:08:35

标签: c++11 qt5 qgraphicsview qgraphicsscene qgraphicstextitem

探针,我要尝试将QGraphicsTextItem放在我的QGraphicsScene的特定位置上,确切地说是在下面的速度计的中央。但是我尝试过的任何方法似乎都无法正常工作。尽管我明确提供了我想要的QGraphicsTextItem坐标,但它仍然锚定在左上角,如下所示: 在代码段下方:

speedwidget.cpp

SpeedWidget::SpeedWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::SpeedWidget)
{
    ui->setupUi(this);
    mScene = new Scene(this);
    ui->graphicsView->setScene(mScene);

    io = new QGraphicsTextItem;
    io->setPos(210,240);
    QFont *f = new QFont;
    f->setPointSize(18);
    io->setFont(*f);
    mScene->addText("Odometer :")->setDefaultTextColor(Qt::red);
    mScene->addItem(io);
}

speedwidget.h

class SpeedWidget : public QWidget
{
    Q_OBJECT
public:
    SpeedWidget(QWidget *parent = nullptr);
    ~SpeedWidget();

private:
    Ui::SpeedWidget *ui;
    Scene *mScene;
    QGraphicsTextItem *io;

};
#endif // SPEEDWIDGET_H

item

到目前为止,我尝试解决的问题是:

  1. 我咨询了this post,他解释了这个想法,但是在此示例中,我不需要更改背景颜色。

  2. This one有一个不错的摘要,但是我不打算突出显示颜色。我只是试图将文本放置在特定位置。

  3. 如果我更改io->setPos(210,240);并给出不同的数字,我仍然会看到它锚定在左上方。

感谢您指出解决此问题的正确方向。

1 个答案:

答案 0 :(得分:1)

Qt Graphics View框架实现了父子机制。只需使您的QGraphicsTextItem成为里程表的拨号项的子项即可。从那时起,您的文本标签的位置将相对于表盘之一:

io = new QGraphicsTextItem(this);

// Position text item so that it's centered on the dial
...

此外,请注意以下这一行:

mScene->addText("Odometer :")->setDefaultTextColor(Qt::red);

表示您创建了另一个文本项。返回指向新创建的项目的指针。要么使用并保留一个,要么使用您通过new表达式显式创建的那个。

此外,您可能想重新考虑对一个简单的“小部件”使用QGraphicsScene的选择。尽管Qt图形框架不一定很沉重,但仅渲染里程表肯定会带来很多开销。 您可以简单地覆盖QWidget::paint()子类中的SpeedWidget函数,并使用QPainter呈现所有内容。这样会减轻很多麻烦,也减少很多麻烦。