Qpainter绘制文本

文本的绘制有两种方式:

在指定位置绘制文本,不会自动换行
    void QPainter::drawText(int x, int y, const QString &text)
    void QPainter::drawText(const QPoint &position, const QString &text)

在指定的矩形内绘制文本,设置 flags 能够实现自动换行,对齐等

    void QPainter::drawText(const QRect& rectangle,
                            int flags,
                            const QString &text,
                            QRect *boundingRect = 0)

flags 为下面的值之一或则为对其取或的结果,例如靠上剧中 Qt::AlignTop | Qt::AlignHCenter:

        Qt::AlignLeft
        Qt::AlignRight
        Qt::AlignHCenter
        Qt::AlignJustify
        Qt::AlignTop
        Qt::AlignBottom
        Qt::AlignVCenter
        Qt::AlignCenter
        Qt::TextDontClip
        Qt::TextSingleLine
        Qt::TextExpandTabs
        Qt::TextShowMnemonic
        Qt::TextWordWrap
        Qt::TextIncludeTrailingSpaces

QFont 类可以辅助设置文本的大小、粗细、字符间距等,然后使用 setFont() 来设置。
QFontInfo 类用来获取字体的信息,可以通过 fontInfo() 函数来获取。

也可以使用更多其它辅助类来实现更好的效果,比如:QTextOption、QFontMetrics。其中 QTextOption 可以对文本换行,并设置换行方式以及文本显示方向等效果。QFontMetrics 可以计算文本长度,进行特殊处理(例如:显示 …)

对齐方式

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);

    // 设置画笔颜色
    painter.setPen(QColor(0, 160, 230));

    // 绘制区域为当前界面的整个区域(居中)
    painter.drawText(rect(), Qt::AlignCenter, QStringLiteral("制区域为当前界面的整个区域(居中)"));
}

显示不全

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);

    // 设置画笔颜色
    painter.setPen(QColor(0, 160, 230));

    painter.drawText(rect(), Qt::AlignCenter, QStringLiteral("纯正开源之美,有趣、好玩、靠谱。。。"));
}

换行
当文本过长时,QTextOption 可用于换行

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);

    // 设置画笔颜色
    painter.setPen(QColor(0, 160, 230));

    QTextOption option(Qt::AlignLeft | Qt::AlignVCenter);
    option.setWrapMode(QTextOption::WordWrap);

    painter.drawText(rect(), QStringLiteral("青春不老,奋斗不止!-纯正开源之美,有趣、好玩、靠谱。。。"), option);
}

省略
如果文本过长,我们又不想换行,只想把其中一部分省略为 …,那么可以通过 QFontMetrics 来实现。

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);

    // 设置画笔颜色
    painter.setPen(QColor(0, 160, 230));

    QFontMetrics fm = painter.fontMetrics();
    QString strText = QStringLiteral("纯正开源之美,有趣、好玩、靠谱。。。");
    QString strElidedText = fm.elidedText(strText, Qt::ElideRight, 200, Qt::TextShowMnemonic);

    painter.drawText(rect(), Qt::AlignCenter, strElidedText);
}

要获取字体信息 QFontInfo,可以调用 fontInfo()。

字体QFont

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);

    QTransform transform;
    transform.rotate(45);

    // 设置画笔颜色
    painter.setPen(QColor(0, 160, 230));

    QFont font;
    font.setFamily("Microsoft YaHei");
    // 大小
    font.setPointSize(16);
    // 斜体
    font.setItalic(true);
    // 设置下划线
    font.setUnderline(true);
    // 设置上划线
    font.setOverline(true);
    // 设置字母大小写
    font.setCapitalization(QFont::SmallCaps);
    // 设置字符间距
    font.setLetterSpacing(QFont::AbsoluteSpacing, 20);

    // 使用字体
    painter.setFont(font);

    // 获取字体信息
    QFontInfo info = painter.fontInfo();
    info.family();
    info.italic();

    // 转换
    painter.setTransform(transform);

    painter.drawText(rect(), QStringLiteral("字体信息"));
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值