轮播文字! QPainter paintEvent()笔记规范

今天逐渐学会使用QThelp来查类的使用;比如drawText的使用方法,是重载类,第一种是老师说的,后面一种是自己写的;

函数重载和函数重写:函数重载(overload)和函数重写(override)的基本规则_inter_peng的博客-CSDN博客_函数重0写h

 轮播文字项目widget.h中:函数声明后面为什么加override ?

    //后面override是为了说明painEvent是为了重写父类QWidget的虚函数;
    void paintEvent(QPaintEvent *event) override;

为了防止重写父类中的虚函数时出错;参考自:

C++:override和final - whlook - 博客园1. override 重载 当你在父类中使用了虚函数时候,你可能需要在某个子类中对这个虚函数进行重写,以下方法都可以: 如果不使用override,当你手一抖,将foo()写成了f00()会怎么样呢https://www.cnblogs.com/whlook/p/6501918.html

重点: 

paintEvent(QPaintEvent *event)不需要调用,当界面初始化或者需要刷新时才会执行的事件,也就是说绘图事件在构造对象实例化时会执行,需要刷新界面我们可以使用 update()方法执行 paintEvent()事件)。

以后记笔记,可以像下面这样,将步骤写出来,方便代码阅读; 

QPainter基本用法:

  1. 重写绘图事件: void paintevent()
  2. 实例化一个画家QPainter painter(this); this 指绘图设备;
  3. 设置画笔QPen pen,设置画笔宽度、风格;
  4. 设置画刷QBrush bursh,设置画刷风格;
  5. 画线,画矩形,文字; 

高级设置:

1、设置渲染效果:抗锯齿,画的更清晰;​​​​​​​​​​​​​​

painter.setRenderHint(QPainter::Antialiasing);

2、移动画家

 painter.translate(100,0);

保存状态:save

还原状态:restore

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    //未使用的宏定义;
    Q_UNUSED(event);
    //实例化画家,this 指定绘图设备;
    QPainter painter(this);


    //设置一个画笔;
     QPen pen;
     pen.setWidth(5);//画笔粗细
     pen.setColor(QColor(200,100,50));//画笔颜色;

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

    //多边形;
    QPolygon polygon;
    polygon.setPoints(3,20,20,100,20,100,100);
    //画三角形;
    painter.drawPolygon(polygon);
    //画直线;
    painter.drawLine(QPoint(150,150),QPoint(300,150));
    //画椭圆;
    painter.drawEllipse(QPoint(200,200),100,50);
    //画文字;
    painter.drawText(200,200,"attilitude is everything");
    painter.drawText(QRectF(100,100,200,200),Qt::AlignHCenter,"念念不忘必有回响");//水平居中;
    //画路径;
    QPainterPath path;
    path.moveTo(20, 80);
    path.lineTo(20, 30);
    path.cubicTo(80, 0, 50, 50, 80, 80);

    painter.drawPath(path);
///高级设置/
 //设置渲染效果:抗锯齿,画的更清晰;
    painter.setRenderHint(QPainter::Antialiasing);
    //画矩形;
    painter.drawRect(10,10,100,100);
    //移动画家;把画家抱起来移动位置;
    painter.translate(100,0);
    //保存画家状态;
    painter.save();
    //这样就不会和上一个画家重叠;
    painter.drawRect(10,10,100,100);
    //移动画家
    painter.translate(100,0);
    //还原状态;
    painter.restore();
    //这样会和上一个画家重叠;
    painter.drawRect(10,10,100,100);
}

利用画家 画资源图片:

painter.drawPixmap(0,0,QPixmap(​​​​​​​(":/images/cd.png"));

​​​​​​​轮播文字:

通过计时器来偏移文本的左边框实现文字滑动;

widget.h 

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPainter>
#include <QTimer>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    //后面override是为了说明painEvent是为了重写父类QWidget的虚函数;
    void paintEvent(QPaintEvent *event) override;
    
private:
    Ui::Widget *ui;
    QFont font;
    int offset;//声明
    QTimer *timer;
    QString textContent;
    int textContentWidth;
    
private slots:
    void onTimerTimeOn();
};
#endif // WIDGET_H

widget.cpp 

#include "widget.h"
#include "ui_widget.h"
#include <QThread>
#include <QDebug>
#include <QFontMetrics>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    ,textContent("态度决定一切")
{
    ui->setupUi(this);
    font.setPixelSize(50);
    //设定定时器;
    timer = new QTimer(this);
    timer->start(100);//100ms发送信号

    //计算文字的长度
    QFontMetrics fontMetrics(font);
    textContentWidth = fontMetrics.width(textContent);
    offset = -textContentWidth;
    connect(timer,SIGNAL(timeout()),this,SLOT(onTimerTimeOn()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    //设置画笔和画家;
    QPainter painter(this);
    QPen pen;
    pen.setColor(QColor(Qt::red));
    painter.setPen(pen);
    painter.setFont(font);
    //设置文字显示的边框;通过偏移边框来实现文字滑动;
    QRectF rectF = this->rect();
    rectF.setLeft(offset);

    painter.drawText(rectF,Qt::AlignVCenter,textContent);
}

void Widget::onTimerTimeOn()
{
    if(offset<800)
        offset = offset+30;
    else
        offset = -textContentWidth;
    //刷新
    this->update();
}

 实现效果:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值