Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QGraphicsTextItem and path
Qt 6.11 is out! See what's new in the release blog

QGraphicsTextItem and path

Scheduled Pinned Locked Moved General and Desktop
3 Posts 1 Posters 2.6k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • ? Offline
    ? Offline
    A Former User
    wrote on last edited by
    #1

    I am sure this has been asked before.

    I am trying to retrieve the path outline of the text that would be contained within a QGraphicsTextItem. I do not see a method to do this in the class.

    I tried taking the text and putting it directly into a QPainterPath. This gets me close to what I need, but they don't quite line up. Below is a piece of code that shows what I am referring too.

    @QGraphicsScene *pScene = new QGraphicsScene();
    pScene->setSceneRect(-100,-100,500,500);
    QGraphicsView *pView = new QGraphicsView(pScene);

    for (int i = 0; i < 10; i++) //draw reference lines
    pScene->addLine(0, i * 10, 200, i * 10, QPen(Qt::gray));

    QGraphicsTextItem *pText = new QGraphicsTextItem();

    QFont font = pText->font();
    font.setPointSizeF(60);
    pText->setFont(font);

    pText->setDefaultTextColor(Qt::red);
    pText->setPlainText("jolly");

    pScene->addItem(pText);

    QPainterPath text;
    text.addText(pText->pos(), pText->font(), pText->toPlainText());
    QPainterPath path = pText->mapToScene(text);

    pScene->addPath(path);

    QPen penLine;
    penLine.setColor(Qt::blue);
    pScene->addRect(pText->boundingRect(), penLine);

    penLine.setColor(Qt::green);
    pScene->addRect(path.boundingRect(), penLine);

    pView->show();
    @

    What is the proper means to do this? It needs to be able to handle different fonts and sizes and matrix transformations on the QGraphicsTextItem (ie scaling, rotation, translation, etc).

    I am working with Qt 4.8 if that matters.

    Thanks in advance for any suggestions.

    1 Reply Last reply
    0
    • ? Offline
      ? Offline
      A Former User
      wrote on last edited by
      #2

      Still could use some help/suggestions with this.

      Thanks.

      1 Reply Last reply
      0
      • ? Offline
        ? Offline
        A Former User
        wrote on last edited by
        #3

        So I finally had some time to work on this some more and made a little headway on it but still have some alignment issues.

        I found that I needed to adjust my path positioning by the document margin and by the ascent of the font used to get some fonts, like the default and Brush Script MT, to align up. But other fonts, like Arial, are still off a small amount (mostly vertically). The below code should show this. Also it seems to be more pronounced on my Mac OS X Lion then on my Windows 7.

        @
        #include <QApplication>
        #include <QGraphicsScene>
        #include <QGraphicsView>
        #include <QGraphicsPathItem>
        #include <QGraphicsTextItem>
        #include <QTextDocument>

        #include <QDebug>

        int main(int argc, char *argv[])
        {
        QApplication a(argc, argv);

        QGraphicsScene *pScene = new QGraphicsScene();
        pScene->setSceneRect(0, 0, 500, 500);
        QGraphicsView *pView = new QGraphicsView(pScene);

        QPen p;
        p.setColor(QColor(100, 200, 100));

        //QFont font;
        //QFont font("Brush Script MT");
        QFont font("Arial");
        font.setPixelSize(48);

        QFontMetrics f(font);

        //create graphic text item
        QGraphicsTextItem *pText = new QGraphicsTextItem();
        pText->setFont(font);
        pText->setPlainText("testing'|~`");
        pText->setPos(100, 100);

        pScene->addItem(pText);

        qDebug() << pText->font().family();

        //create path of graphic text item
        QPainterPath path;
        path.addText(QPointF(0, 0), pText->font(), pText->toPlainText());

        //create graphic path item from path
        QGraphicsPathItem *pPath = new QGraphicsPathItem(path);
        pPath->setPen(p);
        pPath->setPos(100 + pText->document()->documentMargin(), 100 + pText->document()->documentMargin() + f.ascent());
        pScene->addItem(pPath);

        pView->show();

        return a.exec();
        }
        @

        Is there another value that I need to be applying that I am missing? Something from the font metrics or document settings/layout?

        Hope someone has some ideas. Oh I have tried Qt 4.7.4, 4.8.0, and 4.8.1 and it has been off in all of them. No, I have not tried a ton of fonts to see which ones were and were not off.

        1 Reply Last reply
        0

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved