有时候,我们可能需要在软件主界面上显示水印,例如出于安全考虑,界面上显示账号信息,看到水印就知道是谁截图了。最常用的做法就是新建一个透明的图片,在图片上显示水印,再把水印覆盖到主界面背景上。
首先,我们需要创建一个图片。考虑到一般的水印信息都是斜着的,我们考虑旋转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);
}
结果如下: