QT绘图进阶
1、界面布局
参考链接:大轮明王讲QT
最终效果: Label、ComboBox、CheckBox、GroupBox ,pushbotton
1.1创建
先创建一个widget项目,在这个项目新建一个c++ painterX 继承widget ,类名PaintWidget
样式表
QWidget
{
font: 14pt "Microsoft YaHei";
color: #000000;
}
QGroupBox {
border-width: 1px;
border-style: solid;
margin-top:10px
}
QGroupBox::title {
subcontrol-origin: margin;
left:20px;
padding: -10px 5px 0px 5px;
}
中间的 PaintWidget
为了便于查看,将其背景色修改为白色,修改其样式表
background-color: rgb(255, 255, 255);
为 PaintWidget 添加了以上样式表之后,运行后样式表不起作用,需要增加以下代码
PaintWidget::PaintWidget(QWidget *parent) : QWidget{parent}
{
this->setAttribute(Qt::WA_StyledBackground, true);
}
一些细节
2、给各个控件赋值,初始化数据
2.1图形形状
枚举类型
enum Shape {
_Point, // 点
_Line, // 线
_Rect, // 矩形
_RoundedRect, // 圆角矩形
_Ellipse, // 椭圆
_Polyline, // 折线
_Polygon, // 多边形
_Arc, // 弧线
_Pie, // 扇形
_Chord, // 弦
_Path, // 路径
_Text, // 文本
_Pixmap // 图像
};
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//图形形状选项
//这段代码是用于向名为"shapeComboBox"的UI控件中添加一个选项,选项的文本是"Point",对应的值是_Point。
//其中,static_cast<int>(_Point)是将枚举类型_Point转换为整数类型,以便在UI控件中进行存储和处理。
ui->shapeComboBox->addItem("Point",static_cast<int>(_Point));
ui->shapeComboBox->addItem("Line",static_cast<int>(_Line));
ui->shapeComboBox->addItem("Rectangle",static_cast<int>(_Rect));
ui->shapeComboBox->addItem("Rounded Rectangle",static_cast<int>(_RoundedRect));
ui->shapeComboBox->addItem("Ellipse",static_cast<int>(_Ellipse));
ui->shapeComboBox->addItem("Polyline",static_cast<int>(_Polyline));
ui->shapeComboBox->addItem("Polygon",static_cast<int>(_Polygon));
ui->shapeComboBox->addItem("Arc",static_cast<int>(_Arc));
ui->shapeComboBox->addItem("Pie",static_cast<int>(_Pie));
ui->shapeComboBox->addItem("Chord",static_cast<int>(_Chord));
ui->shapeComboBox->addItem("Path",static_cast<int>(_Path));
ui->shapeComboBox->addItem("Text",static_cast<int>(_Text));
ui->shapeComboBox->addItem("Pixmap",static_cast<int>(_Pixmap));
}
2.2画笔
//画笔属性设置
//1.画笔宽度
ui->widthSpinBox->setRange(1,10);
//2.线形状
ui->styleComboBox->addItem("Soild",static_cast<int>(Qt::SolidLine));
ui->styleComboBox->addItem("Dash",static_cast<int>(Qt::DashLine));
ui->styleComboBox->addItem("Dot",static_cast<int>(Qt::DotLine));
ui->styleComboBox->addItem("Dash Dot",static_cast<int>(Qt::DashDotLine));
ui->styleComboBox->addItem("Dash Dot Dot",static_cast<int>(Qt::DashDotDotLine));
ui->styleComboBox->addItem("None",static_cast<int>(Qt::NoPen));
//3.线的端点样式
ui->endComboBox->addItem("Flat",static_cast<int>(Qt::FlatCap));
ui->endComboBox->addItem("Square",static_cast<int>(Qt::SquareCap));
ui->endComboBox->addItem("Round",static_cast<int>(Qt::RoundCap));
//4.两根线的连接处的样式
ui->connectComboBox->addItem("Miter",static_cast<int>(Qt::MiterJoin));
ui->connectComboBox->addItem("Bevel",static_cast<int>(Qt::BevelJoin));
ui->connectComboBox->addItem("Round",static_cast<int>(Qt::RoundJoin));
2.3画刷
//画刷属性的设置
//1.
ui->styleBrushComboBox->addItem(tr("Linear Gradient"), static_cast<int>(Qt::LinearGradientPattern));
ui->styleBrushComboBox->addItem(tr("Radial Gradient"), static_cast<int>(Qt::RadialGradientPattern));
ui->styleBrushComboBox->addItem(tr("Conical Gradient"), static_cast<int>(Qt::ConicalGradientPattern));
ui->styleBrushComboBox->addItem(tr("Texture"), static_cast<int>(Qt::TexturePattern));
ui->styleBrushComboBox->addItem(tr("Solid"), static_cast<int>(Qt::SolidPattern));
ui->styleBrushComboBox->addItem(tr("Horizontal"), static_cast<int>(Qt::HorPattern));
ui->styleBrushComboBox->addItem(tr("Vertical"), static_cast<int>(Qt::VerPattern));
ui->styleBrushComboBox->addItem(tr("Cross"), static_cast<int>(Qt::CrossPattern));
ui->styleBrushComboBox->addItem(tr("Backward Diagonal"), static_cast<int>(Qt::BDiagPattern));
ui->styleBrushComboBox->addItem(tr("Forward Diagonal"), static_cast<int>(Qt::FDiagPattern));
ui->styleBrushComboBox->addItem(tr("Diagonal Cross"), static_cast<int>(Qt::DiagCrossPattern));
ui->styleBrushComboBox->addItem(tr("Dense 1"), static_cast<int>(Qt::Dense1Pattern));
ui->styleBrushComboBox->addItem(tr("Dense 2"), static_cast<int>(Qt::Dense2Pattern));
ui->styleBrushComboBox->addItem(tr("Dense 3"), static_cast<int>(Qt::Dense3Pattern));
ui->styleBrushComboBox->addItem(tr("Dense 4"), static_cast<int>(Qt::Dense4Pattern));
ui->styleBrushComboBox->addItem(tr("Dense 5"), static_cast<int>(Qt::Dense5Pattern));
ui->styleBrushComboBox->addItem(tr("Dense 6"), static_cast<int>(Qt::Dense6Pattern));
ui->styleBrushComboBox->addItem(tr("Dense 7"), static_cast<int>(Qt::Dense7Pattern));
ui->styleBrushComboBox->addItem(tr("None"), static_cast<int>(Qt::NoBrush));
3.绘制点、线
wight.h
public slots:
void shapeChange();
wight.cpp
在wight函数中添加
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
···
//关联信号曹
connect(ui->shapeComboBox,SIGNAL(activated(QString)),this,SLOT(shapeChange()));
}
void Widget::shapeChange()
{
int index = ui->shapeComboBox->currentIndex();
Shape shape = (Shape)ui->shapeComboBox->itemData(index).toInt();
ui->widget->setShape(shape);
}
painterwight.h
protected:
void paintEvent(QPaintEvent *event);
public slots:
void setShape(Shape shape);
private:
Shape mShape;
painterwight.cpp 知识点:平移translate()、 update()
void PainterWidget::setShape(Shape shape)
{
this->mShape = shape;
update();
}
//paintEvent 是什么?
//paintEvent 是一个绘图函数,它是并不是由我们手动调用的, 而是由系统自动调用的。
//调用时机:
//窗口大小变化时
//比如最大化、最小化、缩放窗口时,系统都会调用该函数
//手动调用 update
//手动调用 update 函数,同样会触发系统调用 paintEvent,从而完成界面的刷新。
void PainterWidget::paintEvent(QPaintEvent *event)
{
static const QPoint points[4] = {
QPoint(10,80),
QPoint(20,10),
QPoint(80,30),
QPoint(90,70),
};
//创建画家类的对象,参数为绘图设备,指定为this,表示在当前的窗口绘制
QPainter painter(this);
//让形状平移100距离铺满整个界面
for (int x = 0 ; x < this->width() ; x+=100) {
for (int y = 0 ; y < this->height() ; y+=100) {
//保存位置
painter.save();
//平移-translate:它的作用是,移动绘图的坐标原点
//有了平移的方法,就可以直接移动绘图的坐标原点,这样线段的两个端点的坐标就不需要改变
painter.translate(x,y);
//绘制很多个图形,switch来选择
switch( mShape )
{
//点,线
case _Point:
painter.drawPoints(points,4);
break;
case _Line:
painter.drawLine(points[0],points[2]);
break;
//多段线,多边形
case _Polyline:
painter.drawPolyline(points,4);
break;
case _Polygon:
painter.drawPolygon(points,4);
break;
}
//恢复
painter.restore();
}
}
}
4、矩形,圆角矩形
4.1 矩形
// 带 F 表示参数为浮点数,否则为整型数
void drawRect(const QRectF &rectangle)
void drawRect(const QRect &rectangle)
// 指定左上角的顶点,以及宽高
void drawRect(int x, int y, int width, int height)
4.2 圆角矩形
// 带 F 表示参数为浮点数,否则为整型数
void drawRoundedRect(const QRectF &rect,
qreal xRadius,
qreal yRadius,
Qt::SizeMode mode = Qt::AbsoluteSize)
void drawRoundedRect(const QRect &rect,
qreal xRadius,
qreal yRadius,
Qt::SizeMode mode = Qt::AbsoluteSize)
void drawRoundedRect(int x, int y, int w, int h,
qreal xRadius,
qreal yRadius,
Qt::SizeMode mode = Qt::AbsoluteSize)
其中,最后一个参数为 Qt::SizeMode 类型的枚举,取值为:
Qt::AbsoluteSize xRadius 和 yRadius 为圆角大小
Qt::RelativeSize xRadius 和 yRadius 为圆角百分比
void PainterWidget::paintEvent(QPaintEvent *event)
当中写
//矩形 (x,y,width,height)
QRect rect(10,20,80,60);
switch里面增加
//矩形,圆角矩形
case _Rect:
painter.drawRect(rect);
reak;
case _RoundedRect:
painter.drawRoundedRect(rect,25,25,Qt::RelativeSize); //相对的,为百分比
break;
5、椭圆、圆
// 直接制定一个矩形
void drawEllipse(const QRectF &rectangle);
void drawEllipse(const QRect &rectangle);
// 通过左上角的顶点和宽高,来指定一个矩形
void drawEllipse(int x, int y, int width, int height);
// 通过指定中心 和 rx、ry
void drawEllipse(const QPointF ¢er, qreal rx, qreal ry);
void drawEllipse(const QPoint ¢er, int rx, int ry);
6、圆弧,饼图,弦图
关于矩形参数的理解:
圆弧,饼图,弦图可以看作就是矩形内部的内心圆进行的截取
矩形参数定义了一个矩形区域,圆弧将被绘制在该区域内部。圆弧的起始角度和结束角度将根据矩形的位置和大小来确定。
总结起来,矩形参数用于确定圆弧所在的矩形区域,进而确定圆弧的位置和大小。
6.1 圆弧
绘制圆弧时,需要指定一个矩形,以及开始角度 startAngel、跨度角度 spanAngle
角度的起始零点为时钟三点钟位置,逆时针增加。一圈的跨度为360x16,半圈为180x16
开始角度和偏移角度决定了扇形绘制的弧长,
Qt中一个完整的圆分为5760 等分(360*16),在指定角度时,角度数需要乘16
同时需要注意,弧度和角度的转换。
// 直接指定一个矩形对象
void drawChord(const QRectF &rectangle, int startAngle, int spanAngle);
void drawChord(const QRect &rectangle, int startAngle, int spanAngle);
// 通过指定左上角的顶点和宽高来指定一个矩形
void drawChord(int x, int y, int width, int height, int startAngle, int spanAngle);
6.2饼图,弦图
参数都一样,换个参数名就行,drawPie 、 drawChord
void PaintWidget::paintEvent(QPaintEvent *event)
{
//矩形,起始角,偏移角
QRect rect2(10,10,80,80);
int startAngle = 30 * 16;
int arcLength = 120 * 16;
for ( int x = 0; x < width(); x += 100 ) {
for ( int y = 0; y < height(); y += 100 ) {
...
switch ( mShape ) {
// 路径
//圆弧,饼图,弦图
case _Arc:
painter.drawArc(rect2,startAngle,arcLength);
break;
case _Pie:
painter.drawPie(rect2, startAngle, arcLength);
break;
case _Chord:
painter.drawChord(rect2, startAngle, arcLength);
break;
}
...
}
}
}
7、路径图
drawPath 需要一个 QPainterPath 对象,其常用方法
// 移动到指定的点,开始指定路径
void moveTo(const QPointF &point);
void moveTo(qreal x, qreal y);
// 以直线的方式,路径到指定的点
void lineTo(const QPointF &endPoint);
void lineTo(qreal x, qreal y);
// 以贝瑟尔曲线的方式,路径到指定的点
// 具体来说:使用控制点c1和c2,在当前点和结束点之间,绘制一条贝瑟尔曲线
void cubicTo(const QPointF &c1, const QPointF &c2, const QPointF &endPoint);
void cubicTo(qreal c1X, qreal c1Y, qreal c2X, qreal c2Y, qreal endPointX, qreal endPointY);
贝瑟尔曲线理解
.
void PaintWidget::paintEvent(QPaintEvent *event)
{
QPainterPath path;
path.moveTo(20, 80);
path.lineTo(20, 30);
// path.cubicTo(80, 0, 50, 50, 80, 80);
path.cubicTo(QPoint(80, 0), QPoint(50, 50), QPoint(80, 80));
for ( int x = 0; x < width(); x += 100 ) {
for ( int y = 0; y < height(); y += 100 ) {
...
switch ( mShape ) {
// 路径
case _Path:
painter.drawPath(path);
break;
}
...
}
}
}
8、文本、图片
8.1文本
// 通过指定矩形,来绘制文本
void drawText(const QRectF &rectangle,
int flags,
const QString &text,
QRectF *boundingRect = nullptr);
void drawText(int x,
int y,
const QString &text);
void drawText(const QRect &rectangle,
int flags,
const QString &text,
QRect *boundingRect = nullptr);
void drawText(int x,
int y,
int width,
int height,
int flags,
const QString &text,
QRect *boundingRect = nullptr);
void drawText(const QRectF &rectangle,
const QString &text,
const QTextOption &option = QTextOption());
// 通过指定点,来绘制文本
void drawText(const QPointF &position, const QString &text);
void drawText(const QPoint &position, const QString &text);
8.1图片
// 通过指定矩形,来绘制图片
void drawPixmap(const QRectF &target,
const QPixmap &pixmap,
const QRectF &source);
void drawPixmap(const QRect &target,
const QPixmap &pixmap,
const QRect &source);
void drawPixmap(int x,
int y,
int w,
int h,
const QPixmap &pixmap,
int sx,
int sy,
int sw,
int sh);
void drawPixmap(const QRect &rectangle,
const QPixmap &pixmap);
void drawPixmap(int x,
int y,
int width,
int height,
const QPixmap &pixmap);
// 通过指定点,来绘制图片
void drawPixmap(const QPointF &point,
const QPixmap &pixmap,
const QRectF &source);
void drawPixmap(const QPoint &point,
const QPixmap &pixmap,
const QRect &source);
void drawPixmap(const QPointF &point,
const QPixmap &pixmap);
void drawPixmap(const QPoint &point,
const QPixmap &pixmap);
void drawPixmap(int x,
int y,
const QPixmap &pixmap);
void drawPixmap(int x,
int y,
const QPixmap &pixmap,
int sx,
int sy,
int sw,
int sh);
QRect rect(10,20,80,60);
// 文本、图片
case _Text:
painter.drawText(rect, Qt::AlignCenter, "江门\n肥猪");
break;
case _Pixmap:
painter.drawPixmap(rect, QPixmap(":/image/qt.png"),rect);
break;
9、画笔设置
宽度 颜色 样式 末端 连接
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
···
//2.画笔属性设置
//宽度
connect(ui->widthSpinBox,SIGNAL(valueChanged(int)),this,SLOT(penChanged()));
//颜色
connect(ui->colorpushButton,SIGNAL(clicked()),this,SLOT(onBtnPenColorClicked()));
//样式
connect(ui->styleComboBox,SIGNAL(activated(QString)),this,SLOT(penChanged()));
//末端
connect(ui->endComboBox,SIGNAL(activated(QString)),this,SLOT(penChanged()));
//连接
connect(ui->connectComboBox,SIGNAL(activated(QString)),this,SLOT(penChanged()));
}
知识点:QPalette 、 QPalette::Button 、setFlat(true)
QPalette
是Qt框架提供的一个类,用于管理和设置控件的调色板(palette)。调色板包含了一系列颜色,用于定义控件的前景色、背景色、文本颜色等。 QPalette的主要作用是为了控制和定制控件的外观。通过设置不同的颜色,可以改变控件的外观效果,使其适应不同的主题或用户需求。
QPalette::Button
指的是定义按钮部件的背景颜色的角色。QPalette::Button角色用于设置QPushButton、QToolButton和QCheckBox等按钮元素的颜色。通过设置QPalette::Button的颜色,您可以自定义应用程序中按钮的背景颜色。
setFlat(true)
属性用于移除按钮的默认样式,例如边框和阴影等,这些样式有时会干扰按钮颜色的显示。通过设置 setFlat(true)
,你可以使按钮看起来像一个平面表面,没有任何额外的样式效果。这样可以更突出地显示按钮的颜色,而不会有任何干扰。
void Widget::onBtnPenColorClicked()
{
//调取颜色对话框
QColor color = QColorDialog::getColor(QColor(255,0,0),this,"画笔颜色");
//如果取消就直接退出
if(!color.isValid())
{
return;
}
//让选择的颜色显示到颜色按钮上面
// 获取colorpushButton的调色板
QPalette pal = ui->colorpushButton->palette();
// 设置按钮在调色板中的颜色
//QPalette::Button指的是定义按钮部件的背景颜色的角色。。
pal.setColor(QPalette::Button, color);
// 将修改后的调色板应用到colorpushButton上
ui->colorpushButton->setPalette(pal);
// 启用自动填充背景功能,使按钮的背景颜色生效
ui->colorpushButton->setAutoFillBackground(true);
// 设置按钮为扁平样式,使其看起来是平面的
ui->colorpushButton->setFlat(true);
penChanged();
}
void Widget::penChanged()
{
//获取界面上控件的内容
//宽度
int width = ui->widthSpinBox->value();
//颜色
QPalette pal =ui->colorpushButton->palette();
QColor color = pal.color(QPalette::Button);
//样式
// 1. 获取当前选择的样式索引:使用 ui->styleComboBox->currentIndex() 获取下拉框 styleComboBox 当前选中的索引, 即 styleIndex 。
// 2. 获取选中样式的数据:使用 ui->styleComboBox->itemData(styleIndex) 获取选中样式的数据。这里的数据是通过 setItemData() 方法设置的,可以是任意类型的数据。
// 3. 将数据转换为Qt的PenStyle类型:使用 .toInt() 将获取到的数据转换为整数类型,并强制转换为 Qt::PenStyle 枚举类 型,赋值给 style 变量。
// 通过这段代码,可以获取到下拉框中选中样式的索引和对应的 Qt::PenStyle 枚举类型的值,以便后续使用。
int styleIndex = ui->styleComboBox->currentIndex();
Qt::PenStyle style = (Qt::PenStyle)ui->styleComboBox->itemData(styleIndex).toInt();
//末端
int endIndex = ui->endComboBox->currentIndex();
Qt::PenCapStyle end = (Qt::PenCapStyle)ui->endComboBox->itemData(endIndex).toInt();
//连接
int JoinIndex = ui->connectComboBox->currentIndex();
Qt::PenJoinStyle join = (Qt::PenJoinStyle)ui->connectComboBox->itemData(JoinIndex).toInt();
//最后是在painterwight上显示的,在设置setPen函数,调用这个函数,传参数过去
ui->widget->setPen(QPen(color,width,style,end,join));
}
painterwight.h
public slots:
void setShape(Shape shape);
void setPen(const QPen &pen);
private:
Shape mShape;
QPen mPen;
painterwight.cpp
void PainterWidget::setPen(const QPen &pen)
{
this->mPen = pen;
update();
}
void PainterWidget::paintEvent(QPaintEvent *event)
{
```
//创建画家类的对象,参数为绘图设备,指定为this,表示在当前的窗口绘制
QPainter painter(this);
//这里设置画笔,先设置画笔
painter.setPen(mPen);
```
}
优化
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
···
//初始化画笔的颜色
QPalette pal = ui->colorpushButton->palette();
pal.setColor(QPalette::Button, QColor(0, 170, 0));
ui->colorpushButton->setPalette(pal);
ui->colorpushButton->setAutoFillBackground(true);
ui->colorpushButton->setFlat(true);
this->penChanged();
}
10、画刷设置
颜色,样式
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
···
//3.画刷样式设置
//颜色
connect(ui->colorBrushbtn,SIGNAL(clicked()),this,SLOT(onBtnBrushColorClicked()));
//样式
connect(ui->styleBrushComboBox,SIGNAL(activated(QString)),this,SLOT(brushChanged()));
}
void Widget::onBtnBrushColorClicked()
{
//调取颜色对话框
QColor color = QColorDialog::getColor(QColor(255,0,0),this,"画刷颜色");
//如果取消就直接退出
if(!color.isValid())
{
return;
}
//让选择的颜色显示到颜色按钮上面
// 获取colorpushButton的调色板
QPalette pal = ui->colorBrushbtn->palette();
// 设置按钮在调色板中的颜色
//QPalette::Button指的是定义按钮部件的背景颜色的角色。。
pal.setColor(QPalette::Button, color);
// 将修改后的调色板应用到colorpushButton上
ui->colorBrushbtn->setPalette(pal);
// 启用自动填充背景功能,使按钮的背景颜色生效
ui->colorBrushbtn->setAutoFillBackground(true);
// 设置按钮为扁平样式,使其看起来是平面的 ,移除按钮的默认样式
ui->colorBrushbtn->setFlat(true);
brushChanged();
}
void Widget::brushChanged()
{
//颜色
QPalette pal =ui->colorBrushbtn->palette();
QColor color = pal.color(QPalette::Button);
//样式
int styleIndex = ui->styleBrushComboBox->currentIndex();
Qt::BrushStyle style = (Qt::BrushStyle)ui->styleBrushComboBox->itemData(styleIndex).toInt();
//显示
// 线性渐变
if ( style == Qt::LinearGradientPattern )
{
// 创建了一个线性渐变对象 linearGradient ,起点为 (0, 50) ,终点为 (100, 50) 。
// 然后,通过 setColorAt() 方法设置了渐变的颜色。
// 在位置0.0(起点)设置为白色,位置0.2设置为指定的 color 变量(假设已定义),位置1.0(终点)设置为黑色。
QLinearGradient linearGradient(0, 50, 100, 50); //(x1,y1,x2,y2)
linearGradient.setColorAt(0.0, Qt::white); //起始点
linearGradient.setColorAt(0.2, color); //到20%的时候换成color,我们指定的颜色
linearGradient.setColorAt(1.0, Qt::black); //结束
ui->widget->setBrush(linearGradient);
}
// 线径向渐变
else if ( style == Qt::RadialGradientPattern )
{
//圆心50,50 半径50 焦点70,70 ,圆心向着焦点偏移
//在位置0.0(中心点)设置为白色,位置0.2设置为指定的 color 变量(假设已定义),位置1.0(外边缘)设置为黑色
QRadialGradient radialGradient(50, 50, 50, 70, 70);
radialGradient.setColorAt(0.0, Qt::white);
radialGradient.setColorAt(0.2, color);
radialGradient.setColorAt(1.0, Qt::black);
ui->widget->setBrush(radialGradient);
}
// 锥形渐变
else if ( style == Qt::ConicalGradientPattern )
{
// QConicalGradient(qreal cx, qreal cy, qreal startAngle)
QConicalGradient conicalGradient(50, 50, 150);
conicalGradient.setColorAt(0.0, Qt::white);
conicalGradient.setColorAt(0.2, color);
conicalGradient.setColorAt(1.0, Qt::black);
ui->widget->setBrush(conicalGradient);
}
// 纹理样式
else if ( style == Qt::TexturePattern )
{
ui->widget->setBrush(QBrush(QPixmap(":/image/block.png")));
}
else
{
ui->widget->setBrush(QBrush(color,style));
}
}
painterwight.h
public slots:
void setShape(Shape shape);
void setPen(const QPen &pen);
void setBrush(const QBrush &brush);
private:
Shape mShape;
QPen mPen;
QBrush mBrush;
painterwight.cpp
void PainterWidget::setBrush(const QBrush &brush)
{
this->mBrush = brush;
update();
}
void PainterWidget::paintEvent(QPaintEvent *event)
{
```
//创建画家类的对象,参数为绘图设备,指定为this,表示在当前的窗口绘制
QPainter painter(this);
//这里设置画笔,先设置画笔
painter.setPen(mPen);
//设置画刷
painter.setBrush(mBrush);
```
}
11、抗锯齿
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
```
//4.抗锯齿
connect(ui->renderHintCheckBox,&QCheckBox::toggled,[=](){
antialiasChanged();
});
connect(ui->changecheckBox,&QCheckBox::toggled,[=](){
transformChanged();
});
```
}
void Widget::antialiasChanged()
{
ui->widget->setAntialias(ui->renderHintCheckBox->isChecked());
}
12、旋转,平移,缩放
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
```
connect(ui->changecheckBox,&QCheckBox::toggled,[=](){
transformChanged();
});
```
}
void Widget::transformChanged()
{
ui->widget->setTransform(ui->changecheckBox->isChecked());
}
painterwight.h
public slots:
void setShape(Shape shape);
void setPen(const QPen &pen);
void setBrush(const QBrush &brush);
void setAntialias(bool antialias);
void setTransform(bool transformed);
private:
Shape mShape;
QPen mPen;
QBrush mBrush;
bool mAntialias;
bool mTransform;
painterwight.cpp
//抗锯齿
void PainterWidget::setAntialias(bool antialias)
{
this->mAntialias = antialias;
update();
}
//旋转,平移,缩放
void PainterWidget::setTransform(bool transformed)
{
this->mTransform = transformed;
update();
}
旋转,缩放
void PaintWidget::paintEvent(QPaintEvent *event)
{
···
for ( int x = 0; x < width(); x += 100 ) {
for ( int y = 0; y < height(); y += 100 ) {
painter.save();
painter.translate(x, y); // translate 修改的是坐标系
···
if ( mTransform ) {
painter.translate(50, 50); //将圆心移动 x+50,y+50
painter.rotate(90); //坐标轴顺时针旋转90度
painter.scale(0.7,0.7); //缩放0.7,0.7
painter.translate(-50, -50); //将圆心移动 x-50,y-50
}
···
}
}
···
}
.