双缓冲技术分析和总结.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Figure 5.7 Zooming in on the Plotter Widget /iamdbl/archive/2007/04/24/1583430.aspx Figure 5.7 Zooming in on the Plotter Widget 5-4 双缓冲技术(Double Buffering)(1、简介和源代码部分) 收藏 这一节实在是有些长,翻译完后统计了一下,快到 2w 字了。考虑到阅读的方便和网络的速度,打算把这节分为 5 个部分,第一部分为双缓冲技术的一个简介和所有的代码,如果能够看懂代码,不用看译文也就可以了。第二部分为 Plotter 控件的公有函数的实现,第三部分为 Plotter 的事件处理函数的实现,第四部分为 Plotter 控件的私有函数实现,第五部分为辅助类 PlotSettings 的实现。 这里给出一些常用的中英文对照(不一定准确,我这样用的): Rubber band(橡皮筋线,或者橡皮线), pixmap(图像,双缓冲中用到的图像,有时也直呼 pixmap),off-screen pixmap (离线图像) Plot(plot,这一节实现的就是一个绘制曲线的控件 Plotter,有时原文也叫 plot,有点小名的意思,没有翻译,直接呼之) 废话少说,以下是译文: 双缓冲技术是 GUI 编程中常用的技术。所谓的双缓冲就是把需要绘制的控件保存到一个图像中,然后在把图像拷贝到需要绘制的控件上。在 Qt 的早期版本中,为了用户界面更加清爽,经常用这个技术来消除闪烁。 在 Qt4 中,QWidget 能够自动处理闪烁,因此我们不用再担心这个问题。尽管如此,如果控件绘制复杂且需要经常刷新,双缓冲技术还是很有用的。我们可以把控件永久保存在一个图像中,随时准备下一次绘制事件的到来,一旦接到一个控件的绘制事件,就把图片拷贝到控件上。如果我们要做的只是小范围的修改,这个技术更是尤为有用, 如要绘制一条橡皮筋线,就不必刷新整个控件了。 在本章的最后一节,我们实现的是一个叫做 Plotter 的自定义控件。这个控件使用了双缓冲技术,也涉及到了 Qt 编程的其他方面:如键盘的事件处理,布局和坐标系统。 Plotter 控件用来显示一条或者多条曲线,这些曲线由一组向量坐标表示。用户可以在显示的曲线上画一个橡皮筋线, Plotter 控件对橡皮筋线包围的区域进行放大。用户用鼠标左键在控件上选择一个点,然后拖动鼠标走到另一点,然后释放鼠标,就在控件上绘制一条橡皮筋线。 用户可以多次用橡皮筋线进行放大,也可以用 ZoomOut 按钮缩小,然后用 ZoomIn 按钮再放大。ZoomOut 和 ZoomIn 按钮只是在控件第一次放大或者缩小操作后变得可见,如果用户不缩放图形,则这两个按钮会一直不可见,这样可以使绘图区域不那么混乱。 Plotter 控件可以存储任何数量的曲线的数据。同时它还维护一个 PlotSettings 对象的堆栈区域,每一个 PlotSettings 对象都是对应一个特定的放缩值。 首先看一下头文件的代码(对头文件的解析在代码中用注释的形式给出): #ifndef PLOTTER_H #define PLOTTER_H #include QMap//包含的 Qt 的头文件 #include QPixmap #include QVector #include QWidget class QToolButton; //两个前向声明 class PlotSettings; class Plotter : public QWidget { Q_OBJECT public: Plotter(QWidget *parent = 0); void setPlotSettings(const PlotSettings settings); void setCurveData(int id, const QVectorQPointF data); void clearCurve(int id); QSize minimumSizeHint() const; //重写 QWidget::minimumSizeHint() QSize sizeHint() const; //重写 QWidget::sizeHint() public slots: void zoomIn(); // 放 大 曲 线 void zoomOut(); //缩小显示曲线protected: //重写的事件处理函数void paintEvent(QPaintEvent *event); void resizeEvent(QResizeEvent *event); void mousePressEvent(QMouseEvent *ev

文档评论(0)

tianya189 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地湖北
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档