QT学习(十六)——简单绘图与手动更新窗口

    技术2022-07-10  157

    绘图函数

    paintEvent,如果在窗口内绘图,则必须在绘图函数中实现,在窗口需要重绘的时候(窗口状态改变)绘图函数自动调用.

    Qpainter p(this)是创建画家对象,this是需要绘图的设备

    也可以p->begin(this),但是要在绘图结束的时候加上p->end().

     

     

    p.drawxxx()是各种绘图工具

    1.记住要先画背景,在画其他的,否则会被背景覆盖

    2.再绘图函数中不要进行太过于复杂的数据处理,否则程序运行很慢

     

    创建画家对象

    QPainter p(this);//创建画家对象,并指定当前窗口为绘图设备

    ---------------------------------------------------------------

    贴背景图

    p.drawPixmap(0,0,width(),height(),QPixmap(":/new/prefix1/C:/Users/13764/Pictures/Saved Pictures/timg28XLAS1F.jpg"));

    ---------------------------------------------------------------

    定义画笔

    //定义画笔 QPen pen; pen.setWidth(5);//设置线的宽度 pen.setColor(Qt::red); //pen.setColor(QColor(14,9,234));RGB设置颜色 pen.setStyle(Qt::SolidLine);//设置风格

    ------------------------------------------------------------------

    记住!!把笔交给画家

    //把画笔交给画家 p.setPen(pen);

    -----------------------------------------------------------------

    画直线

    //画直线 p.drawLine(0,100,800,100); p.drawLine(100,0,100,800);

    --------------------------------------------------------------

    创建画刷对象

    //创建画刷对象 QBrush brush; brush.setColor(Qt::green);//设置颜色 brush.setStyle(Qt::CrossPattern);//设置样式

    ------------------------------------------------------------

    记住!!把画刷交给画家——创建画刷对象之后,所画的图形就是被画刷涂过的

    //把画刷交给画家 p.setBrush(brush);

    ----------------------------------------------------------

    画图形

    //画矩形 p.drawRect(200,200,100,100); //画圆 p.drawEllipse(QPoint(300,300),50,25);//QPoint放的是圆心的坐标,而50是横向的焦距,25是纵向的焦距

    ----------------------------------------------------------

    手动绘图操作——设定一个按钮,点击一下特定的图形向右滑动,划出窗口外再从另一端滑进来,调用update函数

    -----

    绘图函数中的内容

    //画笑脸 p.drawPixmap(x,400,80,80,QPixmap(":/new/prefix1/C:/Users/13764/Pictures/Saved Pictures/d900e205c0d4aee9652588a5f74720dc (1).jpg"));

    -----

    按钮的槽函数

    void Picture::newPicture() { x+=100; if(x>width()) x=0; update();//刷新窗口,它会自动的调用绘图函数paintEvent来重新绘图 //但是注意不要再paintEvent中调用否则会产生递归的调用 //它有四个参数,可以指定区域来更新,不写这四个参数的话就会直接更新整个窗口 }

    --------------------------------------------------------------------------------------------

    Update函数

    刷新窗口,它会自动的调用绘图函数paintEvent来重新绘图;

    但是注意不要再paintEvent中调用否则会产生递归的调用;

    它有四个参数,可以指定区域来更新,不写这四个参数的话就会直接更新整个窗口;

    ------------------------------------------------------------------------------------------

    整体代码

    #include "picture.h" #include "ui_picture.h" #include<QPushButton> #include<QPainter>//画家头文件 #include<QPen>//画笔头文件 #include<QBrush>//画刷头文件 Picture::Picture(QWidget *parent) : QWidget(parent) , ui(new Ui::Picture) { x=0; ui->setupUi(this); this->resize(800,800); QPushButton*an=new QPushButton(this); an->setText("刷新"); an->move(0,770); an->show(); connect(an,&QPushButton::pressed,this,&Picture::newPicture); } Picture::~Picture() { delete ui; } void Picture::paintEvent(QPaintEvent *event) { QPainter p(this);//创建画家对象,并指定当前窗口为绘图设备 //绘图操作 //p.drawxxx()是各种绘图工具 //1.记住要先画背景,在画其他的,否则会被背景覆盖 //2.再绘图函数中不要进行太过于复杂的数据处理,否则程序运行很慢 p.drawPixmap(0,0,width(),height(),QPixmap(":/new/prefix1/C:/Users/13764/Pictures/Saved Pictures/timg28XLAS1F.jpg")); //p.drawPixmap(rect(),QPixmap(":/new/prefix1/C:/Users/13764/Pictures/Saved Pictures/timg28XLAS1F.jpg"));这样写就可以直接使用rect()获取整个窗口的大小 //定义画笔 QPen pen; pen.setWidth(5);//设置线的宽度 pen.setColor(Qt::red); //pen.setColor(QColor(14,9,234));RGB设置颜色 pen.setStyle(Qt::SolidLine);//设置风格 //把画笔交给画家 p.setPen(pen); //画直线 p.drawLine(0,100,800,100); p.drawLine(100,0,100,800); //创建画刷对象 QBrush brush; brush.setColor(Qt::green);//设置颜色 brush.setStyle(Qt::CrossPattern);//设置样式 //把画刷交给画家 p.setBrush(brush); //画矩形 p.drawRect(200,200,100,100); //画圆 p.drawEllipse(QPoint(300,300),50,25);//QPoint放的是圆心的坐标,而50是横向的焦距,25是纵向的焦距 //画笑脸 p.drawPixmap(x,400,80,80,QPixmap(":/new/prefix1/C:/Users/13764/Pictures/Saved Pictures/d900e205c0d4aee9652588a5f74720dc (1).jpg")); } void Picture::newPicture() { x+=100; if(x>width()) x=0; update();//刷新窗口,它会自动的调用绘图函数paintEvent来重新绘图 //但是注意不要再paintEvent中调用否则会产生递归的调用 //它有四个参数,可以指定区域来更新,不写这四个参数的话就会直接更新整个窗口 }

    -----------------------------------------------------------------------------------------

    运行:

     

     

    点击使窗口更新

     

    Processed: 0.067, SQL: 9