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

本文介绍如何使用Qt的QPainter类绘制动态桃心图案。通过控制定时器和坐标变化,实现了桃心从无到有的动态生成过程。此外,还介绍了Qt中实现窗口透明化的四种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在枯燥的编程生活中,有时候也需要自娱自乐,今天就利用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 );
}试验效果:绘制区域全透明。


注意--> 如果窗体没有去边框,而直接调用窗口透明,会是一片漆黑的窗体!


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值