不规则窗体setMask()

目录

不规则窗体setMask() 20210120

实例:

代码及详细注释如下:

【shapewidget.cpp】

【main.cpp】


不规则窗体setMask() 20210120

Qt建立的窗体大多数是方形的,有时需要圆形、椭圆形等不规则的对话框。

setMask()函数为窗体设置遮罩,实现不规则窗体。设置遮罩后的窗体尺寸依然是原窗体的大小,只是被遮罩的地方不可见。

实例:

新建:Qt Widgets Application

项目名称:ShapeWidget

类名:ShapeWidget

基类:QWidget

不选择“创建界面”

 

代码及详细注释如下:

【shapewidget.cpp】

#include "shapewidget.h"

#include <QPixmap>
#include <QBitmap>

#include <QMouseEvent>

#include <QPainter>

ShapeWidget::ShapeWidget(QWidget *parent)
    : QWidget(parent)
{
    QPixmap pix;
    pix.load("butterfly.png",0,Qt::AvoidDither | Qt::ThresholdDither |
             Qt::ThresholdAlphaDither);     //填入图像。图片放在编译路径的文件夹下(xxx-Debug)
                                            //读取图片文件的方式为避免图片抖动方式

    resize(pix.size());                     //主窗体尺寸为图片的大小

    setMask(QBitmap(pix.mask()));           //为调用它的控件增加一个遮罩,setMask()的参数为QBitmap对象或QRegion对象。QPixmap的mask()函数可用于获取图片自身的遮罩,是一个QBitmap对象

}

ShapeWidget::~ShapeWidget()
{

}

//鼠标按下函数
void ShapeWidget::MousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)       //鼠标左键按下
    {
        dragPosition = event->globalPos()-frameGeometry().topLeft();//鼠标当前位置相对窗体左上角的偏移量
        event->accept();
    }

    if(event->button() == Qt::RightButton)      //鼠标右键按下
    {
        close();                                //退出窗体
    }
}

//鼠标移动函数
void ShapeWidget::MouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons() & Qt::LeftButton)
    {
        move(event->globalPos()-dragPosition);  //move()指的是窗体左上角的位置
        event->accept();
    }
}

void ShapeWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawPixmap(0,0,QPixmap("butterfly.png"));

}

【shapewidget.h】

#ifndef SHAPEWIDGET_H
#define SHAPEWIDGET_H

#include <QWidget>

class ShapeWidget : public QWidget          //ShapeWidget类继承自QWidget类
{
    Q_OBJECT                                //Q_OBJECT是个宏。作用是启动Qt5元对象系统的一些特性(如支持信号和槽等)。它必须放在类定义的私有区中。

public:
    ShapeWidget(QWidget *parent = 0);
    ~ShapeWidget();

protected:
    void MousePressEvent(QMouseEvent *);    //使不规则窗体响应鼠标按下事件
    void MouseMoveEvent(QMouseEvent *);     //使不规则窗体响应鼠标移动事件
    void paintEvent(QPaintEvent *);         //在窗体上绘制图片

private:
    QPoint dragPosition;                    //偏移量:鼠标当前位置相对窗体左上角的偏移量
};

#endif // SHAPEWIDGET_H

【main.cpp】

#include "shapewidget.h"            //使用哪个类就必须把包含该类的头文件引用过来(*.h文件中包含了相应类的定义)
#include <QApplication>             //每个使用[Qt图形化应用程序]中都必须使用一个QApplication对象
                                    //QApplication管理各种各样的图形化应用程序的广泛资源、基本设置、控制流及事件处理等
int main(int argc, char *argv[])    //这里是应用程序的入口。几乎所有使用Qt的情况下,main()函数只需在将控制转交给Qt库之前执行初始化,然后Qt库通过事件向程序告知用户的行为。
                                    //所有Qt程序必须有且只有一个main()函数。argc是命令行变量的数量,argv是命令行变量的数组。
{
    QApplication a(argc, argv);     // a是创建的QApplication类的对象,用来处理命令行变量。所有被Qt识别的命令行参数都将从argv中移去,argc也因此减少

    ShapeWidget w;                  //创建ShapeWidget类的对象(包含该类头文件)
    w.show();                       //窗口部件可见

    return a.exec();                //main()函数将控制权交给Qt,Qt完成事件处理工作,当应用程序退出的时候,exec()函数的值就会返回。
                                    //exec()函数中,Qt接收并处理用户和系统的事件,并且将他们传递给适当的窗口部件。
}

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢奕冰2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值