学无先后,达者为师

网站首页 编程语言 正文

Qt实现不规则窗体

作者:xbcdzz 更新时间: 2022-07-30 编程语言

常见的窗体通常是各种各样方形的对话框,但有时候也需要使用非方形的对话框。如圆形、椭圆形、甚至一些不规则形状的对话框。

利用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图片。
                                                                        

原文链接:https://blog.csdn.net/m0_60440984/article/details/126022703

栏目分类
最近更新