0

的问题是我试图将 aQGraphicsTextItem定位在我的特定位置,QGraphicsScene准确地说是在下面速度计的中心。但我尝试过的一切似乎都无法正常工作。尽管我清楚地提供了我想要的坐标QGraphicsTextItem,但它仍然锚定在左上角,如下所示: 在代码片段下方:

速度小部件.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);
}

速度小工具.h

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

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

};
#endif // SPEEDWIDGET_H

物品

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

  1. 我查阅了这篇解释了这个想法的帖子,但在这个例子中我不需要更改背景颜色。

  2. 这个有一个很好的片段,但我不想突出颜色。我只是想将文本定位在特定位置。

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

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

4

1 回答 1

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. 这样会轻松很多,也少很多麻烦。

于 2020-07-16T15:13:25.457 回答