常见的窗体通常是各种各样方形的对话框,但有时候也需要使用非方形的对话框。如圆形、椭圆形、甚至一些不规则形状的对话框。
利用setMask()函数为窗体设置遮罩,实现不规则窗体。设置遮罩后的窗体尺寸仍是原窗体大小,只是被这照的地方不可见。
案例:
不规则窗体的实现方法。具体实现一块水晶石图形外沿形状的不规则形状对话框,也可以在不规则窗体上放置按钮等控件,可以通过鼠标左键拖拽窗体,右击鼠标关闭窗体,运行效果如下:


实现步骤如下:
(1)建立项目“ShapeWidget”,基类选择“QWidget”,类名为“widget",取消“创建界面”复选框的选中状态。
(2)不规则窗体类ShapeWidget继承QWidget类,为了使不规则窗体能够通过鼠标随意拖拽,在该类中重定义了鼠标事件函数mousePressEvent()、mouseMoveEvent()及重绘函数paintEvent()。
protected:
void mouseMoveEvent(QMouseEvent *);
void mousePressEvent(QMouseEvent *);
void paintEvent(QPaintEvent *);
private:
QPoint dragPosition;
注意添加头文件
#include <QMouseEvent>
#include <QPainter>
#include <QPixmap>
#include <QBitmap>
(3)widget.cpp的构造函数部分是实现不规则窗体的关键,具体代码如下:
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QPixmap pix;
/* 调用QPixmap的load()函数为QPixmap对象填入图象值 */
pix.load("D:/QT/QT_blog/ShapeWidget/24.png",0,Qt::AvoidDither|Qt::ThresholdAlphaDither|Qt::ThresholdDither);
resize(pix.size()); //设置主窗体的尺寸为所读取的图片的大小
setMask(QBitmap(pix.mask()));
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons()&Qt::LeftButton)
{
move(event->globalPos()-dragPosition);
event->accept();
}
}
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
dragPosition = event->globalPos()-frameGeometry().topLeft();
event->accept();
}
if(event->button() == Qt::RightButton)
{
close();
}
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawPixmap(0,0,QPixmap("D:/QT/QT_blog/ShapeWidget/24.png"));
}
Widget::~Widget()
{
}
其中,
(a)load()函数原型:
bool load(const QString& fileName, const char *format = nullptr, Qt::ImageConversionFlags flags = Qt::AutoColor);
参数fileName为图片文件名;参数format表示读取图片文件采用的格式,此处为0,表示采用默认格式;参数flags表示读取图片的方式,由Qt::ImageConversionFlags定义,此处设置的标识为避免图片抖动方式。
(b)setMask(QBitmap(pix.mask())):为调用他的控件增加一个遮罩,遮住所选区域以外的部分使其看起来是透明的,它的参数可为一个QBitmap对象或者一个QRegion对象,此处调用QPixmap的mask()函数用于获得图片自身的遮罩,为一个QBitmap对象,实例中用的是PNG格式的图片,它的透明部分实际上是一个遮罩。
使不规则窗体能够响应鼠标事件、随意拖曳的函数,是重定义的鼠标按下响应函数mousePressEvent(QMouseEvent *),首先判断按下的是否为鼠标左键。若是,则保存当前鼠标点所在的位置相对于窗体左上角的偏移值drgPosition;若按下的是鼠标石键,则关团窗体。
鼠标移动响应函数mouseMoveEvent(QMouseEvent*),首先判断当前鼠标状态,调用even->
buttons()返回鼠标的状态,若为左键则调用QWidget的move()函数将窗体移动至鼠标当前点。
由于move)函数的参数指的是窗体的左上角的位置,因此要使用鼠标当前点的位置减去相对窗
体左上角的偏移值dragPosition。
重绘函数paintEvent()主要完成在窗体上绘制图片的制作。此处为方便显示在窗体上,所绘制的是用来确定窗体外形的PNG图片。