范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Qt绘制系统

  Qt绘制系统简介##
  Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。 QPainter用来执行绘制的操作; QPaintDevice是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间; QPaintEngine提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口。QPaintEngine类应用于QPainter和QPaintDevice之间,通常对开发人员是透明的。除非你需要自定义一个设备,否则你是不需要关心QPaintEngine这个类的。
  我们可以把QPainter理解成画笔;把QPaintDevice理解成使用画笔的地方,比如纸张、屏幕等;而对于纸张、屏幕而言,肯定要使用不同的画笔绘制,为了统一使用一种画笔,我们设计了QPaintEngine类,这个类让不同的纸张、屏幕都能使用一种画笔。 程序###
  main.cpp #include  #include "paint.h"  int main(int argc, char **argv) {     QApplication a(argc, argv);     PaintedWidget mywindow;     mywindow.show();     return a.exec(); }
  paint.h #include  #include   class PaintedWidget : public QWidget {     Q_OBJECT public:     PaintedWidget(QWidget *parent = 0); protected:     void paintEvent(QPaintEvent *); };
  paint.cpp #include "paint.h" PaintedWidget::PaintedWidget(QWidget *parent) :     QWidget(parent) {     resize(400, 400);     setWindowTitle(tr("Paint Demo")); }  void PaintedWidget::paintEvent(QPaintEvent *) {     QPainter painter(this);     QPen pen(Qt::green, 3, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin);     painter.setPen(pen);     painter.drawLine(80, 100, 300, 300);     painter.setPen(Qt::red);     painter.drawRect(10, 10, 100, 300);     painter.setPen(QPen(Qt::green, 5));     painter.setBrush(Qt::blue);     painter.drawEllipse(50, 150, 200, 100); }
  在构造函数中,我们仅仅设置了窗口的大小和标题。
  paintEvent()函数则是绘制的代码。首先,我们在栈上创建了一个QPainter对象,也就是说,每次运行paintEvent()函数的时候,都会重建这个QPainter对象。QPainter接收一个QPaintDevice指针作为参数。QPaintDevice有很多子类,比如QImage,以及QWidget。QPaintDevice可以理解成要在哪里去绘制,而现在我们希望画在这个组件,因此传入的是 this 指针。
  注意,这一点可能会引发某些细节问题:由于我们每次重建QPainter,因此第一次运行时所设置的画笔颜色、状态等,第二次再进入这个函数时就会全部丢失。有时候我们希望保存画笔状态,就必须自己保存数据,否则的话则需要将QPainter作为类的成员变量。paintEvent() 作为重绘函数,会在需要重绘时由 Qt 自动调用。"需要重绘"可能发生在很多地方,比如组件刚刚创建出来的时候就需要重绘;组件最大化、最小化的时候也需要重新绘制;组件由遮挡变成完全显示的时候也需要等等。 程序运行结果###
  画刷和画笔##
  Qt 绘图系统定义了两个绘制时使用的关键属性:画刷和画笔。前者使用QBrush描述,大多用于填充;后者使用QPen描述,大多用于绘制轮廓线。 画刷###画刷的style()定义了填充的样式,使用Qt::BrushStyle枚举,默认值是Qt::NoBrush,也就是不进行任何填充。我们可以从下面的图示中看到各种填充样式的区别: 画刷的color()定义了填充模式的颜色。这个颜色可以是 Qt 预定义的颜色常量,也就是Qt::GlobalColor,也可以是任意QColor对象。 画刷的gradient()定义了渐变填充。这个属性只有在样式是Qt::LinearGradientPattern、Qt::RadialGradientPattern或者Qt::ConicalGradientPattern之一时才有效。渐变可以由QGradient对象表示。Qt 提供了三种渐变:QLinearGradient、QConicalGradient和QRadialGradient,它们都是QGradient的子类。我们可以使用如下代码片段来定义一个渐变的画刷:         QPainter painter(this);         QLinearGradient linearGradient(200, 50, 300, 50);         linearGradient.setColorAt(0, Qt::red);         linearGradient.setColorAt(1, Qt::green);         painter.setBrush(linearGradient);         painter.drawEllipse(QPointF(250, 50), 50, 50);          QRadialGradient radialGradient(QPointF(50, 50), 50, QPointF(50, 50));         radialGradient.setColorAt(0, QColor(255, 255, 100, 150));         radialGradient.setColorAt(1, QColor(0, 0, 0, 50));         painter.setBrush(radialGradient);         painter.drawEllipse(QPointF(50, 50), 50, 50);          QConicalGradient conicalGradient(QPointF(150, 50), 60);         conicalGradient.setColorAt(0.2, Qt::white);         conicalGradient.setColorAt(0.9, Qt::black);         painter.setBrush(conicalGradient);         painter.drawEllipse(QPointF(150, 50), 50, 50);
  运行结果如下:
  画刷样式是 Qt::TexturePattern时,texture()定义了用于填充的纹理。注意,即使你没有设置样式为Qt::TexturePattern,当你调用setTexture()函数时,QBrush会自动将style()设置为Qt::TexturePattern。     QPainter painter(this);     QBrush brush;     brush.setTexture(QPixmap("image.jpg"));     painter.setBrush(brush);     painter.drawEllipse(50, 100, 300, 200);
  运行结果:
  画笔###
  QPen定义了用于QPainter应该怎样画线或者轮廓线。
  画笔具有样式、宽度、画刷、笔帽样式和连接样式等属性。 1.画笔的样式style()定义了线的样式。画刷brush()用于填充画笔所绘制的线条。 2.笔帽样式capStyle()定义了使用QPainter绘制的线的末端; 3.连接样式joinStyle()则定义了两条线如何连接起来。 4.画笔宽度width()或widthF()定义了画笔的宽。注意,不存在宽度为 0 的线。
  注:假设你设置 width 为 0,QPainter依然会绘制出一条线,而这个线的宽度为 1 像素。也就是说,画笔宽度通常至少是 1 像素。
  这么多参数既可以在构造时指定,也可以使用 set 函数指定,完全取决于你的习惯,例如: QPainter painter(this); QPen pen(Qt::green, 3, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin); painter.setPen(pen);
  等价于 QPainter painter(this); QPen pen;  // creates a default pen  pen.setStyle(Qt::DashDotLine); pen.setWidth(3); pen.setBrush(Qt::green); pen.setCapStyle(Qt::RoundCap); pen.setJoinStyle(Qt::RoundJoin);  painter.setPen(pen);
  使用构造函数的优点是代码较短,但是参数含义不明确;使用 set 函数则正好反过来。
  默认的画笔属性是纯黑色,0 像素,方形笔帽(Qt::SquareCap),斜面型连接(Qt::BevelJoin)。 1.下面是画笔样式的示例:####
  你也可以使用setDashPattern()函数自定义样式,例如如下代码片段:  QPen pen;  QVector dashes;  qreal space = 4;  dashes << 1 << space << 3 << space << 9 << space         << 27 << space << 9 << space;  pen.setDashPattern(dashes); 2.笔帽定义了画笔末端的样式,例如:####
  他们之间的区别是,Qt::SquareCap是一种包含了最后一个点的方形端点,使用半个线宽覆盖;Qt::FlatCap不包含最后一个点;Qt::RoundCap是包含最后一个点的圆形端点。具体可以参考下面的示例(出自《C++ GUI Programming with Qt 4, 2nd Edition》):
  3.连接样式定义了两条线连接时的样式,例如:####
  同样,可以参考下面图示来理解这几种连接样式的细节(出自《C++ GUI Programming with Qt 4, 2nd Edition》):
  反走样##
  我们在光栅图形显示器上绘制非水平、非垂直的直线或多边形边界时,或多或少会呈现锯齿状外观。这是因为直线和多边形的边界是连续的,而光栅则是由离散的点组成。在光栅显示设备上表现直线、多边形等,必须在离散位置采样。由于采样不充分重建后造成的信息失真,就叫走样;用于减少或消除这种效果的技术,就称为反走样。
  反走样是图形学中的重要概念,用以防止通常所说的"锯齿"现象的出现。很多系统的绘图 API 里面都内置了有关反走样的算法,不过由于性能问题,默认一般是关闭的,Qt 也不例外。下面我们来看看代码: void paintEvent(QPaintEvent *) {         QPainter painter(this);         painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap));         painter.setBrush(Qt::yellow);         painter.drawEllipse(100, 50, 200, 150);          painter.setRenderHint(QPainter::Antialiasing, true);         painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap));         painter.setBrush(Qt::yellow);         painter.drawEllipse(100, 220, 200, 150); }
  显然,我们通过这条语句,将Antialiasing属性(也就是反走样)设置为 true。经过这句设置,我们就打开了QPainter的反走样功能。还记得我们曾经说过,QPainter是一个状态机,因此,只要这里我们打开了它,之后所有的代码都会是反走样绘制的了。
  点击领取Qt学习资料+视频教程~「链接」
  坐标变换###
  前面说过,QPainter是一个状态机。那么,有时我想保存下当前的状态:当我临时绘制某些图像时,就可能想这么做。当然,我们有最原始的办法:将可能改变的状态,比如画笔颜色、粗细等,在临时绘制结束之后再全部恢复。对此,QPainter提供了内置的函数:save()和restore()。save()就是保存下当前状态;restore()则恢复上一次保存的结果。这两个函数必须成对出现:QPainter使用栈来保存数据,每一次save(),将当前状态压入栈顶,restore()则弹出栈顶进行恢复。
  在了解了这两个函数之后,我们就可以进行示例代码了: void PaintDemo::paintEvent(QPaintEvent *) {         QPainter painter(this);         painter.fillRect(10, 10, 50, 100, Qt::red);         painter.save();         painter.translate(100, 0); // 向右平移 100px         painter.fillRect(10, 10, 50, 100, Qt::yellow);         painter.restore();         painter.save();         painter.translate(300, 0); // 向右平移 300px         painter.rotate(30); // 顺时针旋转 30 度         painter.fillRect(10, 10, 50, 100, Qt::green);         painter.restore();         painter.save();         painter.translate(0, 100); // 向下平移 100px         painter.scale(2, 2); // 横坐标单位放大 2 倍,纵坐标放大 2 倍         painter.fillRect(10, 10, 50, 100, Qt::blue);         painter.restore();         painter.save();         painter.translate(200, 100); // 向右平移 200px 向下平移 100px         painter.shear(0, 1); // 横向不变,纵向扭曲 1 倍         painter.fillRect(10, 10, 50, 100, Qt::cyan);         painter.restore(); }
  Qt 提供了四种坐标变换:平移 translate,旋转 rotate,缩放 scale 和扭曲 shear。在这段代码中,我们首先在 (10, 10) 点绘制一个红色的 50 100 矩形。保存当前状态,将坐标系平移到 (100, 0),绘制一个黄色的矩形。注意,translate()操作平移的是坐标系,不是矩形。因此,我们还是在 (10, 10) 点绘制一个 50 100 矩形,现在,它跑到了右侧的位置。然后恢复先前状态,也就是把坐标系重新设为默认坐标系(相当于进行translate(-100, 0)),再进行下面的操作。之后也是类似的。由于我们只是保存了默认坐标系的状态,因此我们之后的translate()横坐标值必须增加,否则就会覆盖掉前面的图形。所有这些操作都是针对坐标系的,因此在绘制时,我们提供的矩形的坐标参数都是不变的。
  运行结果如下:
  窗口坐标###void PaintDemo::paintEvent(QPaintEvent *) {     QPainter painter(this);     painter.setWindow(0, 0, 200, 200);     painter.fillRect(0, 0, 200, 200, Qt::red); }
  运行结果:
  原本窗口大小为400 400,但这里利用setWindow重新分配了窗口坐标为200 200,即便拖动窗口大小红色矩形也会覆盖整个窗口,由于setWindow将窗口的左上角固定位(0,0)窗口的右下角固定为(200,200)。此时再画矩形就是在这个窗口坐标下画。 视口坐标###    QPainter painter(this);     painter.setWindow(0, 0, 200, 200);     painter.setViewport(100, 100, 100, 100);     painter.fillRect(0, 0, 200, 200, Qt::red);
  利用setVieweport将窗口映射到视口。

5月销量数据出炉,比亚迪历史性突破,丰田赛那销量翻身乘联会近日公布了国内车市的最新销量数据,从销量数据来看,自主品牌在今年势头非常猛,不少原本属于合资品牌的市场遭到了自主品牌的强烈冲击。接下来我们一起来看看5月国内车市的具体销量情况巴西第二!大数据世界杯夺冠率,葡萄牙遭无视,榜首引发争议北京时间6月15日讯本届世界杯的32强已经全部出炉,而有关世界杯话题的热度也提前开始预热。根据StatsPerform的大数据模型预测,本届世界杯的夺冠概率排行榜被公布了出来。排在中兴Axon40Ultra惊喜不断,中兴Axon30沦为百元机悲惨让路中兴Axon40Ultra是一款将科技与美感完美结合的商务旗舰。正面配备了来自国内制造商BOE的6。8英寸曲面大屏幕。采用最新的第三代屏下摄像头技术,表面无开孔。超窄边框,大曲率,最新汇总北京这些演出延期或取消!景区交通运营最新调整根据疫情防控工作要求和部署,目前北京市部分景区地下密闭空间经营场所演出和公共交通运营等有所调整,市民出行请注意。01hr景区运营调整16月15日起,邑仕庄园关闭地下场馆,地上场馆及小龙虾价格低到冰点,但是却很少有人买,了解原因后,扎心了到了夏天以后,夜市摊上最不可缺少的就是小龙虾,小龙虾可以说是在中国混的最惨,如果让他重新选择的话,他肯定不会来到中国,虽然小龙虾的繁殖能力比较强,但是在中国,一直都是供不应求的状态618买手机,预算15002000,五款优质旗舰推荐,闭眼买不吃亏接着上期,本次我们继续618手机购买攻略的话题,本次我们要说的是15002000价位的高素质手机,说实话,这个价格段的产品,和10001500价位的产品难免会有一定交叉,不过核心配Motoedgespro用原相机和谷歌相机夜拍同一场景今晚试了一下用原相机和谷歌相机手持拍摄的同一场景。图1是原相机直接拍摄,场景大致是肉眼所见的样子。图2开启了原相机的夜景模式拍摄,效果如白昼所见,只是模糊些。图3是用谷歌相机拍的,2022年15款最适合儿童的相机摄影爱好者摄影杂志摄影技巧摄影知识任何拥有相机的人都可以告诉您摄影的魔力,无论他们的年龄如何。当他们从小开始时,最重要的是要满足他们拍照的热情。但是,为孩子们找到最好的相机可能很棘预算20002500,618值得推荐的五款旗舰,性能给力,一机用三年上期我们推荐了5款2002500价位的高性价比旗舰给大家。不少网友都意犹未尽。为了满足大家的需求,本期618手机购买攻略,我们将重点介绍25003000价位值得推荐的优质手机,这些618手机买对不买贵,预算2000元上下参考这4款,耗电少性能强越贵的手机理论肯定越好用,但是我们真需要那么贵的手机吗?如果只是普通用户,平时就是看视频打游戏刷新闻聊天等等,其实如果你的预算不足,真没必要一步到位去考虑旗舰机,现在2000元上下(一)佳能相机的三大品牌介绍及关系佳能旗下其实还有三个相机品牌,分别为EOSPowerShot和IXUS。PowerShotIXUSEOSR6其中,EOS相机为可换镜头相机,包括单反和微单。PowerShot相机和
六一寄语女儿,我要对你说六hr一hr寄语孩提是最幸福的时光,童年往往最令人向往,童真童趣令我们终身难忘。又是一季儿童节,让我们抽出些许光阴,重温儿时的梦想,紧握前行的方向!作为一名人民警察,对女儿的爱和其郎平穿红衣状态好,女儿成为牵挂,在美国寄语高考学生随着中国女排在国家联赛上取得胜利,郎平在国家队的影响力在逐渐变小,包括赖亚文的离队,整个影响中国女排长达10年的这个团队也正式解散。如今的郎平也正式回归生活,成了一个名副其实的退休中国女排出征!张常宁寄语队伍完成既定目标,离退役仅差一个官宣中国女排已经顺利抵达土耳其安卡拉,准备世界联赛的首场比赛。但这一次中国女排世界联赛,无论是参赛目的还是受关注程度,都与以往完全不同。因为中国女排刚刚完成重建,无论是成绩还是演练阵容SpaceX在星箭基地会见NASA阿尔忒弥斯团队,新火箭比土星五号还牛美国宇航局授予SpaceX公司一份合同,开发星际飞船月球载人着陆系统(HLS),将宇航员送上月球,作为阿尔忒弥斯计划的一部分,该计划将发射第一个女性和下一个男性宇航员到月球。这将是穿越北京中轴线北京有一条古老的线诉说着这座城700多年的生长历程它就是北京中轴线北京传统中轴线长7。8公里肇始于元代大都那时,这条线便确立了北京城中轴明显左右对称层次分明的城市布局让我们从北向南耐克新品!AJ37曝新配色,Jordan团队鞋有点丑,拖鞋设计不如国产好久没和大家聊耐克的新品了,最近品牌的产品还挺多的,篮球鞋方面有亮眼的表现,休闲鞋这块也开始发力了,能盖过国产的风头么?联名款也有一些产品亮相,总体看点还是不错的,世界第一大运动品轻薄高颜值,三款手机重量均未超180g,体验不摆烂手机行业发展到今天,用户的需求也发生了不小的改变,功能丰富性能强,成为了大部分人的追求,反而是一些能够影响到体验的细节,逐步被用户所抛弃。比如能够影响手机握持感的重量与厚度,影响心中亚重量级的希望之星贾洛洛夫,期待在周末比赛中再次击倒对手来自乌兹别克斯坦的著名重量级拳手巴赫迪尔贾洛洛夫(BakhodirJalolov)已经击倒了自己职业生涯中遇到的前10个职业拳击对手。这位2021年东京奥运会金牌得主作为职业选手在中科云图让变电站巡检变得更轻松变电站设备设施布局紧凑复杂,呈高低布局,检查范围广,点位多。目前主要的巡检方式有人工巡检巡检机器人巡检固定式监控装置巡检等。人工巡检存在工作量大效率低人身安全隐患等问题,机器人巡检如何用自动化测试搞垮团队自动化测试是大家非常熟悉的测试手段,近年来随着行业内卷越来越严重,对于测试工程师的岗位要求也水涨船高。如果你有留意一些测试工程师岗位的招聘要求,你就会了解很多细节,自动化测试技术已施一公等团队登Science封面AI与冷冻电镜揭示原子级NPC结构机器之心报道编辑杜伟陈萍今日,Science杂志以封面专题的形式发表了5篇论文,共同展现了通过AI技术来揭示人类和非洲爪蟾的核孔复合体(NPC)结构。开始正文之前,我们先来看一张图