QT 使用label实现顶层水印

方法一:(可能会被覆盖)

效果图如下:
水印内容为:sunatmine
在这里插入图片描述
在这里插入图片描述

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_qt_test.h"
#include <QPainter>
class qt_test : public QMainWindow
{
    Q_OBJECT

public:
    qt_test(QWidget *parent = Q_NULLPTR);
	QPixmap setWaterMask();
private:
    Ui::qt_testClass ui;
};

#include "qt_test.h"

qt_test::qt_test(QWidget *parent)
    : QMainWindow(parent)
{

    ui.setupUi(this);
	QImage _image;
	_image.load("C:/Users/zhou/Desktop/Mpeg2decoder/2.jpg");
	setAutoFillBackground(true);   // 这个属性一定要设置
	QPalette pal(palette());
	pal.setBrush(QPalette::Window, QBrush(_image.scaled(size(), Qt::IgnoreAspectRatio,
		Qt::SmoothTransformation)));
	this->setPalette(pal);

	QLabel* label = new QLabel;
	label->setParent(ui.widget);
	label->resize(500,500);
	label->setText("######################################");
	label->raise();//置于顶层
	label->setScaledContents(true);
	QImage _image2;
	_image2.load("C:/Users/zhou/Desktop/Mpeg2decoder/1.png");//1.png由setWaterMask()生成
	label->setPixmap(QPixmap::fromImage(_image2));
	label->show();

}

QPixmap qt_test::setWaterMask()
{
	QPixmap pix(500, 500);
	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;
}

方法二:(绝对不会被覆盖)

需要精确label的位置

QLabel* pushb1 = new QLabel;
pushb1->setStyleSheet("background:transparent");
pushb1->setAttribute(Qt::WA_TranslucentBackground);
pushb1->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::CustomizeWindowHint | Qt::Tool | Qt::FramelessWindowHint);
pushb1->setText("background:transparent,background:transparent,background:transparent");
pushb1->setGeometry(100,100,100,100);//精确label的位置
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值