Qt中QPainter与坐标的使用

目录
  • 一、坐标系统与坐标变换
    • 示例
  • 二、可缩放图形

一、坐标系统与坐标变换

坐标系统

QPainter坐标变换相关函数

分组 函数原型 功能
坐标变换 void translate(qreal dx,qreal dy) 坐标系统一定的偏移量,坐标原点平移到新的点
void rotate(qreal angle) 坐标系统顺时针旋转-一个角度
void scale(qreal sx,qreal sy) 坐标系统缩放
void shear(qrael sh,qreal sy) 坐标系统做扭转变换
状态保存与恢复 void save() 保存painter当前的状态,就是将当前状态压入栈
void restore() 恢复上一次状态,就是从堆栈中弹出上次的状态
void resetTransform() 复位所有的坐标变换

示例

绘制五角星

船舰widget窗口,只重载paintEvent函数

#include "widget.h"
#include "ui_widget.h"
#include <QPalette>
#include <QPainter>
#include <cmath>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setPalette(QPalette(Qt::white));
    setAutoFillBackground(true);
    resize(600,300);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter painter(this);
    QPen pen;                                      //笔
    pen.setStyle(Qt::SolidLine);
    painter.setPen(pen);
    painter.setRenderHint(QPainter::Antialiasing); //抗锯齿

    QBrush brush;                                  //刷子
    brush.setColor(Qt::yellow);
    brush.setStyle(Qt::SolidPattern);
    painter.setBrush(brush);

    //qreal deg = 3.141592*2/5;
    qreal deg = (360/5)*3.141592/180;
    qreal R=100;
    QPoint points[5] = {
        QPoint(R,0),
        QPoint(R*std::cos(deg),-R*std::sin(deg)),
        QPoint(R*std::cos(2*deg),-R*std::sin(2*deg)),
        QPoint(R*std::cos(3*deg),-R*std::sin(3*deg)),
        QPoint(R*std::cos(4*deg),-R*std::sin(4*deg)),
    };
    QPainterPath starPath;

    starPath.moveTo(points[3]);
    starPath.lineTo(points[1]);
    starPath.lineTo(points[4]);
    starPath.lineTo(points[2]);
    starPath.lineTo(points[0]);
    starPath.closeSubpath();

    QFont font;
    font.setPointSize(12);
    starPath.addText(points[0], font, "0");
    starPath.addText(points[1], font, "1");
    starPath.addText(points[2], font, "2");
    starPath.addText(points[3], font, "3");
    starPath.addText(points[4], font, "4");

    painter.setFont(font);
    painter.save();                  //保存
    painter.translate(100,120);
    painter.drawPath(starPath);
    painter.drawText(0,0,"S1");

    painter.restore();              //恢复
    painter.translate(300,120);
    painter.rotate(90);
    painter.scale(0.7,0.7);
    painter.drawPath(starPath);
    painter.drawText(0,0,"S2");

    painter.resetTransform();
    painter.translate(500,120);
    painter.rotate(-90);
    painter.scale(1.05,1.05);
    painter.drawPath(starPath);
    painter.drawText(0,0,"S3");
}

二、可缩放图形

视口: 绘图设备的任意一个矩形区域的物理坐标,可以只选取物理坐标的一个矩形区域用
于绘图
。视口默认情况下等于绘图设备的整个矩形区。
窗口: 对应于视口的矩形区域,只不过是用逻辑坐标定义的坐标系,窗口坐标的中心在矩
形中心。
使用窗口坐标绘制,不用管实际的物理大小

#include "widget.h"
#include "ui_widget.h"
#include <QPalette>
#include <QPainter>
#include <QLinearGradient>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setPalette(QPalette(Qt::white));
    setAutoFillBackground(true);
    resize(300,300);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    int W = QWidget::width();
    int H = QWidget::height();

    int side = qMin(W,H);
    QRect rect((W-side)/2,(H-side)/2, side,side);  //视口大小
    painter.drawRect(rect);
    painter.setViewport(rect);
    painter.setWindow(-100,-100,200,200);

    QLinearGradient linerGradient(0,0,100,0);     // 渐变
    linerGradient.setColorAt(0,Qt::yellow);
    linerGradient.setColorAt(1,Qt::green);
    linerGradient.setSpread(QGradient::PadSpread); //发散

    painter.setCompositionMode(QPainter::RasterOp_NotSourceXorDestination);
    painter.setBrush(linerGradient);
    for (size_t i=0; i<36; i++) {
        painter.drawEllipse(QPoint(50,0),50,50);
        painter.rotate(10);
    }
}

到此这篇关于Qt中QPainter与坐标的使用的文章就介绍到这了,更多相关Qt中QPainter与坐标内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PyQt5利用QPainter绘制各种图形的实例

    这个例子我做了好几天: 1)官网C++的源码,改写成PyQt5版本的代码,好多细节不会转化 2)网上的PyQt的例子根本运行不了 填了无数个坑,结合二者,终于能完成了一个关于绘图的东西.这个过程也掌握了很多新的知识点 [知识点] 1.关于多个点的使用 poitns = [QPoint(10, 80), QPoint(20, 10), QPoint(80, 30), QPoint(90, 70)] 请看: # 定义多个点 points = [QPoint(10, 80), QPoint(20, 1

  • pyqt5移动鼠标显示坐标的方法

    如下所示: # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import (QApplication, QMainWindow, QLabel) from PyQt5.QtCore import Qt class AppDemo(QMainWindow): def __init__(self): super(AppDemo, self).__init__() self.init_ui() def init_ui(self): sel

  • Qt编写地图之实现覆盖物坐标和搜索

    目录 一.前言 二.功能特点 三.体验地址 四.效果图 五.相关代码 一.前言 地图应用中有时候需要开启悬浮工具栏,用户可以直接在地图上绘制矩形.多边形.圆形.线条等,于是需要提供一个函数接口,能够获取到用户绘制的这些图形形状对应的信息.比如坐标点.圆形的中心点和半径.所有图形的路径Path坐标点集合,这些信息都是以经纬度坐标的形式.一般封装的类似功能的js函数一般有三种要求,第一种传入空值则表示找出所有覆盖物,第二种传入类型则找出所有该类型的覆盖物比如矩形,第三种传入对象名称则找出符合该名称的

  • Qt编写地图之实现经纬度坐标纠偏

    目录 一.前言 二.功能特点 三.体验地址 四.效果图 五.相关代码 一.前言 地图应用中都涉及到一个问题就是坐标纠偏的问题,这个问题的是因为根据地方规则保密性要求不允许地图厂商使用标准的GPS坐标,而是要用国家定义的偏移标准,或者在此基础上再做算法运算,所以这就出现了三种常规的坐标标准:GPS坐标(WGS-84,国际标准,谷歌地球软件,硬件GPS模块等).中国坐标偏移标准(GCJ-02,谷歌地图.腾讯地图.高德地图等).百度坐标偏移标准(BD-09,仅仅百度地图采用).由于不允许其他坐标转换成

  • Qt图形图像开发之曲线图表模块QChart库坐标轴和数据不对应、密集的散点图无法显示问题解决方法

    QChart坐标轴和数据不对应问题描述: lineseries->append(4, 10); lineseries->append(5, 8); Chart->addSeries(lineseries); // 将 series 添加至图表中 axisX->setRange(0, 15);//设置X的显示范围 axisY->setRange(-20, 20); lineChart->setAxisX(axisX);//把轴添加到图表中 lineChart->se

  • Qt使用QPainter绘制3D立方体

    本文实例为大家分享了使用QPainter绘制3D立方体的具体代码,供大家参考,具体内容如下 1.实现思路 (网上有另一篇类似的,不过他不是用的 Qt 自带的矩阵运算类) 实现思路有点类似使用 OpenGL 画立方体,先准备顶点数据: //立方体前后四个顶点,从右上角开始顺时针 vertexArr=QVector<QVector3D>{ QVector3D{1,1,1}, QVector3D{1,-1,1}, QVector3D{-1,-1,1}, QVector3D{-1,1,1}, QVec

  • Qt中QPainter与坐标的使用

    目录 一.坐标系统与坐标变换 示例 二.可缩放图形 一.坐标系统与坐标变换 坐标系统 QPainter坐标变换相关函数 分组 函数原型 功能 坐标变换 void translate(qreal dx,qreal dy) 坐标系统一定的偏移量,坐标原点平移到新的点 void rotate(qreal angle) 坐标系统顺时针旋转-一个角度 void scale(qreal sx,qreal sy) 坐标系统缩放 void shear(qrael sh,qreal sy) 坐标系统做扭转变换 状

  • QT中QChart绘制折线图

    目录 一.简单绘图 二.绘制折线图 实例 一.简单绘图 Qt Charts基于Qt的Graphics View架构,其核心组件是QChartView 和 QChart QChartView是显示图标的视图,基类为QGraphicsView QChart的基类是QGraphicsltem 类的继承关系: 创建项目:.pro文件中添加:QT += charts代码如下:其他文件未修改,修改代码只在mainwindow.cpp文件中进行.mainwindow.cpp #include "mainwin

  • Qt中PaintEvent绘制实时波形图的实现示例

    目录 绘制思路 1:接收硬件传入的数据 2:定时器动态刷新页面 3:真实数据处理 第一步:每进行一次数据更新,都需要剔除超时显示数据. 第二步:筛查有效数据,并记录 4:图形绘制 上一篇文章讲述了如何使用控件进行波形图绘制,虽然很方便,但是也有一些无法避免的问题,比如说:动态绘制图形时,想要流畅的进行波动,就必须按照特定的时间实时更换数据. 接来下,我们采用在paintEvent中绘制的方式进行实时波形图绘制,首先,我们先展示下显示效果吧! 数据来源依旧是硬件传入的实时数据,如下: [0, 3,

  • Qt中QPixmap、QImage、QPicture、QBitmap四者区别详解

    目录 前言 QPixmap&QImage QBitmap QPicture 参考: 前言 Qt 提供了四个类来处理图像数据:QImage.QPixmap.QBitmap 和 QPicture. QImage 是为 I/O 和直接像素访问和操作而设计和优化的,而 QPixmap 是为在屏幕上显示图像而设计和优化的. QBitmap只是一个继承QPixmap的便利类,保证深度为1.如果QPixmap对象是位图,isQBitmap()函数返回true,否则返回false.最后,QPicture 类是一

  • QT利用QPainter绘制三维饼状图

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 widget.h头文件 4.2 widget.cpp源文件 五.效果演示 一.项目介绍 本文介绍利用QPainter实现三维饼状图的绘制,由于Qt中没有三维饼状图的绘制组件,因此只能自行绘制. 二.项目基本配置 新建一个Qt案例,项目名称为“PieTest”,基类选择“QWidget”,取消选中创建UI界面复选框,完成项目创建. 三.UI界面设置 无UI界面 四.主程序实现 4.1 widget.h头文件 头文件中只

  • Qt使用QPainter实现自定义圆形进度条

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 roundprogressbar.h和roundprogressbar.cpp 4.2 widget.h头文件 4.3 widget.cpp源文件 五.效果演示 一.项目介绍 本文介绍利用QPainter实现自定义圆形进度条. 二.项目基本配置 新建一个Qt案例,项目名称为“RoundprogressbarTest”,基类选择“QWidget”,点击选中创建UI界面复选框,完成项目创建. 三.UI界面设置 UI界面如

  • 深入理解Qt中各种消息框对话框的使用

    最近在学习Qt框架,今天学习了一下消息框的使用, 现整理出来以作记录. 在程序运行时,经常需要提示用户一些信息,比如警告啊,提示啊,建议啊之类的东西.这些东西基本上是通过消息框与用户进行交互的,Qt中主要是用QMessageBox类来加以实现的. 消息框一般分为七种: Question询问消息框:为正常的操作提供一个简单的询问 Information信息消息框:为正常操作提供一个提示 Warning提示消息框:提醒用户发生了一个错误 Critical警告消息框:警告用户发生了一个严重错误 Abo

  • 浅谈Qt中使用CEF的几个要点(Windows下)

    最近项目中要在Qt中使用CEF(Chromium Embedded Framework),在这里总结下其中的几个要点. 下载合适的CEF版本 关于CEF的简介我们这里就不做介绍了,下载CEF可以有2种选择: 1.源码:强烈不建议下载源代码并编译构建(学习代码除外),下载源码需要你FQ.有良好的网速(要下载)和足够的耐心(据说有4.5个G,真的要下半天). 2.自动构建版本:推荐这个使用这个版本.该版本提供了大部分已经编译完成的动态库及资源,只需要开发者手动编译一个wrapper静态库就可以了.这

  • 在Qt中正确的设置窗体的背景图片的几种方法总结

    Qt中正确的设置窗体的背景图片的方法大致有两种,下面将逐个讲解: 一. 利用styleSheet设置窗体的背景图片 使用stylesheet设置窗体的背景图片的时候,可以直接按照下图的操作去进行即可,如下图所示: 但是,需要注意的是: 1.在QWidget中这种方法是不行的,如果你足够细心的话,你会发现使用同样的设置背景图片的方法,背景图片其实并没有发生真实改变,但是它的子窗体背景图片是会发生改变的. 其实我们可以通过在添加一个i额QWidget来解决这个问题,即在QtDesigner中添加一个

  • python 截取XML中bndbox的坐标中的图像,另存为jpg的实例

    文件目录 Annotations中是XML文件. JPEGImages中是对应的JPG文件 XML文件 要截取bndbox坐标中的内容. python代码 # -*- coding: utf-8 -*- # @Time : 2020/2/8 22:14 # @Author : SanZhi # @File : get_xml.py # @Software: PyCharm import cv2 import numpy as np import xml.dom.minidom import os

随机推荐