不知道自己是码农的二流码农!
分类: 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() );
}
QPixmap的load()函数为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对象,此处调用QPixmap的mask()函数获得图片自身的遮罩,为一个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();
}
}
在鼠标移动响应函数中,首先判断当前鼠标状态,若为左侧按钮则调用QWidget的move()函数吧窗体移动至鼠标当前点,由于move()函数的参数指的是窗体的左上角的位置,因此要用鼠标当前点位置减去相对窗体左上角的偏移值dragPosition。
void ShapeWidget::paintEvent( QPaintEvent * e )
{
QPainter painter( this );
painter.drawPixmap( 0, 0, QPixmap( ".//Resource//tux.png" ) );
}
ShapWidget的重画函数主要完成在窗体上绘制图片的工作,此处为方便显示在窗体上绘制的即是用来确定窗体外形的PNG图片。