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