diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2011-07-10 15:24:15 -0500 |
---|---|---|
committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2011-07-10 15:24:15 -0500 |
commit | bd0f3345a938b35ce6a12f6150373b0955b8dd12 (patch) | |
tree | 7a520322212d48ebcb9fbe1087e7fca28b76185c /doc/html/canvas-chart-example.html | |
download | qt3-bd0f3345a938b35ce6a12f6150373b0955b8dd12.tar.gz qt3-bd0f3345a938b35ce6a12f6150373b0955b8dd12.zip |
Add Qt3 development HEAD version
Diffstat (limited to 'doc/html/canvas-chart-example.html')
-rw-r--r-- | doc/html/canvas-chart-example.html | 814 |
1 files changed, 814 insertions, 0 deletions
diff --git a/doc/html/canvas-chart-example.html b/doc/html/canvas-chart-example.html new file mode 100644 index 0000000..bc91349 --- /dev/null +++ b/doc/html/canvas-chart-example.html @@ -0,0 +1,814 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<!-- /home/espenr/tmp/qt-3.3.8-espenr-2499/qt-x11-free-3.3.8/examples/chart/chart.doc:1 --> +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> +<title>A Complete Canvas Application</title> +<style type="text/css"><!-- +fn { margin-left: 1cm; text-indent: -1cm; } +a:link { color: #004faf; text-decoration: none } +a:visited { color: #672967; text-decoration: none } +body { background: #ffffff; color: black; } +--></style> +</head> +<body> + +<table border="0" cellpadding="0" cellspacing="0" width="100%"> +<tr bgcolor="#E5E5E5"> +<td valign=center> + <a href="index.html"> +<font color="#004faf">Home</font></a> + | <a href="classes.html"> +<font color="#004faf">All Classes</font></a> + | <a href="mainclasses.html"> +<font color="#004faf">Main Classes</font></a> + | <a href="annotated.html"> +<font color="#004faf">Annotated</font></a> + | <a href="groups.html"> +<font color="#004faf">Grouped Classes</font></a> + | <a href="functions.html"> +<font color="#004faf">Functions</font></a> +</td> +<td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table><h1 align=center>A Complete Canvas Application</h1> + + + +<p> +<p> This is a complete example program with a main window, menus and +toolbars. The main widget is a <a href="qcanvas.html">QCanvas</a>, and this example +demonstrates basic canvas usage. + +<p> <hr> +<p> Project file: +<p> <pre>TEMPLATE = app + +CONFIG += warn_on + +REQUIRES = full-config + +HEADERS += element.h \ + canvastext.h \ + canvasview.h \ + chartform.h \ + optionsform.h \ + setdataform.h +SOURCES += element.cpp \ + canvasview.cpp \ + chartform.cpp \ + chartform_canvas.cpp \ + chartform_files.cpp \ + optionsform.cpp \ + setdataform.cpp \ + main.cpp +</pre> + +<p> <hr> +<p> Header files: +<p> <pre>#ifndef ELEMENT_H +#define ELEMENT_H + +#include <<a href="qcolor-h.html">qcolor.h</a>> +#include <<a href="qnamespace-h.html">qnamespace.h</a>> +#include <<a href="qstring-h.html">qstring.h</a>> +#include <<a href="qvaluevector-h.html">qvaluevector.h</a>> + +class Element; + +typedef QValueVector<Element> ElementVector; + +/* + Elements are valid if they have a value which is > EPSILON. +*/ +const double EPSILON = 0.0000001; // Must be > INVALID. + + +class Element +{ +public: + enum { INVALID = -1 }; + enum { NO_PROPORTION = -1 }; + enum { MAX_PROPOINTS = 3 }; // One proportional point per chart type + + Element( double value = INVALID, QColor valueColor = Qt::gray, + int valuePattern = Qt::SolidPattern, + const <a href="qstring.html">QString</a>& label = <a href="qstring.html#QString-null">QString::null</a>, + <a href="qcolor.html">QColor</a> labelColor = Qt::black ) { + init( value, valueColor, valuePattern, label, labelColor ); + for ( int i = 0; i < MAX_PROPOINTS * 2; ++i ) + m_propoints[i] = NO_PROPORTION; + } + ~Element() {} + + bool isValid() const { return m_value > EPSILON; } + + double value() const { return m_value; } + <a href="qcolor.html">QColor</a> valueColor() const { return m_valueColor; } + int valuePattern() const { return m_valuePattern; } + <a href="qstring.html">QString</a> label() const { return m_label; } + <a href="qcolor.html">QColor</a> labelColor() const { return m_labelColor; } + double proX( int index ) const; + double proY( int index ) const; + + void set( double value = INVALID, QColor valueColor = Qt::gray, + int valuePattern = Qt::SolidPattern, + const <a href="qstring.html">QString</a>& label = QString::null, + <a href="qcolor.html">QColor</a> labelColor = Qt::black ) { + init( value, valueColor, valuePattern, label, labelColor ); + } + void setValue( double value ) { m_value = value; } + void setValueColor( <a href="qcolor.html">QColor</a> valueColor ) { m_valueColor = valueColor; } + void setValuePattern( int valuePattern ); + void setLabel( const <a href="qstring.html">QString</a>& label ) { m_label = label; } + void setLabelColor( <a href="qcolor.html">QColor</a> labelColor ) { m_labelColor = labelColor; } + void setProX( int index, double value ); + void setProY( int index, double value ); + +#ifdef Q_FULL_TEMPLATE_INSTANTIATION + // xlC 3.x workaround + Q_DUMMY_COMPARISON_OPERATOR(Element) + bool operator!=( const Element& e) const { + return ( !(e == *this) ); + } +#endif + +private: + void init( double value, QColor valueColor, int valuePattern, + const <a href="qstring.html">QString</a>& label, QColor labelColor ); + + double m_value; + <a href="qcolor.html">QColor</a> m_valueColor; + int m_valuePattern; + <a href="qstring.html">QString</a> m_label; + <a href="qcolor.html">QColor</a> m_labelColor; + double m_propoints[2 * MAX_PROPOINTS]; +}; + + +QTextStream &operator<<( <a href="qtextstream.html">QTextStream</a>&, const Element& ); +QTextStream &operator>>( <a href="qtextstream.html">QTextStream</a>&, Element& ); + +#endif +</pre> + +<pre>#ifndef CHARTFORM_H +#define CHARTFORM_H + +#include "element.h" + +#include <<a href="qmainwindow-h.html">qmainwindow.h</a>> +#include <<a href="qstringlist-h.html">qstringlist.h</a>> + + +class CanvasView; + +class QAction; +class QCanvas; +class QFont; +class QPrinter; +class QString; + + +class ChartForm: public <a href="qmainwindow.html">QMainWindow</a> +{ + <a href="metaobjects.html#Q_OBJECT">Q_OBJECT</a> +public: + enum { MAX_ELEMENTS = 100 }; + enum { MAX_RECENTFILES = 9 }; // Must not exceed 9 + enum ChartType { PIE, VERTICAL_BAR, HORIZONTAL_BAR }; + enum AddValuesType { NO, YES, AS_PERCENTAGE }; + + ChartForm( const <a href="qstring.html">QString</a>& filename ); + ~ChartForm(); + + int chartType() { return m_chartType; } + void setChanged( bool changed = TRUE ) { m_changed = changed; } + void drawElements(); + + <a href="qpopupmenu.html">QPopupMenu</a> *optionsMenu; // Why public? See canvasview.cpp + +protected: + virtual void closeEvent( <a href="qcloseevent.html">QCloseEvent</a> * ); + +private slots: + void fileNew(); + void fileOpen(); + void fileOpenRecent( int index ); + void fileSave(); + void fileSaveAs(); + void fileSaveAsPixmap(); + void filePrint(); + void fileQuit(); + void optionsSetData(); + void updateChartType( <a href="qaction.html">QAction</a> *action ); + void optionsSetFont(); + void optionsSetOptions(); + void helpHelp(); + void helpAbout(); + void helpAboutQt(); + void saveOptions(); + +private: + void init(); + void load( const <a href="qstring.html">QString</a>& filename ); + bool okToClear(); + void drawPieChart( const double scales[], double total, int count ); + void drawVerticalBarChart( const double scales[], double total, int count ); + void drawHorizontalBarChart( const double scales[], double total, int count ); + + <a href="qstring.html">QString</a> valueLabel( const <a href="qstring.html">QString</a>& label, double value, double total ); + void updateRecentFiles( const <a href="qstring.html">QString</a>& filename ); + void updateRecentFilesMenu(); + void setChartType( ChartType chartType ); + + <a href="qpopupmenu.html">QPopupMenu</a> *fileMenu; + <a href="qaction.html">QAction</a> *optionsPieChartAction; + <a href="qaction.html">QAction</a> *optionsHorizontalBarChartAction; + <a href="qaction.html">QAction</a> *optionsVerticalBarChartAction; + + + <a href="qstring.html">QString</a> m_filename; + <a href="qstringlist.html">QStringList</a> m_recentFiles; + <a href="qcanvas.html">QCanvas</a> *m_canvas; + CanvasView *m_canvasView; + bool m_changed; + ElementVector m_elements; + <a href="qprinter.html">QPrinter</a> *m_printer; + ChartType m_chartType; + AddValuesType m_addValues; + int m_decimalPlaces; + <a href="qfont.html">QFont</a> m_font; +}; + +#endif +</pre> + +<p> <hr> +<p> Implementation: +<p> <pre>#include "canvasview.h" +#include "chartform.h" +#include "optionsform.h" +#include "setdataform.h" + +#include <<a href="qaction-h.html">qaction.h</a>> +#include <<a href="qapplication-h.html">qapplication.h</a>> +#include <<a href="qcombobox-h.html">qcombobox.h</a>> +#include <<a href="qfile-h.html">qfile.h</a>> +#include <<a href="qfiledialog-h.html">qfiledialog.h</a>> +#include <<a href="qfont-h.html">qfont.h</a>> +#include <<a href="qfontdialog-h.html">qfontdialog.h</a>> +#include <<a href="qmenubar-h.html">qmenubar.h</a>> +#include <<a href="qmessagebox-h.html">qmessagebox.h</a>> +#include <<a href="qpixmap-h.html">qpixmap.h</a>> +#include <<a href="qpopupmenu-h.html">qpopupmenu.h</a>> +#include <<a href="qprinter-h.html">qprinter.h</a>> +#include <<a href="qradiobutton-h.html">qradiobutton.h</a>> +#include <<a href="qsettings-h.html">qsettings.h</a>> +#include <<a href="qspinbox-h.html">qspinbox.h</a>> +#include <<a href="qstatusbar-h.html">qstatusbar.h</a>> +#include <<a href="qtoolbar-h.html">qtoolbar.h</a>> +#include <<a href="qtoolbutton-h.html">qtoolbutton.h</a>> + +#include "images/file_new.xpm" +#include "images/file_open.xpm" +#include "images/file_save.xpm" +#include "images/file_print.xpm" +#include "images/options_setdata.xpm" +#include "images/options_setfont.xpm" +#include "images/options_setoptions.xpm" +#include "images/options_horizontalbarchart.xpm" +#include "images/options_piechart.xpm" +#include "images/options_verticalbarchart.xpm" + + +const <a href="qstring.html">QString</a> WINDOWS_REGISTRY = "/Trolltech/QtExamples"; +const <a href="qstring.html">QString</a> APP_KEY = "/Chart/"; + + +<a name="f596"></a>ChartForm::ChartForm( const <a href="qstring.html">QString</a>& filename ) + : <a href="qmainwindow.html">QMainWindow</a>( 0, 0, WDestructiveClose ) +{ + <a href="qwidget.html#setIcon">setIcon</a>( QPixmap( options_piechart ) ); + + <a href="qaction.html">QAction</a> *fileNewAction; + <a href="qaction.html">QAction</a> *fileOpenAction; + <a href="qaction.html">QAction</a> *fileSaveAction; + <a href="qaction.html">QAction</a> *fileSaveAsAction; + <a href="qaction.html">QAction</a> *fileSaveAsPixmapAction; + <a href="qaction.html">QAction</a> *filePrintAction; + <a href="qaction.html">QAction</a> *fileQuitAction; + <a href="qaction.html">QAction</a> *optionsSetDataAction; + <a href="qaction.html">QAction</a> *optionsSetFontAction; + <a href="qaction.html">QAction</a> *optionsSetOptionsAction; + + fileNewAction = new <a href="qaction.html">QAction</a>( + "New Chart", QPixmap( file_new ), + "&New", CTRL+Key_N, this, "new" ); +<a name="x2869"></a> <a href="qobject.html#connect">connect</a>( fileNewAction, SIGNAL( <a href="qaction.html#activated">activated</a>() ), this, SLOT( fileNew() ) ); + + fileOpenAction = new <a href="qaction.html">QAction</a>( + "Open Chart", QPixmap( file_open ), + "&Open...", CTRL+Key_O, this, "open" ); + <a href="qobject.html#connect">connect</a>( fileOpenAction, SIGNAL( <a href="qaction.html#activated">activated</a>() ), this, SLOT( fileOpen() ) ); + + fileSaveAction = new <a href="qaction.html">QAction</a>( + "Save Chart", QPixmap( file_save ), + "&Save", CTRL+Key_S, this, "save" ); + <a href="qobject.html#connect">connect</a>( fileSaveAction, SIGNAL( <a href="qaction.html#activated">activated</a>() ), this, SLOT( fileSave() ) ); + + fileSaveAsAction = new <a href="qaction.html">QAction</a>( + "Save Chart As", QPixmap( file_save ), + "Save &As...", 0, this, "save as" ); + <a href="qobject.html#connect">connect</a>( fileSaveAsAction, SIGNAL( <a href="qaction.html#activated">activated</a>() ), + this, SLOT( fileSaveAs() ) ); + + fileSaveAsPixmapAction = new <a href="qaction.html">QAction</a>( + "Save Chart As Bitmap", QPixmap( file_save ), + "Save As &Bitmap...", CTRL+Key_B, this, "save as bitmap" ); + <a href="qobject.html#connect">connect</a>( fileSaveAsPixmapAction, SIGNAL( <a href="qaction.html#activated">activated</a>() ), + this, SLOT( fileSaveAsPixmap() ) ); + + filePrintAction = new <a href="qaction.html">QAction</a>( + "Print Chart", QPixmap( file_print ), + "&Print Chart...", CTRL+Key_P, this, "print chart" ); + <a href="qobject.html#connect">connect</a>( filePrintAction, SIGNAL( <a href="qaction.html#activated">activated</a>() ), + this, SLOT( filePrint() ) ); + + optionsSetDataAction = new <a href="qaction.html">QAction</a>( + "Set Data", QPixmap( options_setdata ), + "Set &Data...", CTRL+Key_D, this, "set data" ); + <a href="qobject.html#connect">connect</a>( optionsSetDataAction, SIGNAL( <a href="qaction.html#activated">activated</a>() ), + this, SLOT( optionsSetData() ) ); + + + <a href="qactiongroup.html">QActionGroup</a> *chartGroup = new <a href="qactiongroup.html">QActionGroup</a>( this ); // Connected later +<a name="x2874"></a> chartGroup-><a href="qactiongroup.html#setExclusive">setExclusive</a>( TRUE ); + + optionsPieChartAction = new <a href="qaction.html">QAction</a>( + "Pie Chart", QPixmap( options_piechart ), + "&Pie Chart", CTRL+Key_I, chartGroup, "pie chart" ); +<a name="x2872"></a> optionsPieChartAction-><a href="qaction.html#setToggleAction">setToggleAction</a>( TRUE ); + + optionsHorizontalBarChartAction = new <a href="qaction.html">QAction</a>( + "Horizontal Bar Chart", QPixmap( options_horizontalbarchart ), + "&Horizontal Bar Chart", CTRL+Key_H, chartGroup, + "horizontal bar chart" ); + optionsHorizontalBarChartAction-><a href="qaction.html#setToggleAction">setToggleAction</a>( TRUE ); + + optionsVerticalBarChartAction = new <a href="qaction.html">QAction</a>( + "Vertical Bar Chart", QPixmap( options_verticalbarchart ), + "&Vertical Bar Chart", CTRL+Key_V, chartGroup, "Vertical bar chart" ); + optionsVerticalBarChartAction-><a href="qaction.html#setToggleAction">setToggleAction</a>( TRUE ); + + + optionsSetFontAction = new <a href="qaction.html">QAction</a>( + "Set Font", QPixmap( options_setfont ), + "Set &Font...", CTRL+Key_F, this, "set font" ); + <a href="qobject.html#connect">connect</a>( optionsSetFontAction, SIGNAL( <a href="qaction.html#activated">activated</a>() ), + this, SLOT( optionsSetFont() ) ); + + optionsSetOptionsAction = new <a href="qaction.html">QAction</a>( + "Set Options", QPixmap( options_setoptions ), + "Set &Options...", 0, this, "set options" ); + <a href="qobject.html#connect">connect</a>( optionsSetOptionsAction, SIGNAL( <a href="qaction.html#activated">activated</a>() ), + this, SLOT( optionsSetOptions() ) ); + + fileQuitAction = new <a href="qaction.html">QAction</a>( "Quit", "&Quit", CTRL+Key_Q, this, "quit" ); + <a href="qobject.html#connect">connect</a>( fileQuitAction, SIGNAL( <a href="qaction.html#activated">activated</a>() ), this, SLOT( fileQuit() ) ); + + + <a href="qtoolbar.html">QToolBar</a>* fileTools = new <a href="qtoolbar.html">QToolBar</a>( this, "file operations" ); +<a name="x2895"></a> fileTools-><a href="qtoolbar.html#setLabel">setLabel</a>( "File Operations" ); +<a name="x2870"></a> fileNewAction-><a href="qaction.html#addTo">addTo</a>( fileTools ); + fileOpenAction-><a href="qaction.html#addTo">addTo</a>( fileTools ); + fileSaveAction-><a href="qaction.html#addTo">addTo</a>( fileTools ); +<a name="x2894"></a> fileTools-><a href="qtoolbar.html#addSeparator">addSeparator</a>(); + filePrintAction-><a href="qaction.html#addTo">addTo</a>( fileTools ); + + <a href="qtoolbar.html">QToolBar</a> *optionsTools = new <a href="qtoolbar.html">QToolBar</a>( this, "options operations" ); + optionsTools-><a href="qtoolbar.html#setLabel">setLabel</a>( "Options Operations" ); + optionsSetDataAction-><a href="qaction.html#addTo">addTo</a>( optionsTools ); + optionsTools-><a href="qtoolbar.html#addSeparator">addSeparator</a>(); + optionsPieChartAction-><a href="qaction.html#addTo">addTo</a>( optionsTools ); + optionsHorizontalBarChartAction-><a href="qaction.html#addTo">addTo</a>( optionsTools ); + optionsVerticalBarChartAction-><a href="qaction.html#addTo">addTo</a>( optionsTools ); + optionsTools-><a href="qtoolbar.html#addSeparator">addSeparator</a>(); + optionsSetFontAction-><a href="qaction.html#addTo">addTo</a>( optionsTools ); + optionsTools-><a href="qtoolbar.html#addSeparator">addSeparator</a>(); + optionsSetOptionsAction-><a href="qaction.html#addTo">addTo</a>( optionsTools ); + + fileMenu = new <a href="qpopupmenu.html">QPopupMenu</a>( this ); + <a href="qmainwindow.html#menuBar">menuBar</a>()->insertItem( "&File", fileMenu ); + fileNewAction-><a href="qaction.html#addTo">addTo</a>( fileMenu ); + fileOpenAction-><a href="qaction.html#addTo">addTo</a>( fileMenu ); + fileSaveAction-><a href="qaction.html#addTo">addTo</a>( fileMenu ); + fileSaveAsAction-><a href="qaction.html#addTo">addTo</a>( fileMenu ); + fileMenu-><a href="qmenudata.html#insertSeparator">insertSeparator</a>(); + fileSaveAsPixmapAction-><a href="qaction.html#addTo">addTo</a>( fileMenu ); + fileMenu-><a href="qmenudata.html#insertSeparator">insertSeparator</a>(); + filePrintAction-><a href="qaction.html#addTo">addTo</a>( fileMenu ); + fileMenu-><a href="qmenudata.html#insertSeparator">insertSeparator</a>(); + fileQuitAction-><a href="qaction.html#addTo">addTo</a>( fileMenu ); + + optionsMenu = new <a href="qpopupmenu.html">QPopupMenu</a>( this ); + <a href="qmainwindow.html#menuBar">menuBar</a>()->insertItem( "&Options", optionsMenu ); + optionsSetDataAction-><a href="qaction.html#addTo">addTo</a>( optionsMenu ); + optionsMenu-><a href="qmenudata.html#insertSeparator">insertSeparator</a>(); + optionsPieChartAction-><a href="qaction.html#addTo">addTo</a>( optionsMenu ); + optionsHorizontalBarChartAction-><a href="qaction.html#addTo">addTo</a>( optionsMenu ); + optionsVerticalBarChartAction-><a href="qaction.html#addTo">addTo</a>( optionsMenu ); + optionsMenu-><a href="qmenudata.html#insertSeparator">insertSeparator</a>(); + optionsSetFontAction-><a href="qaction.html#addTo">addTo</a>( optionsMenu ); + optionsMenu-><a href="qmenudata.html#insertSeparator">insertSeparator</a>(); + optionsSetOptionsAction-><a href="qaction.html#addTo">addTo</a>( optionsMenu ); + + <a href="qmainwindow.html#menuBar">menuBar</a>()->insertSeparator(); + + <a href="qpopupmenu.html">QPopupMenu</a> *helpMenu = new <a href="qpopupmenu.html">QPopupMenu</a>( this ); + <a href="qmainwindow.html#menuBar">menuBar</a>()->insertItem( "&Help", helpMenu ); + helpMenu-><a href="qmenudata.html#insertItem">insertItem</a>( "&Help", this, SLOT(helpHelp()), Key_F1 ); + helpMenu-><a href="qmenudata.html#insertItem">insertItem</a>( "&About", this, SLOT(helpAbout()) ); + helpMenu-><a href="qmenudata.html#insertItem">insertItem</a>( "About &Qt", this, SLOT(helpAboutQt()) ); + + + m_printer = 0; + m_elements.resize( MAX_ELEMENTS ); + + <a href="qsettings.html">QSettings</a> settings; +<a name="x2890"></a> settings.<a href="qsettings.html#insertSearchPath">insertSearchPath</a>( QSettings::Windows, WINDOWS_REGISTRY ); + int windowWidth = settings.<a href="qsettings.html#readNumEntry">readNumEntry</a>( APP_KEY + "WindowWidth", 460 ); + int windowHeight = settings.<a href="qsettings.html#readNumEntry">readNumEntry</a>( APP_KEY + "WindowHeight", 530 ); + int windowX = settings.<a href="qsettings.html#readNumEntry">readNumEntry</a>( APP_KEY + "WindowX", -1 ); + int windowY = settings.<a href="qsettings.html#readNumEntry">readNumEntry</a>( APP_KEY + "WindowY", -1 ); + setChartType( ChartType( + settings.<a href="qsettings.html#readNumEntry">readNumEntry</a>( APP_KEY + "ChartType", int(PIE) ) ) ); + m_addValues = AddValuesType( + settings.<a href="qsettings.html#readNumEntry">readNumEntry</a>( APP_KEY + "AddValues", int(NO) )); + m_decimalPlaces = settings.<a href="qsettings.html#readNumEntry">readNumEntry</a>( APP_KEY + "Decimals", 2 ); + m_font = QFont( "Helvetica", 18, QFont::Bold ); + m_font.fromString( + settings.<a href="qsettings.html#readEntry">readEntry</a>( APP_KEY + "Font", m_font.toString() ) ); + for ( int i = 0; i < MAX_RECENTFILES; ++i ) { + <a href="qstring.html">QString</a> filename = settings.<a href="qsettings.html#readEntry">readEntry</a>( APP_KEY + "File" + +<a name="x2893"></a> QString::<a href="qstring.html#number">number</a>( i + 1 ) ); +<a name="x2892"></a> if ( !filename.<a href="qstring.html#isEmpty">isEmpty</a>() ) + m_recentFiles.push_back( filename ); + } + if ( m_recentFiles.count() ) + updateRecentFilesMenu(); + + + // Connect *after* we've set the chart type on so we don't call + // drawElements() prematurely. +<a name="x2873"></a> <a href="qobject.html#connect">connect</a>( chartGroup, SIGNAL( <a href="qactiongroup.html#selected">selected</a>(QAction*) ), + this, SLOT( updateChartType(QAction*) ) ); + + <a href="qwidget.html#resize">resize</a>( windowWidth, windowHeight ); + if ( windowX != -1 || windowY != -1 ) + <a href="qwidget.html#move">move</a>( windowX, windowY ); + + m_canvas = new <a href="qcanvas.html">QCanvas</a>( this ); +<a name="x2876"></a> m_canvas-><a href="qcanvas.html#resize">resize</a>( <a href="qwidget.html#width">width</a>(), height() ); + m_canvasView = new CanvasView( m_canvas, &m_elements, this ); + <a href="qmainwindow.html#setCentralWidget">setCentralWidget</a>( m_canvasView ); + m_canvasView-><a href="qwidget.html#show">show</a>(); + + if ( !filename.<a href="qstring.html#isEmpty">isEmpty</a>() ) + load( filename ); + else { + init(); + m_elements[0].set( 20, red, 14, "Red" ); + m_elements[1].set( 70, cyan, 2, "Cyan", darkGreen ); + m_elements[2].set( 35, blue, 11, "Blue" ); + m_elements[3].set( 55, yellow, 1, "Yellow", darkBlue ); + m_elements[4].set( 80, magenta, 1, "Magenta" ); + drawElements(); + } + + <a href="qmainwindow.html#statusBar">statusBar</a>()->message( "Ready", 2000 ); +} + + +ChartForm::~ChartForm() +{ + delete m_printer; +} + + +void <a name="f597"></a>ChartForm::init() +{ + <a href="qwidget.html#setCaption">setCaption</a>( "Chart" ); + m_filename = QString::null; + m_changed = FALSE; + + m_elements[0] = Element( Element::INVALID, red ); + m_elements[1] = Element( Element::INVALID, cyan ); + m_elements[2] = Element( Element::INVALID, blue ); + m_elements[3] = Element( Element::INVALID, yellow ); + m_elements[4] = Element( Element::INVALID, green ); + m_elements[5] = Element( Element::INVALID, magenta ); + m_elements[6] = Element( Element::INVALID, darkYellow ); + m_elements[7] = Element( Element::INVALID, darkRed ); + m_elements[8] = Element( Element::INVALID, darkCyan ); + m_elements[9] = Element( Element::INVALID, darkGreen ); + m_elements[10] = Element( Element::INVALID, darkMagenta ); + m_elements[11] = Element( Element::INVALID, darkBlue ); + for ( int i = 12; i < MAX_ELEMENTS; ++i ) { + double x = (double(i) / MAX_ELEMENTS) * 360; + int y = (int(x * 256) % 105) + 151; + int z = ((i * 17) % 105) + 151; + m_elements[i] = Element( Element::INVALID, QColor( int(x), y, z, QColor::Hsv ) ); + } +} + +<a name="x2896"></a>void ChartForm::<a href="qwidget.html#closeEvent">closeEvent</a>( <a href="qcloseevent.html">QCloseEvent</a> * ) +{ + fileQuit(); +} + + +void <a name="f598"></a>ChartForm::fileNew() +{ + if ( okToClear() ) { + init(); + drawElements(); + } +} + + +void <a name="f599"></a>ChartForm::fileOpen() +{ + if ( !okToClear() ) + return; + + <a href="qstring.html">QString</a> filename = QFileDialog::<a href="qfiledialog.html#getOpenFileName">getOpenFileName</a>( + QString::null, "Charts (*.cht)", this, + "file open", "Chart -- File Open" ); + if ( !filename.<a href="qstring.html#isEmpty">isEmpty</a>() ) + load( filename ); + else + <a href="qmainwindow.html#statusBar">statusBar</a>()->message( "File Open abandoned", 2000 ); +} + + +void <a name="f600"></a>ChartForm::fileSaveAs() +{ + <a href="qstring.html">QString</a> filename = QFileDialog::<a href="qfiledialog.html#getSaveFileName">getSaveFileName</a>( + QString::null, "Charts (*.cht)", this, + "file save as", "Chart -- File Save As" ); + if ( !filename.<a href="qstring.html#isEmpty">isEmpty</a>() ) { + int answer = 0; +<a name="x2878"></a> if ( QFile::<a href="qfile.html#exists">exists</a>( filename ) ) +<a name="x2889"></a> answer = QMessageBox::<a href="qmessagebox.html#warning">warning</a>( + this, "Chart -- Overwrite File", + QString( "Overwrite\n\'%1\'?" ). + arg( filename ), + "&Yes", "&No", QString::null, 1, 1 ); + if ( answer == 0 ) { + m_filename = filename; + updateRecentFiles( filename ); + fileSave(); + return; + } + } + <a href="qmainwindow.html#statusBar">statusBar</a>()->message( "Saving abandoned", 2000 ); +} + + +void <a name="f601"></a>ChartForm::fileOpenRecent( int index ) +{ + if ( !okToClear() ) + return; + + load( m_recentFiles[index] ); +} + + +void <a name="f602"></a>ChartForm::updateRecentFiles( const <a href="qstring.html">QString</a>& filename ) +{ + if ( m_recentFiles.find( filename ) != m_recentFiles.end() ) + return; + + m_recentFiles.push_back( filename ); + if ( m_recentFiles.count() > MAX_RECENTFILES ) + m_recentFiles.pop_front(); + + updateRecentFilesMenu(); +} + + +void <a name="f603"></a>ChartForm::updateRecentFilesMenu() +{ + for ( int i = 0; i < MAX_RECENTFILES; ++i ) { +<a name="x2882"></a> if ( fileMenu-><a href="qmenudata.html#findItem">findItem</a>( i ) ) +<a name="x2885"></a> fileMenu-><a href="qmenudata.html#removeItem">removeItem</a>( i ); + if ( i < int(m_recentFiles.count()) ) + fileMenu-><a href="qmenudata.html#insertItem">insertItem</a>( QString( "&%1 %2" ). + arg( i + 1 ).arg( m_recentFiles[i] ), + this, SLOT( fileOpenRecent(int) ), + 0, i ); + } +} + + +void <a name="f604"></a>ChartForm::fileQuit() +{ + if ( okToClear() ) { + saveOptions(); +<a name="x2875"></a> qApp-><a href="qapplication.html#exit">exit</a>( 0 ); + } +} + + +bool <a name="f605"></a>ChartForm::okToClear() +{ + if ( m_changed ) { + <a href="qstring.html">QString</a> msg; + if ( m_filename.isEmpty() ) + msg = "Unnamed chart "; + else + msg = QString( "Chart '%1'\n" ).arg( m_filename ); + msg += "has been changed."; + + int x = QMessageBox::<a href="qmessagebox.html#information">information</a>( this, "Chart -- Unsaved Changes", + msg, "&Save", "Cancel", "&Abandon", + 0, 1 ); + switch( x ) { + case 0: // Save + fileSave(); + break; + case 1: // Cancel + default: + return FALSE; + case 2: // Abandon + break; + } + } + + return TRUE; +} + + +void <a name="f606"></a>ChartForm::saveOptions() +{ + <a href="qsettings.html">QSettings</a> settings; + settings.<a href="qsettings.html#insertSearchPath">insertSearchPath</a>( QSettings::Windows, WINDOWS_REGISTRY ); +<a name="x2891"></a> settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "WindowWidth", width() ); + settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "WindowHeight", height() ); + settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "WindowX", x() ); + settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "WindowY", y() ); + settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "ChartType", int(m_chartType) ); + settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "AddValues", int(m_addValues) ); + settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "Decimals", m_decimalPlaces ); + settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "Font", m_font.toString() ); + for ( int i = 0; i < int(m_recentFiles.count()); ++i ) + settings.<a href="qsettings.html#writeEntry">writeEntry</a>( APP_KEY + "File" + QString::number( i + 1 ), + m_recentFiles[i] ); +} + + +void <a name="f607"></a>ChartForm::optionsSetData() +{ + SetDataForm *setDataForm = new SetDataForm( &m_elements, m_decimalPlaces, this ); +<a name="x2877"></a> if ( setDataForm-><a href="qdialog.html#exec">exec</a>() ) { + m_changed = TRUE; + drawElements(); + } + delete setDataForm; +} + + +void <a name="f608"></a>ChartForm::setChartType( ChartType chartType ) +{ + m_chartType = chartType; + switch ( m_chartType ) { + case PIE: +<a name="x2871"></a> optionsPieChartAction-><a href="qaction.html#setOn">setOn</a>( TRUE ); + break; + case VERTICAL_BAR: + optionsVerticalBarChartAction-><a href="qaction.html#setOn">setOn</a>( TRUE ); + break; + case HORIZONTAL_BAR: + optionsHorizontalBarChartAction-><a href="qaction.html#setOn">setOn</a>( TRUE ); + break; + } +} + + +void <a name="f609"></a>ChartForm::updateChartType( <a href="qaction.html">QAction</a> *action ) +{ + if ( action == optionsPieChartAction ) { + m_chartType = PIE; + } + else if ( action == optionsHorizontalBarChartAction ) { + m_chartType = HORIZONTAL_BAR; + } + else if ( action == optionsVerticalBarChartAction ) { + m_chartType = VERTICAL_BAR; + } + + drawElements(); +} + + +void <a name="f610"></a>ChartForm::optionsSetFont() +{ + bool ok; +<a name="x2881"></a> <a href="qfont.html">QFont</a> font = QFontDialog::<a href="qfontdialog.html#getFont">getFont</a>( &ok, m_font, this ); + if ( ok ) { + m_font = font; + drawElements(); + } +} + + +void <a name="f611"></a>ChartForm::optionsSetOptions() +{ + OptionsForm *optionsForm = new OptionsForm( this ); + optionsForm->chartTypeComboBox->setCurrentItem( m_chartType ); + optionsForm-><a href="qwidget.html#setFont">setFont</a>( m_font ); + switch ( m_addValues ) { + case NO: + optionsForm->noRadioButton->setChecked( TRUE ); + break; + case YES: + optionsForm->yesRadioButton->setChecked( TRUE ); + break; + case AS_PERCENTAGE: + optionsForm->asPercentageRadioButton->setChecked( TRUE ); + break; + } + optionsForm->decimalPlacesSpinBox->setValue( m_decimalPlaces ); + if ( optionsForm-><a href="qdialog.html#exec">exec</a>() ) { + setChartType( ChartType( + optionsForm->chartTypeComboBox->currentItem()) ); +<a name="x2897"></a> m_font = optionsForm-><a href="qwidget.html#font">font</a>(); + if ( optionsForm->noRadioButton->isChecked() ) + m_addValues = NO; + else if ( optionsForm->yesRadioButton->isChecked() ) + m_addValues = YES; + else if ( optionsForm->asPercentageRadioButton->isChecked() ) + m_addValues = AS_PERCENTAGE; + m_decimalPlaces = optionsForm->decimalPlacesSpinBox->value(); + drawElements(); + } + delete optionsForm; +} + + +void <a name="f612"></a>ChartForm::helpHelp() +{ + <a href="qmainwindow.html#statusBar">statusBar</a>()->message( "Help is not implemented yet", 2000 ); +} + + +void <a name="f613"></a>ChartForm::helpAbout() +{ +<a name="x2886"></a> QMessageBox::<a href="qmessagebox.html#about">about</a>( this, "Chart -- About", + "<center><h1><font color=blue>Chart<font></h1></center>" + "<p>Chart your data with <i>chart</i>.</p>" + ); +} + + +void <a name="f614"></a>ChartForm::helpAboutQt() +{ +<a name="x2887"></a> QMessageBox::<a href="qmessagebox.html#aboutQt">aboutQt</a>( this, "Chart -- About Qt" ); +} + +</pre> + +<p> <hr> +<p> Main: +<p> <pre>#include <<a href="qapplication-h.html">qapplication.h</a>> +#include "chartform.h" + + +int main( int argc, char *argv[] ) +{ + <a href="qapplication.html">QApplication</a> app( argc, argv ); + + <a href="qstring.html">QString</a> filename; +<a name="x2900"></a> if ( app.<a href="qapplication.html#argc">argc</a>() > 1 ) { +<a name="x2901"></a> filename = app.<a href="qapplication.html#argv">argv</a>()[1]; +<a name="x2904"></a> if ( !filename.<a href="qstring.html#endsWith">endsWith</a>( ".cht" ) ) + filename = QString::null; + } + + ChartForm *cf = new ChartForm( filename ); + app.<a href="qapplication.html#setMainWidget">setMainWidget</a>( cf ); + cf-><a href="qwidget.html#show">show</a>(); + + return app.<a href="qapplication.html#exec">exec</a>(); +} +</pre> + +<p> <p>See also <a href="step-by-step-examples.html">Step-by-step Examples</a>. + +<!-- eof --> +<p><address><hr><div align=center> +<table width=100% cellspacing=0 border=0><tr> +<td>Copyright © 2007 +<a href="troll.html">Trolltech</a><td align=center><a href="trademarks.html">Trademarks</a> +<td align=right><div align=right>Qt 3.3.8</div> +</table></div></address></body> +</html> |