探针,我要尝试将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
到目前为止,我尝试解决的问题是:
我咨询了this post,他解释了这个想法,但是在此示例中,我不需要更改背景颜色。
This one有一个不错的摘要,但是我不打算突出显示颜色。我只是试图将文本放置在特定位置。
如果我更改io->setPos(210,240);
并给出不同的数字,我仍然会看到它锚定在左上方。
感谢您指出解决此问题的正确方向。
答案 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
呈现所有内容。这样会减轻很多麻烦,也减少很多麻烦。