Как написать такой текст с помощью QPainter, чтобы текст изнутри был прозрачным?
Сам QPainter не поддерживает непосредственное рисование контура текста. Однако вы можете создать этот контур отдельно, с помощью QPainterPath::addText().
То есть для получения текста без заливки надо:
Векторизовать его:
QPainterPath outline_text;
outline_text.addText(положение, шрифт, текст);
И затем отрисовать:
QPainter painter(this);
painter.strokePath(outline_text, перо);
Вот минимальный демонстрационный пример:
#include <QApplication>
#include <QBrush>
#include <QFont>
#include <QPalette>
#include <QPen>
#include <QPainter>
#include <QPaintEvent>
#include <QPainterPath>
#include <QWidget>
/* ************* */
class Canvas : public QWidget {
public:
Canvas();
protected:
void paintEvent(QPaintEvent *event);
private:
QPainterPath outline_text;
QPen outline_pen;
QRect outline_bounds;
};
/* ************* */
Canvas::Canvas()
: outline_pen(Qt::lightGray, 2)
{
// "Запекаем" контур надписи в экземпляр QPainterPath. И да, текст мы размещаем
// в начале координат, так как всё равно потом будем динамически перемещать его
// в центр окна
QFont outline_font(QLatin1String("serif"), 64);
outline_text.addText(QPoint(), outline_font, QLatin1String("Hello, World"));
// Сохраняем описывающий прямоугольник для дальнейшего центрирования надписи
outline_bounds = outline_text.controlPointRect().toRect();
// Устанавливаем белый цвет фона
QPalette pal(palette());
pal.setColor(QPalette::Background, Qt::white);
setPalette(pal);
}
void Canvas::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// Перемещаем надпись в центр окна
const QPoint outline_center = outline_bounds.center();
const QPoint canvas_center = rect().center();
painter.translate(canvas_center - outline_center);
// Рисуем контур
painter.strokePath(outline_text, outline_pen);
event->accept();
}
/* ************* */
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Canvas canvas;
canvas.show();
return app.exec();
}
И результат его работы:
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости