Как написать такой текст с помощью 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();
}
И результат его работы:
При запуске файла возникает ошибка сегментирования (стек памяти сброшен на диск)Читал, что это может быть из-за того, что происходит утечка...
Надо было тестово собрать один проект под VS для проверки совместимости кода, в общем все собирается, но выдает следующее:
Проблема с copyВ "Task 1" все работает, но в "Task 2" после выполнения sort выводит только название группы и ссылается на
Начал изучать спринг, создал с помощью инициализатора проект и ввёл в него код-пример с этого сайтаВ итоге в проекте есть один класс: