今天逐渐学会使用QThelp来查类的使用;比如drawText的使用方法,是重载类,第一种是老师说的,后面一种是自己写的;
函数重载和函数重写:函数重载(overload)和函数重写(override)的基本规则_inter_peng的博客-CSDN博客_函数重0写h
轮播文字项目widget.h中:函数声明后面为什么加override ?
//后面override是为了说明painEvent是为了重写父类QWidget的虚函数; void paintEvent(QPaintEvent *event) override;
为了防止重写父类中的虚函数时出错;参考自:
重点:
paintEvent(QPaintEvent *event)不需要调用,当界面初始化或者需要刷新时才会执行的事件,也就是说绘图事件在构造对象实例化时会执行,需要刷新界面我们可以使用 update()方法执行 paintEvent()事件)。
以后记笔记,可以像下面这样,将步骤写出来,方便代码阅读;
QPainter基本用法:
- 重写绘图事件: void paintevent()
- 实例化一个画家QPainter painter(this); this 指绘图设备;
- 设置画笔QPen pen,设置画笔宽度、风格;
- 设置画刷QBrush bursh,设置画刷风格;
- 画线,画矩形,文字;
高级设置:
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();
}
实现效果: