在QT的学习道路上一直苦于没有好的教程,其中有QT学习之路,还有qt实战一二三等,比较好的博客的但是也总是感觉不是很方便,QT学习之路讲的过于简单,但是其中的贪吃蛇的小程序倒是挺不错的一个练习。而qt实战的博客里面讲的比较翔实,但是特别不成体系,比较乱,不知道从哪开始学习。而我购买的金大的QT教程,里面讲的特别详细,但是没有可以直接运行的代码,全部都是各种控件,类等的用法感觉很枯燥,用作备查手册比较好。但是不适合入门的新手学习。最后,我在QT开源社区内找到一个QT4的教程,虽然是QT4但是对于5也是完全适用的,下面使我的学习的心得与记录。在代码中有详细的注释,用可以运行的代码来带领学习我觉得更加该高效。下面给出教程地址,可以将教程和我的代码结合起来看,最后自己敲出来。
每一步都会有详细的注释,都可以f2转到定义来找到,可以先看代码敲一边然后再看教程
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include //包含绘图操作的头文件
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
//画直线 f2进入定义发现
/* 画直线的函数一共有5个重载函数
* inline void drawLine(const QLineF &line);
* inline void drawLine(const QPointF &p1, const QPointF &p2);//点到点
* inline void drawLine(const QPoint &p1, const QPoint &p2);//点到点
* inline void drawLine(const QLine &line);
* inline void drawLine(int x1, int y1, int x2, int y2);//点的xy值到点的xy值
*
* */
/*case 1
painter.drawLine(QPointF(0,0),QPointF(100,100));
case 1*/
/*画矩形 同样f2到定义,一共有三个重载函数
*
* inline void drawRect(const QRectF &rect);
* x y是矩形左上角的坐标 w 与h 分别是width宽度和high高度
* inline void drawRect(int x1, int y1, int w, int h);
* //直接给传给函数一个矩形对象
* inline void drawRect(const QRect &rect);
* */
/* case 2
QPen pen;//定义了一个QPen笔对象
QBrush brush(QColor(0,255,0,125));//笔刷
pen.setColor(QColor(255,0,0));//设置笔的颜色
painter.setPen(pen);
painter.setBrush(brush);
painter.drawRect(50,50,200,100);//画一个矩形
case 2*/
/* 画圆弧
* 发现有三个重载函数
* 原理都是先画一个矩形,然后指定开始角度和跨越角度,不再详述
* */
/* case 3
QRectF rectangle(10.0, 20.0, 80.0, 60.0); //矩形
//为了增加精度,QT将每一度分为30份,所以10度 是对应10×30 20度对应20×30
int startAngle = 30 * 16; //起始角度
int spanAngle = 120 * 16; //跨越度数
painter.drawArc(rectangle, startAngle, spanAngle);
case 3*/
/*
* 渐变填充
* 线性渐变(linear gradient)在开始点和结束点之间插入颜色;
* 辐射渐变(radial gradient)在焦点和环绕它的圆环间插入颜色;
* 锥形渐变(Conical)在圆心周围插入颜色。
* */
//线性渐变
/* case 4
QLinearGradient linearGradient(QPointF(10, 20), QPointF(100, 60));
//定义了一个线性渐变的对象,其中矩形右上角是渐变的开始点,矩形的右下角是渐变的终点
//插入颜色
//渐变变量从起点时为0 终点时为1 ,线性变换
linearGradient.setColorAt(0, Qt::yellow);
linearGradient.setColorAt(0.5, Qt::red);
linearGradient.setColorAt(1, Qt::green);
//指定渐变区域以外的区域的扩散方式
linearGradient.setSpread(QGradient::ReflectSpread);
//在渐变区域外是重复变化
//可选择的对象有,按f2找到 可分别实验效果
//PadSpread,
//ReflectSpread,
//RepeatSpread
//使用渐变作为画刷
painter.setBrush(linearGradient);
//测试线性渐变
//painter.drawRect(10, 20, 90, 40);
//测试渐变区域外的扩散方式
painter.drawRect(0, 0, 500, 500);
case 4*/
//辐射渐变
/*对于辐射渐变我们只需要理解构造函数的意思便可
* 对于QradialGradient类 由多个重载构造函数,同样我们转到定义
* 其中
* QRadialGradient();
* 第一个点是渐变区域的原点,然后是区域半径,最后一个点是渐变开始的起点
*
* QRadialGradient(const QPointF ¢er, qreal radius, const QPointF &focalPoint);
* QRadialGradient(qreal cx, qreal cy, qreal radius, qreal fx, qreal fy);
* 默认渐变开始的起点在圆心
* QRadialGradient(const QPointF ¢er, qreal radius);
* QRadialGradient(qreal cx, qreal cy, qreal radius);
*
* QRadialGradient(const QPointF ¢er, qreal centerRadius, const QPointF &focalPoint, qreal focalRadius);
* QRadialGradient(qreal cx, qreal cy, qreal centerRadius, qreal fx, qreal fy, qreal focalRadius);
*
* */
//QRadialGradient radialGradient(QPointF(100, 190),50,QPointF(275,200));
/* case 5
QRadialGradient radialGradient(100, 190,100);
//和线性渐变一样,变量从0到1变化
radialGradient.setColorAt(0, QColor(255, 255, 100, 150));
radialGradient.setColorAt(1, QColor(0, 0, 0, 50));
painter.setBrush(radialGradient);
painter.drawEllipse(QPointF(100, 190), 50, 50);
case 5*/
//锥形渐变
/*
* 和前面的一样,构造函数第一个参数是原点
* 后面一个是半径
*
* */
/*case 6
QConicalGradient conicalGradient(QPointF(250, 190), 60);
conicalGradient.setColorAt(0.2, Qt::cyan);
conicalGradient.setColorAt(0.9, Qt::black);
painter.setBrush(conicalGradient);
painter.drawEllipse(QPointF(250, 190), 50, 50);
case 6*/
//绘制文字
/*绘制文字主要需要理解下面两个内容
* 1 函数drawText
* 2 字体格式类 QFont
* ===========drawText=========
* 点p与设置的字体的左下角对齐
* void drawText(const QPointF &p, const QString &s);
* inline void drawText(const QPoint &p, const QString &s);
* inline void drawText(int x, int y, const QString &s);
*
* void drawText(const QPointF &p, const QString &str, int tf, int justificationPadding);
* 第一个参数是字体放置区域的矩形
* 第二个参数是放置的方式 具体位置看下面的例子
* AlignLeft = 0x0001,
* AlignLeading = AlignLeft,
AlignRight = 0x0002,
AlignTrailing = AlignRight,
AlignHCenter = 0x0004,
AlignJustify = 0x0008,
AlignAbsolute = 0x0010,
AlignTop = 0x0020,
AlignBottom = 0x0040,
AlignVCenter = 0x0080,
AlignBaseline = 0x0100,
*
* 第三个参数是需要绘制的文字
* 第四个缺省参数
*
* void drawText(const QRectF &r, int flags, const QString &text, QRectF *br = Q_NULLPTR);
* void drawText(const QRect &r, int flags, const QString &text, QRect *br = Q_NULLPTR);
* inline void drawText(int x, int y, int w, int h, int flags, const QString &text, QRect *br = Q_NULLPTR);
*
* void drawText(const QRectF &r, const QString &text, const QTextOption &o = QTextOption());
*
* ===========QFont============
*
* 设置下划线 上划线等
* 设置字母大小写
* 设置字符间的间距
*
* */
/* case 7
//设置一个矩形
QRectF rect(20, 20, 300, 200);
//为了更直观地看到字体的位置,我们绘制出这个矩形
painter.drawRect(rect);
painter.setPen(QColor(Qt::red));
//我们这里先让字体水平居中
//函数1 2
//painter.drawText(QPoint(320,220),"第一,二个构造函数");//该点是矩形的右下角
//函数 3
//painter.drawText(100,100,"第三个构造函数");//也是矩形的右下角
//函数4 5 6
//AlignHCenter参数指在矩形中间
painter.drawText(rect,Qt::AlignLeft,"AlignLeft");//第二个参数是在矩形的中间
painter.drawText(rect,Qt::AlignRight,"AlignRight");//右上角
painter.drawText(rect,Qt::AlignHCenter,"AlignHCenter");//中间
painter.drawText(rect,Qt::AlignJustify,"AlignJustify");
painter.drawText(rect,Qt::AlignAbsolute,"AlignAbsolute");
painter.drawText(rect,Qt::AlignTop,"AlignTop");
painter.drawText(rect,Qt::AlignBottom,"AlignBottom");//左下角
painter.drawText(rect,Qt::AlignVCenter,"AlignVCenter");//左中间
painter.drawText(rect,Qt::AlignBaseline,"AlignBaseline");
//函数7
//painter.drawText(rect,"第七个构造函数");//与矩形的左上角对齐
QFont font("宋体", 15, QFont::Bold, true);
//设置下划线
font.setUnderline(true);
//设置上划线
font.setOverline(true);
//设置字母大小写
font.setCapitalization(QFont::SmallCaps);
//设置字符间的间距
font.setLetterSpacing(QFont::AbsoluteSpacing, 10);
//使用字体
painter.setFont(font);
painter.setPen(Qt::green);
painter.drawText(120, 80, tr("yafeilinux"));
painter.translate(50, 50);//对字体的平移操作
painter.rotate(90);//对字体的旋转操作
painter.drawText(0, 0, tr("helloqt"));
case 7*/
//绘制路径
QPainterPath path;
path.addRect(50, 50, 40, 40);//绘制完矩形后坐标落在矩形的左上角
path.lineTo(100, 100);//从左上角画到(100,100)
path.moveTo(200, 200);//将路径当前点移动到(200,200)
path.lineTo(300,400);//画直线到(300,400)
painter.drawPath(path);
//绘制图片
/*drawPixmap函数
*
*
void drawPixmap(const QRectF &targetRect, const QPixmap &pixmap, const QRectF &sourceRect);
inline void drawPixmap(const QRect &targetRect, const QPixmap &pixmap, const QRect &sourceRect);
inline void drawPixmap(int x, int y, int w, int h, const QPixmap &pm,
int sx, int sy, int sw, int sh);
inline void drawPixmap(int x, int y, const QPixmap &pm,
int sx, int sy, int sw, int sh);
inline void drawPixmap(const QPointF &p, const QPixmap &pm, const QRectF &sr);
inline void drawPixmap(const QPoint &p, const QPixmap &pm, const QRect &sr);
void drawPixmap(const QPointF &p, const QPixmap &pm);
inline void drawPixmap(const QPoint &p, const QPixmap &pm);
inline void drawPixmap(int x, int y, const QPixmap &pm);
inline void drawPixmap(const QRect &r, const QPixmap &pm);
inline void drawPixmap(int x, int y, int w, int h, const QPixmap &pm);
*
*
* */
QPixmap pix;
pix.load("../painter_2/logo.png");//中间是图片的地址,最好是绝对地址避免出错
painter.drawPixmap(0, 0, 129, 66, pix);//常用的两个函数重载
//前面两个参数是图片的位置,后面是图片的大小
//drawPixmap(0,0,pix)按照图片原来的大小来绘制图片
}
/* 画直线的函数一共有5个重载函数
* inline void drawLine(const QLineF &line);
* inline void drawLine(const QPointF &p1, const QPointF &p2);//点到点
* inline void drawLine(const QPoint &p1, const QPoint &p2);//点到点
* inline void drawLine(const QLine &line);
* inline void drawLine(int x1, int y1, int x2, int y2);//点的xy值到点的xy值
*
* */
/*画矩形 同样f2到定义,一共有三个重载函数
*
* inline void drawRect(const QRectF &rect);
* x y是矩形左上角的坐标 w 与h 分别是width宽度和high高度
* inline void drawRect(int x1, int y1, int w, int h);
* //直接给传给函数一个矩形对象
* inline void drawRect(const QRect &rect);
* */
/* 画圆弧
* 发现有三个重载函数
* 原理都是先画一个矩形,然后指定开始角度和跨越角度,不再详述
* */
* */
/*绘制文字主要需要理解下面两个内容
* 1 函数drawText
* 2 字体格式类 QFont
* ===========drawText=========
* 点p与设置的字体的左下角对齐
* void drawText(const QPointF &p, const QString &s);
* inline void drawText(const QPoint &p, const QString &s);
* inline void drawText(int x, int y, const QString &s);
*
* void drawText(const QPointF &p, const QString &str, int tf, int justificationPadding);
* 第一个参数是字体放置区域的矩形
* 第二个参数是放置的方式 具体位置看下面的例子
* AlignLeft = 0x0001,
* AlignLeading = AlignLeft,
AlignRight = 0x0002,
AlignTrailing = AlignRight,
AlignHCenter = 0x0004,
AlignJustify = 0x0008,
AlignAbsolute = 0x0010,
AlignTop = 0x0020,
AlignBottom = 0x0040,
AlignVCenter = 0x0080,
AlignBaseline = 0x0100,
*
* 第三个参数是需要绘制的文字
* 第四个缺省参数
*
* void drawText(const QRectF &r, int flags, const QString &text, QRectF *br = Q_NULLPTR);
* void drawText(const QRect &r, int flags, const QString &text, QRect *br = Q_NULLPTR);
* inline void drawText(int x, int y, int w, int h, int flags, const QString &text, QRect *br = Q_NULLPTR);
*
* void drawText(const QRectF &r, const QString &text, const QTextOption &o = QTextOption());
*
* ===========QFont============
*
* 设置下划线 上划线等
* 设置字母大小写
* 设置字符间的间距
*
* */
/*drawPixmap函数
*
*
void drawPixmap(const QRectF &targetRect, const QPixmap &pixmap, const QRectF &sourceRect);
inline void drawPixmap(const QRect &targetRect, const QPixmap &pixmap, const QRect &sourceRect);
inline void drawPixmap(int x, int y, int w, int h, const QPixmap &pm,
int sx, int sy, int sw, int sh);
inline void drawPixmap(int x, int y, const QPixmap &pm,
int sx, int sy, int sw, int sh);
inline void drawPixmap(const QPointF &p, const QPixmap &pm, const QRectF &sr);
inline void drawPixmap(const QPoint &p, const QPixmap &pm, const QRect &sr);
void drawPixmap(const QPointF &p, const QPixmap &pm);
inline void drawPixmap(const QPoint &p, const QPixmap &pm);
inline void drawPixmap(int x, int y, const QPixmap &pm);
inline void drawPixmap(const QRect &r, const QPixmap &pm);
inline void drawPixmap(int x, int y, int w, int h, const QPixmap &pm);
*
*
* */