zoukankan      html  css  js  c++  java
  • QT实现不规则窗体

    看到网上有很多不规则窗体的实现,效果很酷.于是使用QT也实现了一个,QT的不规则窗体实现非常简单,只需要设置一个mask(遮掩)图片,这个图片的格式可以使用png或bmp格式,我使用了png格式,默认窗体是矩形的,使用png图像,将需要隔离在窗体之外的区域的像素设置为白色或透明色,其他颜色的区域对应显示出来的窗体.关键代码就几行.

    #ifndef IRREGULARFORM_H
    #define IRREGULARFORM_H

    #include <QWidget>
    #include "ui_irregularform.h"
    #include <QBitmap>
    #include <QPixmap>
    #include <QMouseEvent>
    #include <QRect>

    class IrregularForm : public QWidget
    {
     Q_OBJECT

    public:
     IrregularForm(QWidget *parent = 0);
     ~IrregularForm();
    protected:
     void  mouseMoveEvent(QMouseEvent *event);
     void  mousePressEvent(QMouseEvent *event); 
     void  mouseReleaseEvent(QMouseEvent *event); 
    private:
     Ui::IrregularFormClass ui;
     QPoint mouseMovePos;
     
    };

    #endif // IRREGULARFORM_H

    #include "irregularform.h"

    IrregularForm::IrregularForm(QWidget *parent)
     : QWidget(parent)
    {
     setWindowFlags(Qt::FramelessWindowHint);
     QPixmap mask(":/IrregularForm/Resources/mask.png");//加载掩码图像
     setMask(QBitmap(mask.mask())); //设置窗体的掩码图像,抠除图像的白色区域实现不规则窗体
     QPalette p;//设置调色板
     p.setBrush(QPalette::Window, QBrush(mask));//将调色板的画刷设置为掩码位图,在不规则窗体上显示出掩码位图
     setPalette(p);
     mouseMovePos = QPoint(0, 0);
    }

    IrregularForm::~IrregularForm()
    {

    }

    void  IrregularForm::mouseMoveEvent(QMouseEvent *event)//鼠标按下并移动则移动不规则窗体
    {
     if(mouseMovePos != QPoint(0, 0))
     {
      move(geometry().x() + event->globalPos().x() - mouseMovePos.x(), geometry().y() + event->globalPos().y() - mouseMovePos.y());
      mouseMovePos = event->globalPos();
     }
    }

    void  IrregularForm::mousePressEvent(QMouseEvent *event)
    {
     mouseMovePos = event->globalPos();
    }

    void  IrregularForm::mouseReleaseEvent(QMouseEvent *event)
    {
     mouseMovePos = QPoint(0, 0);
    }

    效果图

    源码下载地址:http://download.csdn.net/detail/henreash/4393914

    http://blog.csdn.net/henreash/article/details/7618823

  • 相关阅读:
    前台线程与后台线程,AfxGetApp>GetMainWnd()与AfxGetMainWnd的不同 (转)
    详细解说 STL 排序(Sort) (转)
    (转)怎样从一个DLL中导出一个C++类
    HTTP协议之状态码详解(转)
    关于列表(ListCtrl)控件的界面基础知识
    C++序列化(转)
    vs2008修改Menu(菜单)资源ID的方法。
    怎样解决VC中滚动条最大滚动值不能超过32767的问题
    < Photoshop CS 专栏 >颜色(二)
    C#使用BinaryReader类读取二进制文件
  • 原文地址:https://www.cnblogs.com/findumars/p/5290138.html
Copyright © 2011-2022 走看看