现在的位置: 首页 > 综合 > 正文

隐藏QT窗口边框 并且在隐藏后实现窗口拖拽 同时实现透明度

2014年03月28日 ⁄ 综合 ⁄ 共 2562字 ⁄ 字号 评论关闭

实现一个以图片边框为窗口边框的Qt程序,可以鼠标左键拖动,点击右键可以推出程序。

本程序一共三个文件,分别为shapewidget.h,shapewidget.cpp,main.cpp

自定义头文件:shapewidget.h

#ifndef SHAPEWIDGET_H

#define SHAPEWIDGET_H

#include <QtGui>

class QPoint;       //定义一个Qpoint类

class ShapeWidget : public QWidget //ShaoeWidget继承了QWidget

{

    Q_OBJECT

public:

    ShapeWidget(QWidget *parent=0);        //创建一个空内容的构造函数

protected:

    void mousePressEvent(QMouseEvent *);        //自定义一个鼠标点击事件函数

    void mouseMoveEvent(QMouseEvent *);         //自定义一个鼠标拖动事件函数

    void paintEvent(QPaintEvent *);             //自定义一个刷屏事件函数

private:

    QPoint dragPosition;        //定义一个QPoint的成员变量

};

#endif

实现文件:shapewidget.cpp

#include "shapewidget.h"

ShapeWidget::ShapeWidget(QWidget *parent)   //外部重写构造函数

        : QWidget(parent,Qt::FramelessWindowHint)   //初始化参数类型

{

    QPixmap pix;    //设置一个QPixmap的对象。

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

    resize(pix.size()); //设置窗口的尺寸为图片的尺寸

    setMask(pix.mask());   //先通过pix的方法获得图片的过滤掉透明的部分得到的图片,作为shapeWidget的不规则边框。

    setWindowOpacity(0.8);  //设置图片透明度
}

void ShapeWidget::mousePressEvent(QMouseEvent * event)

{

    if (event->button() == Qt::LeftButton) //点击左边鼠标

    {

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

         //globalPos()获取根窗口的相对路径,frameGeometry().topLeft()获取主窗口左上角的位置

         event->accept();   //鼠标事件被系统接收

    }

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

    {

         close();

    }

}

void ShapeWidget::mouseMoveEvent(QMouseEvent * event)

{

    if (event->buttons() == Qt::LeftButton) //当满足鼠标左键被点击时。

    {

         move(event->globalPos() - dragPosition);//移动窗口

         event->accept();

    }

}

void ShapeWidget::paintEvent(QPaintEvent *)

{

    QPainter painter(this);//创建一个QPainter对象

    painter.drawPixmap(0,0,QPixmap(":/images/Watermelon.png"));//绘制图片到窗口

    /*

      QPixmap(":/images/Watermelon.png")如果改为QPixmap(),则只能看到绘制出的框架,看不到图片颜色,也就是看不到图片。

    */

}

主函数:main.cpp

#include <QApplication>

#include "shapewidget.h"

int

main(int argc, char * argv[])

{

    QApplication app(argc,argv);

    ShapeWidget shape;

    shape.show();

    return app.exec();

}

1、设置窗体的背景色

在构造函数里添加代码,需要添加头文件qpalette或qgui 

QPalette pal = palette(); 

pal.setColor(QPalette::Background, QColor(0x00,0xff,0x00,0x00)); 

setPalette(pal);

通过设置窗体的背景色来实现,将背景色设置为全透。

效果:

窗口整体透明,但窗口控件不透明,QLabel控件只是字显示,控件背景色透明;

窗体客户区完全透明。

2、使用函数setAttribute(Qt::WA_TranslucentBackground, true);

同样在构造函数中,效果和第一种方法相同。

3、窗口及其上面的控件都半透明:

setWindowOpacity(0.7)

这个函数可以分10个等级调整透明度,配合QSlider控件可以做成控制条

效果:窗口及控件都半透明。

4.窗口整体不透明,局部透明:

在Paint事件中使用Clear模式绘图。

void TestWindow::paintEvent( QPaintEvent* )



QPainter p(this);

p.setCompositionMode( QPainter::CompositionMode_Clear );

p.fillRect( 10, 10, 300, 300, Qt::SolidPattern ); 



试验效果:绘制区域全透明。如果绘制区域有控件不会影响控件。

抱歉!评论已关闭.