1 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** 2 * Qwt Widget Library 3 * Copyright (C) 1997 Josef Wilgen 4 * Copyright (C) 2002 Uwe Rathmann 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the Qwt License, Version 1.0 8 *****************************************************************************/ 9 10 #ifndef QWT_PLOT_CANVAS_H 11 #define QWT_PLOT_CANVAS_H 12 13 #include "qwt_global.h" 14 #include <qframe.h> 15 #include <qpainterpath.h> 16 17 class QwtPlot; 18 class QPixmap; 19 20 /*! 21 \brief Canvas of a QwtPlot. 22 23 Canvas is the widget where all plot items are displayed 24 25 \sa QwtPlot::setCanvas(), QwtPlotGLCanvas 26 */ 27 class QWT_EXPORT QwtPlotCanvas : public QFrame 28 { 29 Q_OBJECT 30 31 Q_PROPERTY( double borderRadius READ borderRadius WRITE setBorderRadius ) 32 33 public: 34 35 /*! 36 \brief Paint attributes 37 38 The default setting enables BackingStore and Opaque. 39 40 \sa setPaintAttribute(), testPaintAttribute() 41 */ 42 enum PaintAttribute 43 { 44 /*! 45 \brief Paint double buffered reusing the content 46 of the pixmap buffer when possible. 47 48 Using a backing store might improve the performance 49 significantly, when working with widget overlays ( like rubber bands ). 50 Disabling the cache might improve the performance for 51 incremental paints (using QwtPlotDirectPainter ). 52 53 \sa backingStore(), invalidateBackingStore() 54 */ 55 BackingStore = 1, 56 57 /*! 58 \brief Try to fill the complete contents rectangle 59 of the plot canvas 60 61 When using styled backgrounds Qt assumes, that the 62 canvas doesn't fill its area completely 63 ( f.e because of rounded borders ) and fills the area 64 below the canvas. When this is done with gradients it might 65 result in a serious performance bottleneck - depending on the size. 66 67 When the Opaque attribute is enabled the canvas tries to 68 identify the gaps with some heuristics and to fill those only. 69 70 \warning Will not work for semitransparent backgrounds 71 */ 72 Opaque = 2, 73 74 /*! 75 \brief Try to improve painting of styled backgrounds 76 77 QwtPlotCanvas supports the box model attributes for 78 customizing the layout with style sheets. Unfortunately 79 the design of Qt style sheets has no concept how to 80 handle backgrounds with rounded corners - beside of padding. 81 82 When HackStyledBackground is enabled the plot canvas tries 83 to separate the background from the background border 84 by reverse engineering to paint the background before and 85 the border after the plot items. In this order the border 86 gets perfectly antialiased and you can avoid some pixel 87 artifacts in the corners. 88 */ 89 HackStyledBackground = 4, 90 91 /*! 92 When ImmediatePaint is set replot() calls repaint() 93 instead of update(). 94 95 \sa replot(), QWidget::repaint(), QWidget::update() 96 */ 97 ImmediatePaint = 8 98 }; 99 100 //! Paint attributes 101 typedef QFlags<PaintAttribute> PaintAttributes; 102 103 /*! 104 \brief Focus indicator 105 The default setting is NoFocusIndicator 106 \sa setFocusIndicator(), focusIndicator(), drawFocusIndicator() 107 */ 108 109 enum FocusIndicator 110 { 111 //! Don't paint a focus indicator 112 NoFocusIndicator, 113 114 /*! 115 The focus is related to the complete canvas. 116 Paint the focus indicator using drawFocusIndicator() 117 */ 118 CanvasFocusIndicator, 119 120 /*! 121 The focus is related to an item (curve, point, ...) on 122 the canvas. It is up to the application to display a 123 focus indication using f.e. highlighting. 124 */ 125 ItemFocusIndicator 126 }; 127 128 explicit QwtPlotCanvas( QwtPlot * = NULL ); 129 virtual ~QwtPlotCanvas(); 130 131 QwtPlot *plot(); 132 const QwtPlot *plot() const; 133 134 void setFocusIndicator( FocusIndicator ); 135 FocusIndicator focusIndicator() const; 136 137 void setBorderRadius( double ); 138 double borderRadius() const; 139 140 void setPaintAttribute( PaintAttribute, bool on = true ); 141 bool testPaintAttribute( PaintAttribute ) const; 142 143 const QPixmap *backingStore() const; 144 void invalidateBackingStore(); 145 146 virtual bool event( QEvent * ); 147 148 Q_INVOKABLE QPainterPath borderPath( const QRect & ) const; 149 150 public Q_SLOTS: 151 void replot(); 152 153 protected: 154 virtual void paintEvent( QPaintEvent * ); 155 virtual void resizeEvent( QResizeEvent * ); 156 157 virtual void drawFocusIndicator( QPainter * ); 158 virtual void drawBorder( QPainter * ); 159 160 void updateStyleSheetInfo(); 161 162 private: 163 void drawCanvas( QPainter *, bool withBackground ); 164 165 class PrivateData; 166 PrivateData *d_data; 167 }; 168 169 Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCanvas::PaintAttributes ) 170 171 #endif 172