Chinaunix首页 | 论坛 | 博客
  • 博客访问: 920521
  • 博文数量: 40
  • 博客积分: 995
  • 博客等级: 准尉
  • 技术积分: 830
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-10 11:09
个人简介

不知道自己是码农的二流码农!

文章分类

全部博文(40)

文章存档

2013年(4)

2012年(35)

2011年(1)

分类: C/C++

2012-09-10 16:36:02

Qt创建不规则窗体

文档名称

Qt创建不规则窗体

创建时间

2012-9-10

修改时间

2012-9-10

创建人

Baifx

简介(收获)

利用setMask()为窗体设置遮罩,实现不规则窗体;

设置遮罩后的窗体尺寸仍是原窗体大小,只是被遮罩的地方不可见。

本实例实现了一个以PNG图形外沿为形状的不规则对话框。

       头文件源码如下:

class ShapeWidget : public QWidget

{

       Q_OBJECT

 

public:

       ShapeWidget(QWidget *parent = 0, Qt::WFlags flags = 0);

       ~ShapeWidget();

 

protected:

       void mousePressEvent( QMouseEvent * e );

       void mouseMoveEvent( QMouseEvent * e );

       void paintEvent( QPaintEvent * e );

      

private:

       QPoint dragPosition;

};

       ShapWidget即为不规则窗体类,继承自QWidget类。在类中重定义的鼠标事件mousePressEvent()mouseMoveEvent()以及绘制函数paintEvent(),使不规则窗体能用鼠标随意拖动。

       ShapWidget的构造函数是实现不规则窗体的关键。具体代码如下:

ShapeWidget::ShapeWidget(QWidget *parent, Qt::WFlags flags)

       : QWidget(parent, flags)

{

       QPixmap pix;

       pix.load( ".//Resources//tux.png", 0, Qt::AvoidDither | Qt::ThresholdDither | Qt::ThresholdAlphaDither );

       resize( pix.size() );

       setMask( pix.mask() );

}

       QPixmapload()函数为QPixmap对象填入图像值,load()函数原型如下:

bool load( const QString & filename, const char * format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor );

       参数fileName为图片文件名;参数format表示读取图片文件采用的格式,此处为0即采用默认的格式;参数flags表示读取图片的方式,由Qt::ImageConversionFlag定义,此处设置的标识为避免图片的抖动方式。

       setMask()命令是实现不规则窗体的关键,setMask()的作用是为调用它的控件增加一个遮罩,遮住所选区域以外的部分使之看起来是透明的,它的参数可为一个QBitmap对象或一个QRegion对象,此处调用QPixmapmask()函数获得图片自身的遮罩,为一个QBitmap对象。实例中使用的是png格式的图片,它的透明部分实际上即使一个遮罩。

       重定义鼠标按下响应事件和鼠标移动响应事件,使不规则窗体能响应鼠标事件,随意拖动。具体代码如下:

void ShapeWidget::mousePressEvent( QMouseEvent * e )

{

       if ( e->button() == Qt::LeftButton )

       {

              dragPosition = e->globalPos() - frameGeometry().topLeft();

              e->accept();

       }

 

       if ( e->button() == Qt::RightButton )

       {

              close();

       }

}

       鼠标按下首先判断按下的是否为鼠标左键,是则保存当前鼠标点所在位置相对于窗体左上角的偏移值dragPosition;否则关闭窗体。

       注意:此处的frameGemetry().topLeft()仍然表示整个窗体的左上角,而并不是所见的不规则窗体的左上角。

 

void ShapeWidget::mouseMoveEvent( QMouseEvent * e )

{

       if ( e->buttons() & Qt::LeftButton )

       {

              move( e->globalPos() - dragPosition );

              e->accept();

       }

}

       在鼠标移动响应函数中,首先判断当前鼠标状态,若为左侧按钮则调用QWidgetmove()函数吧窗体移动至鼠标当前点,由于move()函数的参数指的是窗体的左上角的位置,因此要用鼠标当前点位置减去相对窗体左上角的偏移值dragPosition

 

void ShapeWidget::paintEvent( QPaintEvent * e )

{

       QPainter painter( this );

       painter.drawPixmap( 0, 0, QPixmap( ".//Resource//tux.png" ) );

}

       ShapWidget的重画函数主要完成在窗体上绘制图片的工作,此处为方便显示在窗体上绘制的即是用来确定窗体外形的PNG图片。

 

 

 

阅读(7143) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~