Qt 实现不规则的部件或者窗口

1、实现不规则的部件
1.1 工程目录
在这里插入图片描述
1.2 界面实现
在这里插入图片描述
1.3 widget.cpp

#include "widget.h"
#include <QPixmap>
#include <QBitmap>
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    ui->label->setFixedSize(105,74);// dog.png 图片的宽高
    QPixmap pixmap(":/images/dog.png");// dog.png 一定是没有背景(背景透明)的图片
    ui->label->setPixmap(pixmap);
    ui->label->setMask(pixmap.mask());// 为 label 部件设置遮罩
}

Widget::~Widget()
{
    delete ui;
}

1.4 图片一定是没有背景(背景透明)的图片,如下图
请添加图片描述

1.5 运行效果:标签部件显示成了图片的形状
在这里插入图片描述
2、实现不规则的窗口
2.1 工程目录
在这里插入图片描述
2.2 界面实现
在这里插入图片描述

2.3 widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    
private:
    Ui::Widget *ui;
protected:
    /**
     * @brief 在 widget 上绘制图片
     */
    void paintEvent(QPaintEvent *event) override;
    /**
     * @brief 点击 widget 关闭窗口
     */
    void mousePressEvent(QMouseEvent *event) override;
};
#endif // WIDGET_H

2.4 widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPixmap>
#include <QBitmap>
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    QPixmap pixmap(":/images/dog.png");
    /**
      因为 QWidget 不能像 QLabel 那样直接给部件添加图片,所以要使用 paintEvent 方法在 QWidget 上绘制
      **/
    this->resize(pixmap.size());// 设置窗口大小为图片大小
    this->setMask(pixmap.mask());// 为窗口设置遮罩
}

Widget::~Widget()
{
    delete ui;
}

/**
 * @brief 在 widget 上绘制图片
 */
void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawPixmap(0,0,QPixmap(":/images/dog.png"));
}

/**
 * @brief 点击 widget 关闭窗口
 */
void Widget::mousePressEvent(QMouseEvent *event)
{
    this->close();
}

2.5 运行效果:widget窗口显示成了图片的形状
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值