需求描述:两张图片,一张作为背景,另一张半透明,作为前景。透过前景可以看到背景图
1、用QPixmap对象载入背景图片,或者用paint代码在QPixmap自己画图;把QPixmap放入QLabel中显示;
2、用QPixmap对象载入半透明图片,或者用paint代码在QPixmap自己画半透明的图;把把QPixmap放入QLabel中显示;
3、把这两个label重叠,即可看到效果。
注意:
1、自己在QPixmap绘制半透明图片时,首先要使用fill函数将其整张Pixmap填充为透明。根据manual的要求,在paint有效时,fill函数是无效的,所以,要想使用fill,要么别在paint有效期间,要么执行paint.end()之后再fill。见示例代码
2、在本例中,label作为Pixmap的容器,label的如果设置了背景色,而Pixmap又是半透明时,透过Pixmap可以看到label的背景色(实质是Pixmap和label背景色的叠加)
使用样式表设置label半透明背景的代码:
border:2px solid;/*黑色实线边框,2px宽*/ border-color: black; color:blue;/*蓝色文字*/ background-color: rgba(255, 0, 0, 100);/*红色半透明*/
代码:
#include <QPainter> #include <QPen> #include <QFile> #include <QMessageBox> #include <qDebug> #include <QColor> #include <QBrush> #define WIDTH 300 #define HEIGHT 300 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); pPixmap = new QPixmap(WIDTH,HEIGHT); //pPixmapFront = new QPixmap("front.png");//加载半透明图片 pPixmapFront = new QPixmap(WIDTH,HEIGHT); //pPixmapFront->fill(Qt::transparent);//填充为透明 ui->label_back->setScaledContents(true);//内容自适应label的大小,这样调整lable的大小就可以调整图片的大小 ui->label_front->setScaledContents(true);//内容自适应label的大小,这样调整lable的大小就可以调整图片的大小 } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { QPainter painter(pPixmap); // 创建QPainter对象 QPoint point(100,100);//x, y QPen pen; painter.setBrush(Qt::cyan); painter.setPen(Qt::red); painter.drawRect(0, 0, WIDTH, HEIGHT);//红色边框,青色填充 painter.setBrush(Qt::NoBrush); painter.setPen(Qt::red); painter.drawRect(0, 0, WIDTH/2, HEIGHT/2);//红色边框,无填充 pen.setColor(Qt::red); pen.setWidth(20); painter.setPen(pen); painter.drawPoint(point);//用粗笔画点 ui->label_back->setPixmap(*pPixmap); } void MainWindow::on_pushButton_paintFront_clicked() { QPainter painter(pPixmapFront); // 创建QPainter对象 QColor color; QPen pen; painter.end();//使fill函数生效 pPixmapFront->fill(Qt::transparent);//透明填充Pixmap,清空pixmap painter.begin(pPixmapFront); color.setRgb(0, 0, 255, 100);//蓝色半透明 painter.setPen(color);//设置笔和笔的颜色 painter.setBrush(color);//设置刷子和刷子颜色 painter.drawRect(0, 0, WIDTH, HEIGHT/2);//画蓝色半透明矩形 pen.setColor(Qt::green); pen.setWidth(3); painter.setPen(pen);//设置笔和笔的颜色 painter.drawLine(0,0,WIDTH, HEIGHT);//画一条绿色斜线col1,row1,col2,row2 ui->label_front->setPixmap(*pPixmapFront); }