使用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交流群,一起学习。

相关文章
|
2月前
[Qt5] 矩形、圆和多边形ROI区域的交互(List View列表视图,halcon实现)
[Qt5] 矩形、圆和多边形ROI区域的交互(List View列表视图,halcon实现)
74 0
|
开发工具 C语言
Qt编写自定义控件7-自定义可拖动多边形
一、前言 自定义可拖动多边形控件,原创作者是赵彦博(QQ:408815041 zyb920@hotmail.com),创作之初主要是为了能够在视频区域内用户自定义可拖动的多个区域,即可用来作为警戒区域,也可用来其他的处理,拿到对应的多边形坐标集合,本控件的主要难点是如何计算一个点在一个多边形区域内,何时完成一个多边形区域,支持多个多边形。
835 0
|
2月前
|
网络协议 C++
C++ Qt开发:QTcpSocket网络通信组件
`QTcpSocket`和`QTcpServer`是Qt中用于实现基于TCP(Transmission Control Protocol)通信的两个关键类。TCP是一种面向连接的协议,它提供可靠的、双向的、面向字节流的通信。这两个类允许Qt应用程序在网络上建立客户端和服务器之间的连接。Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QTcpSocket`组件实现基于TCP的网络通信功能。
67 8
C++ Qt开发:QTcpSocket网络通信组件
|
2月前
|
算法 编译器 Linux
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
57 0
|
11天前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
31 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
26天前
|
关系型数据库 MySQL 项目管理
数据库大作业——基于qt开发的图书管理系统(四)项目目录的整理与绘制登录页面
数据库大作业——基于qt开发的图书管理系统(四)项目目录的整理与绘制登录页面
|
26天前
|
SQL 关系型数据库 MySQL
数据库大作业——基于qt开发的图书管理系统(三)Qt连接Mysql数据库
数据库大作业——基于qt开发的图书管理系统(三)Qt连接Mysql数据库
|
26天前
|
SQL 数据可视化 关系型数据库
数据库大作业——基于qt开发的图书管理系统(二) 相关表结构的设计
数据库大作业——基于qt开发的图书管理系统(二) 相关表结构的设计
|
26天前
|
安全 BI 数据库
数据库大作业——基于qt开发的图书管理系统 (一)环境的配置与项目需求的分析
数据库大作业——基于qt开发的图书管理系统 (一)环境的配置与项目需求的分析
|
2月前
|
区块链
【qt】最快的开发界面效率——混合编程3
【qt】最快的开发界面效率——混合编程
50 1