使用Qt绘制多边形

简介: 使用Qt绘制多边形

今天给大家简单介绍下Qt的绘图系统。

1 QPainter、QPaintDevice和QPaintEngine


Qt二维绘图系统,主要由三部分组成,QPainter、QPaintDevice和QPaintEngine类。

  • QPainter是一个绘图类,可以理解为现实中的画家,用户可以为这个画家指定画笔,画刷,让他为我们绘画矩形,圆形乃至更复杂的图形。
  • QPaintDevice是一个二维空间的抽象,比如QWidget就是继承该类的,所以凡是继承自QWidget的类,都可以让QPainter这个画家为你作画,该类可对比现实中的画板。
  • QPaintEngine可以认为它为QPainter和QPaintDevice之间提供了中间层接口,所以QPainter才可以在很多不同的设备之间使用同样的接口进行绘画,QPaintEngine类由QPainter和QPaintDevice在内部使用,一般不需要我们关注。


2 绘制多边形


Qt绘图,需要重新实现

void paintEvent(QPaintEvent* e);

在函数体中使用QPainter绘图。


下面,我们新建GUI项目PolygonGraph,继承自QWidget,类名为PolygonGraph,不需要勾选“创建ui界面”。

本例中绘制了一个六边形,并为每条边对应的区块填充了颜色。


polygongraph.h

#ifndef POLYGONGRAPH_H
#define POLYGONGRAPH_H
#include <QWidget>
class PolygonGraph : public QWidget
{
   Q_OBJECT
public:
   PolygonGraph(QWidget *parent = 0);
   ~PolygonGraph();
protected:
   //在保护成员中,重写paintEvent
   void paintEvent(QPaintEvent* e);
};
#endif // POLYGONGRAPH_H


polygongraph.cpp

#include <QtMath>
#include <QPainter>
#include "polygongraph.h"
PolygonGraph::PolygonGraph(QWidget *parent)
   : QWidget(parent)
{
}
PolygonGraph::~PolygonGraph()
{
}
void PolygonGraph::paintEvent(QPaintEvent *e)
{
   /*
    * 绘制多边形 本例中直接写的六边形
    * int   count  多边形的边数
    * float radius 多边形半径
    */
   int count = 6;
   int radius = 100;
   /*
    * 注意:
    * 在使用QPainter绘图之前,必须先指定绘图设备。
    * 下方指定的是在本窗口中绘制。
    * 如果没有指定绘图设备,则在之后的绘图中将无效。
    * 指定绘图设备的方法还可以使用begin() end()组合。
    * QPainter在同一时刻,只能在一个设备上绘制,如果将其切换至另一个设备,将是无效的。
    */
   QPainter painter(this);
   //设置为抗锯齿,并且设置画笔颜色为浅灰
   painter.setRenderHint(QPainter::Antialiasing);
   painter.setPen(Qt::lightGray);
   /*
    * 绘图设备的坐标原点(0,0)在左上角,水平向右增长,垂直向下增长。
    * 首先先平移坐标原点,让原点在绘图设备的中心
    */
   painter.translate(width()/2., height()/2.);
   //开始绘制多边形,并为每个区块上色
   for (int i = 0; i < count; ++i)
   {
       //设中心点到边的垂线与半径的夹角为degree=(360/count)/2即:
       float degree = 180./count;
       //先将坐标进行旋转,然后再绘制
       painter.rotate(2 * degree);
       //设边长的一半为wid,则wid = radius*sin(degree)
       //原点到边的距离为hei,则hei = radius*cos(degree)
       //在程序中三角函数都是以弧度为基准,所以要先将角度转化成弧度。
       //头文件要包含QtMath
       float radian = qDegreesToRadians(degree);
       float wid    = radius * qSin(radian);
       float hei    = radius * qCos(radian);
       //绘制该三角区块
       QPainterPath path;
       path.lineTo(-wid, -hei);
       path.lineTo(wid, -hei);
       path.lineTo(0, 0);
       painter.drawPath(path);
       //随机生成一个颜色,作为该区块的颜色,并上色
       QColor color(qrand()%255, qrand()%255, qrand()%255, 150);
       painter.fillPath(path, color);
   }
}


现在编译运行程序:


当我们改变窗口大小,切换进程都会发现图中的颜色发生变化,这是因为都会调用paintEvent进行重绘。


好的,今天的分享就到这里了,可能有些小伙伴对于程序中的坐标平移,旋转不是很明白,下篇文章,小豆君会详细讲解Qt的绘图的矩阵变换,敬请关注。


如果你想要获得更多干货,可关注我的微信公众号:小豆君,关注后还可加入C++\Qt交流群,一起学习。

相关文章
|
3月前
使用QT绘制一个多边形
使用QT绘制一个多边形
77 0
|
6月前
[Qt5] 矩形、圆和多边形ROI区域的交互(List View列表视图,halcon实现)
[Qt5] 矩形、圆和多边形ROI区域的交互(List View列表视图,halcon实现)
143 0
|
开发工具 C语言
Qt编写自定义控件7-自定义可拖动多边形
一、前言 自定义可拖动多边形控件,原创作者是赵彦博(QQ:408815041 zyb920@hotmail.com),创作之初主要是为了能够在视频区域内用户自定义可拖动的多个区域,即可用来作为警戒区域,也可用来其他的处理,拿到对应的多边形坐标集合,本控件的主要难点是如何计算一个点在一个多边形区域内,何时完成一个多边形区域,支持多个多边形。
864 0
|
4月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
181 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
3月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
88 0
|
2月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。
|
2月前
|
3月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
151 2
Qt开发网络嗅探器02
Qt开发网络嗅探器02
|
3月前
|
存储 运维 监控
Qt开发网络嗅探器01
Qt开发网络嗅探器01