2017-09-24 14 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::AlignRightを、Qt::TextWordWrap

は、それがこれをサポートしていません。この

+0

あなたが取得したいもののイメージを置くことができます。 – eyllanesc

+0

@eyllanesc明らかに、アウトラインはテキストの周りにあるはずです。 – dtech

答えて

0

QPainterのように見え、どちらもQPainterPathもしません。

代わりにQGraphicsSceneを使用してください。 QImageを実際に作成する必要がある場合は、そのrender()機能を使用していつでも行うことができます。

グラフィックスシーンでこの効果を得るには、QGraphicsTextItemQTextCharFormatが必要です。 アウトラインは実際のテキストの上に塗りつぶされます。これは、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

関連する問題