QPainter类

Qt的QPainter详细介绍 QPainter是Qt框架中的一个类,主要用于在各种设备上进行2D图形绘制,如窗口、位图、打印设备等。它提供了一系列绘图函数,可以实现绘制点、线、曲线、形状、文本、图像以及复杂的绘画操作。使用QPainter创建一个QPainter对象。将QPainter与要绘图的设备(如QPixmapQImage或QWidget)关联起来,通过调用begin()函数。使用QPainter提供的绘图函数进行绘图,如drawLine()drawRect()drawText()等。绘制完毕后,调用end() 阅读详情

QPainter类用于在控件和其它绘图设备上进行绘制。


Header: #include <QPainter>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
Inherited By:

QStylePainter


详细说明>>>


【公共类型】

class

PixmapFragment

这个类用于在 QPainter::drawPixmapFragments() 函数中绘制一个像素图。

enum

CompositionMode { CompositionMode_SourceOver, CompositionMode_DestinationOver, CompositionMode_Clear, CompositionMode_Source, CompositionMode_Destination, …, RasterOp_SourceOrNotDestination }

合成模式的枚举

enum

PixmapFragmentHint { OpaqueHint }

透明模式枚举(本质上只是一个开关)

flags

PixmapFragmentHints

返回当前透明模式

enum

RenderHint { Antialiasing, TextAntialiasing, SmoothPixmapTransform, VerticalSubpixelPositioning, LosslessImageRendering, NonCosmeticBrushPatterns }

渲染设置

flags

RenderHints

返回渲染设置状态


【公有函数 】

QPainter()
构造空painter。
QPainter(QPaintDevice *device)

在绘制设备device构造一个painter并可以立即绘制。 此构造函数对只使用一次绘制很方便。例如在QWidget::paintEvent()中,构造函数为您调用begin(),而QPainter析构函数自动调用end()。

下面是一个使用 begin() 和 end()的示例:

使用此构造函数的相同示例:

由于painter初始化失败时,构造函数无法提供反馈,因此您应该使用 begin() 和 end() 在外部设备(例如打印机)上绘画。

/ ~QPainter()
const QBrush &

background() const

返回当前背景笔刷。
Qt::BGMode

backgroundMode() const

返回当前背景模式(只有两种:透明Qt::TransparentMode或不透明Qt::OpaqueMode)
bool

begin(QPaintDevice *device)

在绘制设备上开始绘制,成功返回true;失败返回false。

注意:所有的绘图设置(setPen(),setBrush()等)在此函数调用时,都会被重置为默认值。 可能发生的错误是严重的问题,例如:

注意:大多数情况都可以使用构造函数来代替 begin(),并且end() 会在析构时自动完成的。

警告:一个绘图设备一次只能由一个painter进行绘画。

警告:不支持在格式为QImage::Format_Indexed8的QImage上绘制。

void beginNativePainting()

刷新绘制管道并为用户直接向底层图形上下文发出命令做准备。必须后跟对endNativePainting()的调用。

请注意,只有基础绘制引擎更改的状态才会重置为其各自的默认状态。我们重置的状态可能会因版本而异,以下状态当前在OpenGL 2引擎中被重置:

禁用blending(混合)。

禁用depth(深度),stencil(图案),scissor tests(剪式测试)。

active texture unit(活动纹理单元)重置为0。

depth mask(深度遮罩), depth function(深度函数)和 clear depth(清除深度)重置为默认值。

stencil mask(模板掩码), stencil operation(模板操作)和 stencil function(模板功能)重置为默认值。

current color(当前颜色)重置为纯白色。

例如,如果用户在beginNativePaint()/endNativePainting()块内更改了OpenGL多边形模式,则endNativePainting()不会将其重置为默认状态。以下示例显示了painter命令和原始OpenGL命令的混合:

QRectF boundingRect(const QRectF &rectangle, int flags, const QString &text)

使用当前设置的font()返回带有指定标志 flags 的 text 在给定矩形rectangle内绘制时的边框;也就是说,当给定相同的参数时,该函数告诉您drawText()函数将在哪里绘制。 如果 text 不适合使用指定标志 flags 的给定矩形rectangle,则该函数返回所需的矩形。 flags参数是以下标志的按位“或”运算:

如果设置了几个水平对齐标志或几个垂直对齐标志,则对齐结果是未定义的。

QRect boundingRect(const QRect &rectangle, int flags, const QString &text)
重载。使用当前设置的font()返回带有指定标志flags的text在给定矩形内rectangle绘制时的边框。
QRect boundingRect(int x, int y, int w, int h, int flags, const QString &text)
重载。返回给定文本的边框,它将在从点(x,y)开始、宽度为w、高度为h的矩形内绘制。
QRectF boundingRect(const QRectF &rectangle, const QString &text, const QTextOption &option = QTextOption())
这个重载函数没有将标志指定为Qt::AlignmentFlag 和 Qt::TextFlag的按位OR,而是采用一个option选项参数。QTextOption 类提供了对常规富文本属性的描述。
const QBrush & brush() const
返回painter的当前画笔。
QPoint brushOrigin() const
返回当前设置的画笔原点。
QRectF clipBoundingRect() const

如果有剪辑,则返回当前剪辑的边框;否则返回一个空矩形。

注意剪辑区域是以逻辑坐标给出的。

边框不能保证是紧密的。

QPainterPath clipPath() const

返回逻辑坐标中的当前剪辑路径。

警告:QPainter不会显式存储组合剪辑,因为这是由底层QPaintEngine处理的,因此会根据需要重新创建路径并将其转换到当前逻辑坐标系。这可能是一个昂贵的操作。

QRegion clipRegion() const
返回当前设置的剪辑区域。注意剪辑区域是以逻辑坐标给出的。【警告同上】
QTransform combinedTransform() const
返回组合当前窗口/视口和世界变换的变换矩阵。

QPainter::

CompositionMode

compositionMode() const
返回当前合成模式。
QPaintDevice * device() const
返回此 painter当前正在其上绘画的设备,如果painter未处于活动状态,则返回nullptr。

const

QTransform &

deviceTransform() const

返回从逻辑坐标转换到平台相关绘画设备的设备坐标的矩阵。

只有在平台相关句柄 (Qt::HANDLE)上使用平台绘制命令时才需要此函数,并且平台本身不进行转换。 可以查询QPaintEngine::PaintEngineFeature 枚举来确定平台是否执行转换。

void drawArc(const QRectF &rectangle, int startAngle, int spanAngle)

绘制由给定矩形rectangle、startAngle和spanAngle定义的弧线。

startAngle(起始角度)和spanAngle(跨度角度)必须指定为1/16度,即一个完整的圆等于5760(16 * 360)。角度的正值表示逆时针方向,负值表示顺时针方向。零度在3点钟位置。

void drawArc(const QRect &rectangle, int startAngle, int spanAngle)
重载,功能同上。
void drawArc(int x, int y, int width, int height, int startAngle, int spanAngle)
从(x,y)开始,以指定的宽度w和高度h以及给定的起始角度startAngle和跨度角度spanAngle绘制由矩形定义的圆弧。
void drawChord(const QRectF &rectangle, int startAngle, int spanAngle)

绘制由给定矩形rectangle、起始角度startAngle和跨度角度spanAngle定义的弦,弦由当前画笔填充brush()。

void drawChord(int x, int y, int width, int height, int startAngle, int spanAngle)
以指定的宽度和高度以及给定的起始角度和跨度角度绘制由从(x,y)开始的矩形定义的弦。
void
QPainter绘图类简单介绍 Qt的二维绘图功能是使用QPainter在绘图设备上绘图,绘图设备包括QWidget、QPixmap、QPainter、QImge等,作为Qt的三大基类之一的QWidget是最常见的绘图设备,QWideget类及其派生的子类,都有一个事件处理函数paintEvent(),在组件界面或者当前类的界面需要绘图时,就要重写这个绘图的事件处理函数,当有绘图指令时,系统会自动运行paintEvent()函数进行绘制图形。例如:在别的函数中QPainter的对象的构造函数参数是this,那么图形不能绘制到窗体。 阅读详情

相关推荐

Qt绘图(2D)讲解-QPainter类、QPen类、QBrush类及QGradient类

指定绘图设备并开始绘制,此步骤也可在 QPainter的构造函数中完成。注意:每次调用begin()函数都会把QPainter 的设置重置为默认值。2D 绘图主要是 QPainter、QPaintDevice、QPaintEngine 三个类,主要类的作用(其关系见图示)调用QPainter::begin(QPaintDevice。以上代码与以下代码等效。

qq_37464701的博客 625

QT中用QPainter类所画图像随窗口变化自适应变化

Qpainter类是QT中的一个画图类。该类是用画笔在窗口上直接绘制图像。通常情况下,图像的位置和大小在画图完成后就是定死的了。在实际应用中我们有时需要该图像随着窗口的拖动、最大化等操作下进行自适应变化。下面提出两种可以使所画图像可以随窗口自适应变化的方法。 第一种方法,用Qpainter类中的scale函数。代码如下: QPainter painter(this); static dou

star_kai的博客 1万+

QPainter类使用详解

QPainter类提供了许多高度优化的函数去做大部分的GUI绘制工作。它可以画从简单的线到复杂的形状。通常情况下,QPainter的使用是在widget当中的painter事件使用。记得在执行完之后要及时销毁QPainter的对象。   void SimpleExampleWidget::paintEvent(QPaintEvent *) { QPainter painter(

程序猿老樊的博客 2万+

Qt基础-QPainter 类详解

Qt的QPainter 类详解

qq_30725967的博客 646

PyQt5常用控件之QPainter类、QPen类、QBrush类

QPainter类 Qpainter,QPen,QBrush这三个类实现绘图功能,Qpainter类在QWidget(控件)上执性绘图操作,它是一个绘制工具,为大部分图形化界面提供了高度优化的函数,使QPainter类可以绘制从简单的直线到复杂的饼图等。 绘制操作在QWidget.paintEvent()中完成,绘制方法必须放在QtGui.QPainter对象的begin()和end()之间。QPainter类在控件或其他绘图设备上执行较低级别的图像绘制功能。 此外,QPixmap的作用是加载并呈现本地图.

CJW的博客 1334

QT绘图系统深入解析:QPainter类实战指南

QT是一个跨平台的C++应用程序框架,广泛用于开发图形用户界面(GUI)程序,同时它也支持在多种操作系统上的非GUI程序。QT提供了一套丰富的API,涵盖网络、数据库、XML、OpenGL等功能模块,其中,QPainter是QT中用于矢量图形和位图绘制的核心类。当需要对图形进行更复杂的变换时,例如使用自定义的变换矩阵,可以使用QTransform类。该类允许开发者自由定义2D变换,包括仿射变换。例如,以下代码展示了如何使用QTransform。

weixin_42513870的博客 527

断点回归(regression discontinuity design)学习笔记

本篇博文主要是对断点回归的一些学习和总结~ 学习材料如下: 1 断点回归设计RDD分类与操作案例 2 RDD断点回归, Stata程序百科全书式的宝典 3 断点回归设计的前沿研究现状, RDD 4 让“跳跃”更有意义:断点回归设计(RDD) 5 Stata: 断点回归 (RDD) 教程 6 怎么用通俗的语言解释断点回归?它与DID的区别是什么 7 Watering Down Environmental Regulation in China,Guojun He, Shaoda Wang, Bing Zhan

Claire_chen_jia的博客 9万+

【Solidworks学习使用(1)__2022版本保姆级安装方法】

Solidworks 2020安装

coder-kimbell的博客 6256

Android车载多屏开发实战:从零搭建同显/异显Demo(附源码)

本文详细介绍了Android车载多屏开发的实战经验,从零搭建同显/异显Demo,涵盖多屏模拟、核心API调用、同显/异显架构实现及性能优化等关键环节。通过C++构建完整开发链路,帮助开发者快速掌握多屏同显和多屏异显技术,提升智能座舱系统的交互体验。附源码供参考。

weixin_29233857的博客 404

DC综合中set_dft_signal的实战配置与优化策略

本文深入解析了DC综合中set_dft_signal命令的实战配置与优化策略。文章从命令的核心作用出发,详细拆解了-view、-type、-usage等关键参数,并通过扫描使能与时钟门控的实战案例,展示了如何正确配置以实现测试模式下的功耗优化。同时,文章总结了高级优化策略、与低功耗流程的协同方法以及常见错误排查清单,旨在帮助数字芯片设计工程师构建高可测性、低功耗的稳健DFT基础。

weixin_28347369的博客 403

AI大模型探索之路-应用篇11:AI大模型应用智能评估(Ragas)

随着人工智能技术的飞速发展,AI大模型(LLM)已经成为了推动技术创新和应用的关键因素。这些大模型在语言理解、图像识别、自然语言生成等领域展现出了惊人的能力。然而,随着模型规模的增大,它们对计算资源的消耗、环境适应性、模型稳定性、安全性和可解释性等方面也提出了新的挑战。因此,对AI大模型进行智能评估变得至关重要,以确保它们在实际应用中的稳定性、可靠性和有效性。本文将详细介绍Ragas框架,一个专为AI大模型设计的智能评估工具。

寻道AI,探索AI无限可能! 5546

Open3D——直通滤波(python详细过程版)【2025最新版】

python就一个字:强。博客长期更新,本文最近更新时间为:2025年1月11日。

点云侠的博客 7516

贝叶斯时空模型-INLA-4

该文章中,会简化数学计算的过程,主要是针对,在有数据的基础上,如何应用贝叶斯时空模型,找出影响因素,绘制时间变化的空间分布预测图。上述中关键一步与前几期介绍的不一样的地方是,我们加入了n.group参数,用来指定年份,先看一下Year有多少年的,然后封装在s.index里面。在前述的内容中,我们介绍了,如何处理空间的数据,利用海拔高度预测降雨量的例子。建立好数据及mesh以后,我们现在写INLA公式,如果不考虑残差项,那就是固定效应,现在我们增加残差项,及空间与时间效应。这里的Mesh设定值为10,20。

学习中 2948

【EB_Tresos专题】-06-配置一个UDS诊断DID

<--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> 结尾 ...

「汽车电子助手」的博客 4085

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: QPicture类
下一篇: QPainter【详细描述】
floatbit
博客等级 码龄24年 460粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值