目录
不规则窗体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接收并处理用户和系统的事件,并且将他们传递给适当的窗口部件。
}