【问题标题】:How to properly position a QGraphicsTextItem on a QGraphicsScene如何在 QGraphicsScene 上正确定位 QGraphicsTextItem
【发布时间】:2020-11-06 07:15:48
【问题描述】:

problelm 我正在尝试将 QGraphicsTextItem 定位在我的 QGraphicsScene 的特定位置,准确地说是在下方速度计的中心。但是我尝试过的任何东西似乎都无法正常工作。尽管我清楚地提供了我想要QGraphicsTextItem 的坐标,但它仍然锚定在左上角,如下所示: 代码的sn-p下面:

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

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

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

  2. This one 有一个很好的 sn-p,但我不想突出颜色。我只是想将文本定位在特定位置。

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

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

【问题讨论】:

    标签: c++11 qt5 qgraphicsview qgraphicsscene qgraphicstextitem


    【解决方案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 图形框架不一定很重,但它肯定会为仅渲染里程表带来相当多的开销。 您可以简单地覆盖SpeedWidget 子类中的QWidget::paint() 函数并使用QPainter 渲染所有内容。这样会轻松很多,也少很多麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-21
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 2014-11-12
      相关资源
      最近更新 更多