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();
}
あなたが取得したいもののイメージを置くことができます。 – eyllanesc
@eyllanesc明らかに、アウトラインはテキストの周りにあるはずです。 – dtech