(十九)QWidget显示水印

本文介绍如何使用Qt在软件主界面添加倾斜的账号信息水印。通过创建透明图片并利用QPainter绘制斜体文字,然后将该图片作为背景覆盖在主界面上,实现了安全性的增强。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候,我们可能需要在软件主界面上显示水印,例如出于安全考虑,界面上显示账号信息,看到水印就知道是谁截图了。最常用的做法就是新建一个透明的图片,在图片上显示水印,再把水印覆盖到主界面背景上。

首先,我们需要创建一个图片。考虑到一般的水印信息都是斜着的,我们考虑旋转45度的角度,如下:

#include <QPainter>
QPixmap MainWindow::setWaterMask()
{
    QPixmap pix(ui->widget->width(),ui->widget->height());
    pix.fill(Qt::white);//白色,因为我的widget没有背景,如果你有背景,请采用transparent透明色

    QPainter painter(&pix);
    QFont font;
    font.setFamily("Microsoft YaHei");                            //设置字体 微软雅黑、宋体之类的
    font.setPointSize(14);                                        //设置字体大小
    font.setItalic(true);                                         //斜体
    painter.setFont(font);
    painter.setPen(Qt::lightGray);

    painter.translate(-pix.width() / 2, pix.width() / 2);
    //painter.translate(pix.width() / 2, -pix.width() / 2);      //想反斜,请替换这两句
    //qreal ang = 45.0;                                          //想反斜,请替换这两句

    QFontMetricsF fontMetrics(font);
    QString content = "sunatmine";
    qreal font_w = fontMetrics.width(content);//字体长度
    qreal font_h = fontMetrics.height();//字体高度

    qreal ang = -45.0;

    painter.rotate(ang);
    int project_Y = abs(pix.width() * sin(ang)) + abs(pix.height() * sin(ang));//原图像Y坐标在新坐标系Y轴上的投影长度
    int project_X = abs(pix.height()*sin(ang)) + abs(pix.width()*cos(ang));//原图像x坐标在新坐标系x轴上的投影长度

    int x_step =  2*font_w; //这两个变量控制水印之间的距离
    int y_step = (3*font_h);

    int rowCount = project_Y / y_step;//水印写多少行
    int colCount = project_X / x_step + 2;//水印写多少列  因为旋转了,如果不加2会导致水印缺少一块

    for (int r = 0; r < rowCount; r++)
    {
        for (int c = 0; c < colCount; c++)
        {
           painter.drawText(x_step * c, y_step * r,content);//写水印
        }
    }
    return pix;
}

结果如下:
在这里插入图片描述

这样我们就获得了一个图片,接下来把这个图片覆盖在widget上就好:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QPalette pal;
    pal.setBrush(QPalette::Background,QBrush(QPixmap(setWaterMask())));
    this->setPalette(pal);
}

结果如下:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值