(转)5.4 双缓冲技术(Double Buffering)-2

xiaoxiao2021-02-28  126

(转)5.4 双缓冲技术(Double Buffering)-2

标签: plotspreadsheetsignalqtresourcesinclude 1212人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: Qt(31) 作者同类文章 X #include <QtGui> #include <cmath> using namespace std; #include "plotter.h" 以上代码为文件的开头,在这里把std的名空间加入到当前的全局命名空间。这样在使用<cmath>里的函数时,就不用前缀std::了,如可以直接使用函数floor(),而不用写成std::floor()。   Plotter::Plotter(QWidget *parent) : QWidget(parent) {     setBackgroundRole(QPalette::Dark);     setAutoFillBackground(true);     setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);     setFocusPolicy(Qt::StrongFocus);     rubberBandIsShown = false;       zoomInButton = new QToolButton(this);     zoomInButton->setIcon(QIcon(":/images/zoomin.png"));     zoomInButton->adjustSize();     connect(zoomInButton, SIGNAL(clicked()), this, SLOT(zoomIn()));       zoomOutButton = new QToolButton(this);     zoomOutButton->setIcon(QIcon(":/images/zoomout.png"));     zoomOutButton->adjustSize();     connect(zoomOutButton, SIGNAL(clicked()), this, SLOT(zoomOut()));       setPlotSettings(PlotSettings()); } 在构造函数中,调用setBackGroundRole(QPalette::Dark),告诉QWidget使用模板的"dark"组成部分来清除控件,而不是用"window"部件。当对控件进行放大需要重新绘制时,在 paintEvent() 事件绘制新象素之前,提供给Qt一个缺省的颜色填充新的要显示的象素,为了能够使用这个机制,还调用了setAutoFillBackground(true),默认情况,子控件使用从父控件继承来的背景。 函数setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)让控件在水平和垂直两个方向上都可以进行伸缩。如果控件需要占据屏幕上很大的空间,经常设置这个属性。缺省的设置是两个方向都是QSizePolicy::Preferred,意思是控件的实际尺寸和它的sizeHint一致,控件最小只能缩小到它的最小的sizeHint,并能够无限放大。 调用setFocusPolicy(Qt::StrongFocus)可以使控件通过鼠标点击或者Tab键得到焦点。当 Plotter控件得到焦点时,它可以接受键盘敲击事件。Plotter控件能够理解一些键盘事件,如+放大,-为缩小,可以向上下左右滚动。 Figure 5.9. Scrolling the Plotter widget    在构造函数中,我们还创建了两个QToolButton,每一个按钮都有一个图标。点击这些图标可以放大或者缩小显示的图像。图标保存在资源文件中,任何程序如果要使用Plotter控件,需要在其.pro文件中添加资源条目: RESOURCES     = plotter.qrc 资源文件是一个XML格式的文本文件,和在Spreadsheet中使用的很像: <!DOCTYPE RCC><RCC version="1.0"> <qresource>     <file>images/zoomin.png</file>     <file>images/zoomout.png</file> </qresource> </RCC> 调用QToolButton::adjustSize()调整按钮的大小为它们的sizeHint。在这里按钮没放在布局中,反而我们在 Plotter的改变大小事件中手动定位按钮,由程序计算它们的位置。由于没有了布局管理,因为我们必须通过传递this指针给 QPushButton构造函数,来明确指定确定按钮的父控件。   调用setPlotSettings()函数用来完成控件的初始化。函数代码如下: void Plotter::setPlotSettings(const PlotSettings &settings) {     zoomStack.clear();     zoomStack.append(settings);     curZoom = 0;     zoomInButton->hide();     zoomOutButton->hide();     refreshPixmap(); } 函数setPlotSettings():指定 PlotSettings用于显示plot。它在 Plotter构造函数中调用,也可以被Plotter的用户调用。开始的时候,Plotter使用的是缺省的缩放值。用户进行放大一次,就创建一个新的 PlotSettings对象加入到缩放栈中。这个栈中有两个变量:        zoomStack是保存不同的缩放设置,类型为 QVector<PlotSettings>;        curZoom保存zoomStack中当前使用的PlotSettings的索引值。 调用setPlotSettings()后,zoomStack中只有一个对象,zoomIn和zoomOut按钮隐藏。如果在zoomIn()和zoomOut()槽中,调用了这两个按钮的show()函数,它们才能显示出来。(通常,调用父控件的show()函数就显示所有的子控件。但是如果我们显式调用了子控件的hide(),必须要显示调用其show()函数显示它,否则就会一直隐藏) 调用refreshPixmap()来更新显示。通常,我们调用update()就可以,这里有些不一样,因为我们要保持QPixmap一直最新的状态。更新了图片后,refreshPixmap()再调用update()把图片拷贝到控件上。 void Plotter::zoomOut() {     if (curZoom > 0) {         --curZoom;         zoomOutButton->setEnabled(curZoom > 0);         zoomInButton->setEnabled(true);         zoomInButton->show();         refreshPixmap();     } } 如果图片放大了,调用zoomOut()缩小它。它缩小比例系数,如果还能进一步缩小,zoomOut按钮一直有效。显示zoomIn按钮使之有效,调用refreshPixmap()刷新控件。 void Plotter::zoomIn() {     if (curZoom < zoomStack.count() - 1) {         ++curZoom;         zoomInButton->setEnabled(curZoom < zoomStack.count() - 1);         zoomOutButton->setEnabled(true);         zoomOutButton->show();         refreshPixmap();     } } 如果用户放大后又缩小控件,下一个放缩系数的PlotSettings就进入zoomStack。我们就可以再放大。另外,我们还可以用橡皮筋来放大。 槽zoomIn()增加 curZoom放缩系数并保存进zoomStack中,zoomIn按钮显示出来,只要能够放大,按钮会一直有效。同时显示zoomOut按钮使之有效状态。 void Plotter::setCurveData(int id, const QVector<QPointF> &data) {     curveMap[id] = data;     refreshPixmap(); } 函数setCurveData()设置一个指定id的曲线数据。如果 curveMap中有一个相同id的曲线,那么就用新的数据替代旧数据。否则,则往 curveMap插入一个新曲线。 curveMap的数据类型为QMap<int, QVector<QPointF> > void Plotter::clearCurve(int id) {     curveMap.remove(id);     refreshPixmap(); } 函数clearCurve()功能是从 curveMap中删除一个指定id的曲线。 QSize Plotter::minimumSizeHint() const {     return QSize(6 * Margin, 4 * Margin); } 函数minimumSizeHint()和sizeHint()很像,确定控件的理想的尺寸。minimumSizeHint()确定控件的最小尺寸。布局管理器排列控件时不会低于控件的最小尺寸。 由于Margin值为50,所以我们返回的值为300×200,包括四个边界的宽度和Plot本身。如果再小,尺寸太小Plot就不能正常显示了。 QSize Plotter::sizeHint() const {     return QSize(12 * Margin, 8 * Margin); } 在sizeHint()中,我们返回控件的理想尺寸,用Margin常数作为倍数,长宽的比例为3:2,与minimumSizeHint()中比例一致。 以上是 Plotter 的公有函数和槽函数。 顶 0 踩 0     上一篇(转)双缓冲技术1 下一篇(转)5.4 双缓冲技术(Double Buffering)-3

我的同类文章

Qt(31) http://blog.csdn.net •(转)利用Qt的qmake创建vc工程2009-08-28阅读1936 •(转)QT中画图方法的不同 2009-06-18阅读3727 •(转)5.4 双缓冲技术(Double Buffering)-42008-05-20阅读2422 •(转)双缓冲技术12008-05-20阅读1960 •(转)5.2从QWidget派生(Subclassing QWidget)2008-05-12阅读1249 •(转)QT事件机制2009-06-20阅读1630 •(转)5.4 双缓冲技术(Double Buffering)-52008-05-20阅读931 •(转)5.4 双缓冲技术(Double Buffering)-32008-05-20阅读1901 •(转) 5.3把自定义控件集成到Qt Designer中(Integrating Custom Widgets with Qt Designer)2008-05-12阅读4155 •(转)5.1自定义Qt控件(Customizing Qt Widgets)2008-05-12阅读1795 更多文章
转载请注明原文地址: https://www.6miu.com/read-27645.html

最新回复(0)