2017-09-24 99 views
1

如何用文字包裝,對齊等在QImage上繪製大綱文本?QImage上的格式化大綱文本

我試過QPainterPath::addText()方法,但它不支持自動換行和對齊。

這是我的畫現在的文字:

path.addText(rect.bottomLeft(), font, text); 
p.strokePath(path, pen); 
p.drawText(rect, flag, text); 

其中

  • p - QPainter
  • rect - 矩形包含文本
  • flag - Qt::AlignRightQt::TextWordWrap

,但它看起來像這樣

+0

你可以把你想要得到什麼的圖像。 – eyllanesc

+0

@ eyllanesc顯然輪廓應該是圍繞文本。 – dtech

回答

0

QPainter不支持這一點,同樣沒有QPainterPath。您可以使用QGraphicsScene來代替。如果您確實需要創建QImage,則始終可以使用render()函數執行此操作。

要在圖形場景中實現此效果,您需要一個QGraphicsTextItem和一個QTextCharFormat。 輪廓繪製在實際文字的頂部,對於比1更厚的任何輪廓,該輪廓看起來都是完整的廢話。因此,您必須在第一個沒有輪廓的情況下添加另一個QGraphicsTextItem

這是一個完整的運行示例。請注意,我們可以指定文本的寬度,但不是高度,你可能會通過裁剪來實現。

#include <QApplication> 
#include <QGraphicsScene> 
#include <QGraphicsTextItem> 
#include <QLabel> 
#include <QPainter> 
#include <QTextCharFormat> 
#include <QTextCursor> 
#include <QTextDocument> 

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

    QString text = "lorem ipsum dolor sit amet"; 
    QFont font("Arial", 30); 
    QRect rect(100, 100, 300, 0); 

    QImage img(500, 500, QImage::Format_RGB32); 
    img.fill(0x00ffffff); 
    { 
     QPainter p(&img); 

     QGraphicsScene scene(img.rect()); 

     QTextCharFormat charFormat; 
     charFormat.setFont(font); 
     charFormat.setTextOutline(QPen(Qt::red, 5, Qt::SolidLine)); 

     QTextDocument document; 
     QTextCursor cursor = QTextCursor(&document); 
     cursor.insertText(text, charFormat); 

     QGraphicsTextItem outlineTextItem; 
     outlineTextItem.setPos(rect.topLeft()); 
     outlineTextItem.setDocument(&document); 
     outlineTextItem.setTextWidth(rect.width()); 
     scene.addItem(&outlineTextItem); 

     QGraphicsTextItem textItem(text); 
     textItem.setPos(rect.topLeft()); 
     textItem.setTextWidth(rect.width()); 
     textItem.setFont(font); 
     scene.addItem(&textItem); 

     scene.render(&p); 
    } 

    QLabel label; 
    label.setPixmap(QPixmap::fromImage(std::move(img))); 
    label.show(); 

    return a.exec(); 
} 
+0

在您的版本中,文本可以放入矩形中,並自動選擇大小。在你的變體中,文本與QPainter.drawText不同。 我發現這個解決方案:我在緩衝區中繪製文本(使用QPainter.drawText),計算SDF並製作輪廓。 – Torvald

+0

@RuslanAkhmetshin在我看來,這個解決方案回答了你實際發佈的問題。此外,我不明白你剛剛添加你的評論的附加要求。但是,如果您確實有不同的解決方案,請發佈。 – SteakOverflow