Qt 2D绘图

xiaoxiao2021-02-28  106

参考 Qt之图形(QPainter的基本绘图)

设置画笔绘制图形 文本直线矩形弧线椭圆 and 圆多边形图片 渐变色 设置显示模式QLinearGradient 线性渐变QRadialGradient 圆形渐变QConicalGradient 圆锥渐变 平移 效果图源码 旋转 效果图源码 缩放 效果图源码 扭曲 效果图源码

设置画笔

QPainter painter(this); // 设置画笔颜色 painter.setPen(QColor(0, 160, 230)); // 设置画笔颜色、宽度 painter.setPen(QPen(QColor(0, 160, 230), 2)); // 设置字体:微软雅黑、点大小50、斜体、粗体 QFont font; // 设置字体族 font.setFamily("Microsoft YaHei"); // 大小 font.setPointSize(16); // 斜体 font.setItalic(true); // 粗体 font.setBold(true); // 设置下划线 font.setUnderline(true); // 设置上划线 font.setOverline(true); // 设置字母大小写 font.setCapitalization(QFont::SmallCaps); // 设置字符间距 font.setLetterSpacing(QFont::AbsoluteSpacing, 20); painter.setFont(font);

当字体过长时设置为自动换行

void MainWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); // 设置画笔颜色 painter.setPen(QColor(0, 160, 230)); QTextOption option(Qt::AlignLeft | Qt::AlignVCenter); option.setWrapMode(QTextOption::WordWrap); painter.drawText(rect(), QStringLiteral("青春不老,奋斗不止!-纯正开源之美,有趣、好玩、靠谱。。。"), option); }

当字体过长时仍用一行表示,末尾显示 …

void MainWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); // 设置画笔颜色 painter.setPen(QColor(0, 160, 230)); QFontMetrics fm = painter.fontMetrics(); QString strText = QStringLiteral("青春不老,奋斗不止!-纯正开源之美,有趣、好玩、靠谱。。。"); QString strElidedText = fm.elidedText(strText, Qt::ElideRight, 200, Qt::TextShowMnemonic); painter.drawText(rect(), Qt::AlignCenter, strElidedText); }

绘制图形

文本

void MainWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event); // 绘制文本 painter.drawText(rect(), Qt::AlignCenter, "Qt"); }

直线

painter.drawLine(QPointF(0, height()), QPointF(width() / 2, height() / 2));

矩形

painter.drawRect(50, 50, 160, 100);

弧线

void MainWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event); // 矩形 QRectF rect(90.0, 90.0, 80.0, 90.0); // 起始角度 int startAngle = 30 * 16; // 跨越度数 int spanAngle = 120 * 16; QPainter painter(this); // 反走样 painter.setRenderHint(QPainter::Antialiasing, true); // 设置画笔颜色、宽度 painter.setPen(QPen(QColor(0, 160, 230), 2)); // 绘制弧线 painter.drawArc(rect, startAngle, spanAngle); }

椭圆 and 圆

// 绘制椭圆 painter.drawEllipse(QPointF(120, 60), 50, 20); // 绘制圆 painter.drawEllipse(QPointF(120, 140), 40, 40);

多边形

// 各个点的坐标 static const QPointF points[4] = {QPointF(30, 40), QPointF(60, 150), QPointF(150, 160), QPointF(220, 100)}; // 把多个点按顺序首尾连接起来 painter.drawPolygon(points, 4);

图片

// 绘制图片 painter.drawPixmap(rect(), QPixmap("./src/Me.png"));

渐变色

设置显示模式

// 设置显示模式 linear.setSpread(QGradient::PadSpread); linear.setSpread(QGradient::RepeatSpread); linear.setSpread(QGradient::ReflectSpread);

QLinearGradient 线性渐变

// 设置渐变色 QLinearGradient linear(QPointF(80, 80), QPointF(150, 150)); linear.setColorAt(0, Qt::black); linear.setColorAt(1, Qt::white); // 设置显示模式 linear.setSpread(QGradient::PadSpread); // 设置画刷填充 painter.setBrush(linear);

QRadialGradient 圆形渐变

// 设置渐变色 //第一和第二个参数是 (cx, cy) 坐标,第三个参数是半径,第四和第五个参数是 (fx, fy) 坐标 QRadialGradient radial(110, 110, 50, 130, 130); radial.setColorAt(0, Qt::black); radial.setColorAt(1, Qt::white); // 设置显示模式 linear.setSpread(QGradient::PadSpread); // 设置画刷填充 painter.setBrush(radial);

QConicalGradient 圆锥渐变

// 设置渐变色 QConicalGradient conical(110, 110, 45); conical.setColorAt(0, Qt::black); // 设置显示模式 linear.setSpread(QGradient::PadSpread); // 设置画刷填充 painter.setBrush(radial);

平移

效果图

源码

void ReadWrite::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); // 反走样 painter.setRenderHint(QPainter::Antialiasing, true); QTransform transform; // m_painterX、m_painterY是两个成员变量。在构造函数中初始为0 // 平移。 transform.translate(m_painterX, m_painterY); painter.setTransform(transform); painter.drawPixmap(QRect(0, 0, 220, 220), QPixmap("src/haha.gif")); } // 界面功能按钮的槽函数 void ReadWrite::on_btnPower_clicked() { m_painterX += 10; m_painterY += 10; // 调用update();或repaint();则会再次执行paintEvent(QPaintEvent *event) update(); }

旋转

效果图

源码

void ReadWrite::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); // 反走样 painter.setRenderHint(QPainter::Antialiasing, true); QTransform transform; // m_painterX、m_painterY是两个成员变量。在构造函数中初始为0 // 沿X轴旋转 transform.rotate(m_painterX, Qt::XAxis); // 沿Y轴旋转 //transform.rotate(m_painterX, Qt::YAxis); // 沿Z轴旋转 //transform.rotate(m_painterX, Qt::ZAxis); painter.setTransform(transform); painter.drawPixmap(QRect(0, 0, 220, 220), QPixmap("src/haha.gif")); } // 界面功能按钮的槽函数 void ReadWrite::on_btnPower_clicked() { m_painterX += 10; m_painterY += 10; update(); }

缩放

效果图

源码

void ReadWrite::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); // 反走样 painter.setRenderHint(QPainter::Antialiasing, true); QTransform transform; // m_painterX、m_painterY是两个成员变量。在构造函数中初始为0 // 缩放 transform.scale(m_painterX, m_painterY); painter.setTransform(transform); painter.drawPixmap(QRect(0, 0, 220, 220), QPixmap("src/haha.gif")); } // 界面功能按钮的槽函数 void ReadWrite::on_btnPower_clicked() { m_painterX += 0.2; m_painterY += 0.2; update(); }

扭曲

效果图

源码

void ReadWrite::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); // 反走样 painter.setRenderHint(QPainter::Antialiasing, true); QTransform transform; // m_painterX、m_painterY是两个成员变量。在构造函数中初始为0 // 横向扭曲 transform.shear(m_painterX, 0); // 纵向扭曲 //transform.shear(0, m_painterY); painter.setTransform(transform); painter.drawPixmap(QRect(0, 15, 220, 220), QPixmap("src/haha.gif")); } // 界面功能按钮的槽函数 void ReadWrite::on_btnPower_clicked() { m_painterX += 0.2; m_painterY += 0.2; update(); }
转载请注明原文地址: https://www.6miu.com/read-27684.html

最新回复(0)