• Qt学习10:像丝一样滑(双缓冲)


     
    void CannonField::paintEvent(QPaintEvent *e)
    {
    	// -------------------------------------
    	// QPaintEvent包含一个必须被刷新的窗口部件的区域
        // QPainter默认只能在paintEvent里面调用
    	// -------------------------------------
    	QRect cr = cannonRect();
    
    	// --------------------------------------
    	// 只要有一个象素相交,就返回true。
    	// --------------------------------------
    	if (!e->rect().intersects(cr))
    	{
            return;
    	}
    
    	QPixmap pix(cr.size());
    	//用this的背景色填充The QPoint offset 
    	//defines a point in widget coordinates 
    	//to which the pixmap's top-left pixel will be mapped to.
    	pix.fill(this, cr.topLeft());
    
    	//先绘到QPixmap上,再把QPixmap贴到this.
    	QPainter p(&pix);
    
    	//图片设为蓝色
    	p.setBrush(Qt::blue);
    	p.setPen(Qt::PenStyle::NoPen);
    
    	//这个移的是坐标系,相当于QRect在做所有的运算时,
    	//都先要offerset(-0, -pix.height()   
    	p.translate(0, pix.height());
    
    	p.drawPie(QRect(-35, -35, 70, 70), 0, 90*16);
    
    	//rotate是旋轩坐标系.顺时针方向为正,逆时针为负.
    	p.rotate(-ang);
    	p.drawRect(QRect(33, -8, 15, 8));
    	//Ends painting. Any resources used while painting are released. 
    	p.end();
    
    	//only one painter at a time
    	p.begin(this);
    	p.drawPixmap(cr.topLeft(), pix);
    }
    

    右下角绘制:

    void CannonField::paintEvent(QPaintEvent *e)
    {
    	// -------------------------------------
    	// QPaintEvent包含一个必须被刷新的窗口部件的区域
        // QPainter默认只能在paintEvent里面调用
    	// -------------------------------------
    	QRect cr = cannonRect();
    
    	// --------------------------------------
    	// 只要有一个象素相交,就返回true。
    	// --------------------------------------
    	if (!e->rect().intersects(cr))
    	{
            return;
    	}
    
    	QPixmap pix(cr.size());
    	//用this的背景色填充The QPoint offset 
    	//defines a point in widget coordinates 
    	//to which the pixmap's top-left pixel will be mapped to.
    	pix.fill(this, cr.topLeft());
    
    	//先绘到QPixmap上,再把QPixmap贴到this.
    	QPainter p(&pix);
    
    	//图片设为蓝色
    	p.setBrush(Qt::blue);
    	p.setPen(Qt::PenStyle::NoPen);
    
    	//这个移的是坐标系,相当于QRect在做所有的运算时,
    	//都先要offerset(-0, -pix.height()   
    	//p.translate(0, pix.height());
    
    	//p.drawPie(QRect(-35, -35, 70, 70), 0, 90*16);
    	p.translate(pix.width(), pix.height());
    	p.drawPie(QRect(-35, -35, 70, 70), 90*16, 90*16);
    	//p.drawRect(QRect(-35, -35, 70, 70));
    
    	//rotate是旋轩坐标系.顺时针方向为正,逆时针为负.
    	p.rotate(ang);
    	p.drawRect(QRect(-33-15, -8, 15, 8));
    	//Ends painting. Any resources used while painting are released. 
    	p.end();
    
    	//only one painter at a time
    	p.begin(this);
    	p.drawPixmap(cr.topLeft(), pix);
    }



    1.先画到临时的pix上,再一次绘出来,双缓冲

    2.drawPie的起始角度不要忘了*16,还有它是以逆时针旋转算角度的

  • 相关阅读:
    System.arraycopy
    关于验证控件和javaSript验证的共存问题
    正则表达式经典
    css的一些基础的东西
    运用JAVASCRIPT,写一个类,类名:student,他的属性:name,age,tall,他的方法:getName,getAge,getTall
    转: ASP.NET 应用程序生命周期概述
    转:关于 Global.asax 文件
    今天又要过去了,学习点东西!
    javaScript对象和属性
    转载:.NET 2005 实现在线人数统计
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693565.html
Copyright © 2020-2023  润新知