您的位置:首页 > 编程语言 > Qt开发

Qt利用QPainter绘制心形以及Qt设置透明窗体的四种方法

2016-10-12 22:56 806 查看
        在枯燥的编程生活中,有时候也需要自娱自乐,今天就利用Qt的QPainter绘制一颗桃心,虽然不怎么漂亮,但还是挺开心的!





 下面是绘制心形的具体实现,一起来看看吧!

#ifndef _FLOWER_H_
#define _FLOWER_H_

#include <QMainWindow>
#include <QTimer>

class CFlower : public QMainWindow
{
Q_OBJECT

public:
CFlower(QWidget *parent = 0);
~CFlower();
void init();
void initTimer();
void paintEvent(QPaintEvent *event);
private:
QTimer *timer;
QPainter *painter;
};

#endif // _FLOWER_H_
#include "flower.h"

#include <QColor>
#include <QPainter>
#include <QPixmap>

#define MAX_SIZE (173)

CFlower::CFlower(QWidget *parent)
: QMainWindow(parent)
{
initTimer();
init();
}

CFlower::~CFlower()
{

}

void CFlower::init()
{

/*设置窗体无边框*/
setWindowFlags(Qt::FramelessWindowHint);

/*	窗口整体透明,但窗口控件不透明*/
this->setAttribute(Qt::WA_TranslucentBackground,true);

this->showFullScreen();
}

void CFlower::initTimer()
{
timer=new QTimer(this);
timer->setInterval(100);
connect(timer,SIGNAL(timeout()),this,SLOT(repaint()));
}

void CFlower::paintEvent(QPaintEvent *event)
{
painter = new QPainter(this);
QPixmap pix;
int j = 0;
static int i = 0;
i += 3;
/* 这里的坐标是心形公式求出来的(来源网络), 然后自己 在加了一些一下偏移量,此处画了两颗心*/
if(i < MAX_SIZE){
timer->start();
float p = 150 *(1-sin(i*5*3.14159/360));
int x= 420 + p*cos(i*5*3.14159/360);
int y= 120- p*sin(i*5*3.14159/360);
pix.load(":/new/prefix1/img/1.png");
painter->drawPixmap(x,y,pix.width(),pix.height(),pix);
}else if(MAX_SIZE <= i && i < MAX_SIZE * 2){
timer->start();
j = i % MAX_SIZE;
float p = 150 *(1-sin(j*5*3.14159/360));
int x=320 + p*cos(j*5*3.14159/360);
int y=120- p*sin(j*5*3.14159/360);
pix.load(":/new/prefix1/img/1.png");
painter->drawPixmap(x + 350,y,pix.width(),pix.height(),pix);
}
}

#include "flower.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

CFlower w;
w.show();

return a.exec();
}


最后的效果图:这个生成的过程的动态的,一个点一个点生成的,有兴趣的朋友可以试下,我的透明窗口,截图用的桌面背景




在这个例子中我们用到了窗口的透明化,下面就来讲讲Qt的四种使窗体透明的方法:

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.fillRect( 10, 10, 300, 300, Qt::SolidPattern );
}试验效果:绘制区域全透明。

注意--> 如果窗体没有去边框,而直接调用窗口透明,会是一片漆黑的窗体!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息